Skip to content

Commit b375843

Browse files
author
leelovejava
committed
update nosql之hbase
1 parent f6a9608 commit b375843

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+596
-12
lines changed

README.md

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,17 @@
1515

1616

1717
### 内容说明:
18-
本仓库存放的是公众号【狸猫技术窝】和**中华石杉**老师合作的课程《**互联网Java进阶面试训练营**》的笔记,版权归狸猫技术窝所有,侵权将追究法律责任
18+
本仓库存放的是公众号【儒猿技术窝】和**中华石杉**老师合作的课程《**互联网Java进阶面试训练营**》的笔记,版权归儒猿技术窝所有,侵权将追究法律责任
1919

20-
训练营详细信息请关注公众号【狸猫技术窝】了解
21-
### 公众号:狸猫技术窝
20+
训练营详细信息请关注公众号【儒猿技术窝】了解
2221

23-
更多技术干货,请扫描下方二维码,关注公众号狸猫技术窝
22+
### 公众号:儒猿技术窝
23+
24+
更多技术干货,请扫描下方二维码,关注公众号儒猿技术窝
2425

2526
![我的公众号](/images/limaojishuwo.jpeg)
2627

28+
![儒猿技术窝](https://apppukyptrl1086.pc.xiaoe-tech.com/index)
2729

2830

2931

@@ -366,21 +368,21 @@
366368

367369
### MySQl
368370

369-
- [57、你能说说事务的几个特性是啥?有哪几种隔离级别?(上)]()
371+
- [57、你能说说事务的几个特性是啥?有哪几种隔离级别?(上)](/docs/03/57.md)
370372

371-
- [58、你能说说事务的几个特性是啥?有哪几种隔离级别?(下)]()
373+
- [58、你能说说事务的几个特性是啥?有哪几种隔离级别?(下)](/docs/03/58.md)
372374

373-
- [59、你能说说MySQL数据库锁的实现原理吗?如果死锁了咋办?]()
375+
- [59、你能说说MySQL数据库锁的实现原理吗?如果死锁了咋办?](/docs/03/59.md)
374376

375-
- [60、MySQL的SQL调优一般都有哪些手段?你们一般怎么做?]()
377+
- [60、MySQL的SQL调优一般都有哪些手段?你们一般怎么做?](/docs/03/60.md)
376378

377-
- [61、聊聊Socket的工作原理?Socket跟TCP IP之间是啥关系?]()
379+
- [61、聊聊Socket的工作原理?Socket跟TCP IP之间是啥关系?](/docs/03/61.md)
378380

379-
- [62、进程间是如何通信的?线程间又如何切换呢?]()
381+
- [62、进程间是如何通信的?线程间又如何切换呢?](/docs/03/62.md)
380382

381-
- [63、你能聊聊BIO、NIO、AIO分别都是啥?有什么区别?(上)]()
383+
- [63、你能聊聊BIO、NIO、AIO分别都是啥?有什么区别?(上)](/docs/03/63.md)
382384

383-
- [64、你能聊聊BIO、NIO、AIO分别都是啥?有什么区别?(下)]()
385+
- [64、你能聊聊BIO、NIO、AIO分别都是啥?有什么区别?(下)](/docs/03/64.md)
384386

385387
### 线上生产实践
386388

@@ -541,6 +543,26 @@
541543

542544
- [137、说说高并发场景下的数据库连接池应该如何进行优化?](/docs/03/137.md)
543545

546+
- [138、如果压测的时候发现系统的TPS不达标,此时应该如何优化系统?](/docs/03/138.md)
547+
548+
### NoSQL
549+
550+
- [139、为什么有了HDFS之后,还需要HBase呢?](/docs/03/139.md)
551+
552+
- [140、到底为什么把 HBase 叫做NoSQL数据库呢?](/docs/03/140.md)
553+
554+
- [141、HBase作为一个NoSQL数据库,有哪些架构上的特点?(上)](/docs/03/141.md)
555+
556+
- [142、HBase作为一个NoSQL数据库,有哪些架构上的特点?(下)](/docs/03/142.md)
557+
558+
- [143、HBase作为NoSQL数据库,到底适用于哪些场景?](/docs/03/143.md)
559+
560+
- [144、HBase的数据模型是什么样的?(上)](/docs/03/144.md)
561+
562+
- [145、HBase的数据模型是什么样的?(下)](/docs/03/145.md)
563+
564+
- [146、HBase的物理存储格式:为啥说他是列式存储?](/docs/03/146.md)
565+
544566
### 开源框架
545567

546568
### Java Core

docs/03/11.md

Whitespace-only changes.

docs/03/12.md

Whitespace-only changes.

docs/03/137.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# 137、说说高并发场景下的数据库连接池应该如何进行优化?
2+
23
以druid来举例
34

45

docs/03/138.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# 138、如果压测的时候发现系统的TPS不达标,此时应该如何优化系统?
2+
3+
对系统进行压测,比如每秒压个几百请求到几千请求,甚至上万请求,此时发现死活压不上去,压来压去,你的系统最多每秒就处理几百个请求,根本到不了几千个请求,此时就发现系统的TPS不达标,此时如何优化?
4+
5+
6+
7+
其实这个时候,如果发现TPS不达标,通常是说明你系统肯定是每个请求处理时间太长了,所以就导致你单位时间内,在有限的线程数量下,能处理的TPS就少了,这个时候往往要先优化性能,再提TPS
8+
9+
10+
11+
假设你一共有200个线程,结果你每个请求要耗费500ms,每个线程每秒就只能处理2个请求,200个线程每秒只能处理400个请求,比你期望的单机处理500~600个请求,要少了很多
12+
13+
14+
15+
既然说要优化性能,那就得通过打日志的方式,或者是监控的方式,检查你服务的每个环节的性能开销,通常来说用打日志方式会细化一些,要靠监控把每个细节摸清楚,也挺难的,毕竟很多是代码细节
16+
17+
18+
19+
把你的系统里一个请求过来,每一次数据库、缓存、ES之类的操作的耗时都记录在日志里面,把你的每个请求执行链路里的每个耗时小环节,都给记录清楚他,比如说你一个请求过来一共500ms,此时你发现就是某个SQL语句一下子耗时了300多ms,其实其他的操作都在正常范围内
20+
21+
22+
23+
优化一下SQL语句呢?这个SQL语句搞了一个全表扫描,因为写SQL的时候没有考虑到使用索引,所以此时可以建立新的索引,或者是改写SQL语句,让他可以使用到你建立好的索引,SQL语句优化到100ms
24+
25+
26+
27+
每个请求只要300ms就可以了,每个线程每秒可以处理3个请求,200个线程每秒可以处理600个请求
28+
29+
30+
31+
你可以检查你核心服务的每个环节的性能,针对性的做优化,把你每个请求的时间降到最低,这样你单位时间内的TPS绝对就提高了,这个很关键
32+
33+
34+
35+
其次就是增加机器数量,线性扩容了,比如说服务层面,每个服务单机最多抗800请求,那扩容到部署10台机器,就可以抗8000请求,但是你又得考虑你依赖的数据库,MQ,Redis能不能抗下这么多的并发

docs/03/139.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# 139、为什么有了HDFS之后,还需要HBase呢?
2+
3+
hdfs,对hdfs是什么,功能,架构,源码,如何二次开发,都有了一定的理解,看懂hdfs那个课程的前提,Java架构部分的jdk集合、并发、IO、网络,自研分布式海量小文件系统的项目,最好去先做一下
4+
5+
6+
7+
hdfs设计主要是针对什么呢?针对的是大数据,超大文件,比如说你有一个超大文件,里面要放100GB的用户行为的日志,甚至是1TB,甚至1PB,针对一个网站的每天的用户行为的日志,可以都放一个超大文件里去
8+
9+
10+
11+
超大文件很难说放在一台服务器上,所以说此时,可以把超大文件拆散,拆成N多个128MB的小文件,每一个小文件就可以说是这个大文件的一个block
12+
13+
14+
15+
hdfs解决的主要是一个分布式存储的问题,也就是说你有超大数据集,不可能都放在一个文件里,是不现实的,所以可以拆分为N多个128MB的block小文件,分散存储在多台机器上,对超大数据集实现分布式存储的效果
16+
17+
18+
19+
每个block小文件还有3副本冗余存储,每个副本在不同的机器上,高可用和高容错,任何一台机器挂掉,不会导致数据丢失的
20+
21+
22+
23+
hdfs,hadoop distributed filesystem,分布式文件系统,他存放的是文件,文件死的,静态的,最多只能是你不停的往文件的末尾追加数据,他会把你追加到文件末尾的数据其实都是分散在不同的小block里存储在机器上
24+
25+
26+
27+
目录层级结构,创建文件,管理权限,对文件进行删除,大概就是这样的一些事情了,对大文件里的数据进行读取,对文件进行数据追加,hdfs只能做到如上一些事情
28+
29+
30+
31+
针对你hdfs上存储的海量数据,10TB的数据,我要进行增删改查,我要往里面插入数据,还要修改数据,还有删除里面某一行数据,还有精准的查询里面某一行数据,得了,hdfs上是大量的block小文件
32+
33+
34+
35+
虽然说帮你把超大数据集给分布式存储了,现实吗?根本就不现实
36+
37+
38+
39+
所以呢,当当当当,hbase出马了,由hbase基于hdfs进行超大数据集的分布式存储,让海量数据分布式存储在hdfs上,但是对hdfs里的海量数据进行精准的某一行,或者某几行的数据的增删改查,由hbase来解决了
40+
41+
42+
43+
hadoop nosql database

docs/03/14.md

Whitespace-only changes.

docs/03/140.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# 140、到底为什么把 HBase 叫做NoSQL数据库呢?
2+
3+
《002_到底为什么把HBase叫做NoSQL数据库呢?》
4+
5+
6+
7+
hdfs可以解决我们的一些问题,超大数据集的分布式存储,hbase作为hadoop nosql database,来解决海量数据的增删改查的问题
8+
9+
10+
11+
到底什么是nosql,跟sql相对应
12+
13+
14+
15+
hbase主要是就是能够帮助你对海量数据进行增删改查,跟sql是相反的,关系型数据库,mysql/oracle,一般来说都是基于SQL语法让你实现复杂的一些SQL语句,还可以支持事务,主要是开发业务系统的
16+
17+
18+
19+
比如说你有一些需求,是要对10TB的数据,对他们进行相对较为简单的增删改查,比如说插入一行数据,查询一行数据,根据一些简单的条件查询某几行数据,删除一行数据,更新一行数据
20+
21+
22+
23+
hbase就可以搞定,专职就是干这个的,分布式nosql数据库就可以了,他是跟关系型数据库相反的,是不支持SQL语句的,nosql,没有SQL语句的支持,没有SQL的数据库,帮你对海量数据做简单增删改查的
24+
25+
26+
27+
nosql数据库,一般都是分布式的,解决海量数据的简单增删改查问题的,如果你要是针对少量数据做简单增删改查,也不需要nosql,其实你用mysql/oracle天然就可以搞定少量数据的增删改查
28+
29+
30+
31+
天生不擅长sql,所以不要强行在上面用sql,就是做一些简单的增删改查就可以了
32+
33+
34+
35+
很多场景是需要对海量数据做基础的增删改查,不需要复杂的sql语法支持,那么天然可以用hbase,海量数据可以存储,分布式的nosql支持
36+

docs/03/141.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# 141、HBase作为一个NoSQL数据库,有哪些架构上的特点?(上)
2+
3+
《003_HBase作为一个NoSQL数据库,有哪些架构上的特点?(上)》
4+
5+
6+
7+
(1)分布式架构
8+
9+
10+
11+
hbase定位是分布式nosql数据库,把自己的nosql数据库的功能是通过多台机器来实现的,有多个RegionServer,分布式管理数据,分布式执行你的各种nosql数据库的操作
12+
13+
14+
15+
(2)分布式数据存储和自动数据分片
16+
17+
18+
19+
这个功能是极为强大的,比如你搞一个hbase里的表,然后在表里搞很多很多的数据,这个表会分为很多的region,每个region里是一个数据分片,然后这些region数据分片就会分散在多台机器上
20+
21+
22+
23+
假设你的表里的数据太多了,此时region会自动进行分裂,分裂成更多的region,自动分散在更多的机器上,对我们使用是极为方便的
24+
25+
26+
27+
(3)集成hdfs作为分布式文件存储系统
28+

docs/03/142.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# 142、HBase作为一个NoSQL数据库,有哪些架构上的特点?(下)
2+
3+
《HBase作为一个NoSQL数据库,有哪些架构上的特点?(下)》
4+
5+
6+
7+
(1)强一致读写
8+
9+
10+
11+
他不是zk那种最终一致性,是强一致的,你写成功了立马就可以读。这个功能是极为实用的,他是依靠的分布式存储才做到的,zk那种是属于主从同步,你读follower机器是可能读到不一致数据的
12+
13+
14+
15+
(2)高可用
16+
17+
18+
19+
每台机器上部署一个RegionServer,管理一大堆的region数据分片,RegionServer都是支持高可用的,一个RegionServer挂掉不会导致数据丢失,他自动可以由别的机器接管他的工作运行下去
20+
21+
22+
23+
(3)支持mapreduce/spark这种分布式计算引擎
24+
25+
26+
27+
对hbase里的数据进行分布式计算,可以从hbase里分布式抽数据去计算,也可以把计算后的结果写入hbase分布式存储
28+
29+
30+
31+
(4)Java API/thrift API/REST API的支持
32+
33+
34+
35+
当然支持Java API了,咱们的Java业务系统经常会有海量数据NoSQL存储的需求,此时就可以基于Java API来操作hbase里的数据了
36+
37+
38+
39+
(5)支持协处理器,块缓存和布隆过滤器,可以用于优化查询性能
40+
41+
42+
43+
(6)hbase现在最新版本都是支持web界面的方式来对hbase集群进行运维管理的

docs/03/143.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# 143、HBase作为NoSQL数据库,到底适用于哪些场景?
2+
3+
(1)海量数据场景
4+
5+
6+
7+
表来形容,单表在千万以内级别的数据量,基本都是小数据,千万级别的数据量,最多只能说是中等数据量,MySQL搞一下分库分表,搞个两三台服务器,就可以轻松抗住千万级别的数据量的表了,每个表可能也就几万条数据了
8+
9+
10+
11+
基于分库分表的中间件,mycat、sharding-sphere,都可以的,直接做一些路由什么的,就可以轻松搞定几千万级别的数据了,性能也是很高的
12+
13+
14+
15+
假设几千万条数据是过去历史几年下来积累的,每年积累一千万数据,每个月也就100万数据左右,每一天几万数据量,10年才1亿数据,MySQL分库分表的技术方案,抗下小亿级别的数据量都是ok的,一两亿数据
16+
17+
18+
19+
可能你作为这个系统的负责人,在可见的范围内,基本上单表撑死也就几千万到一两亿级别,10年、20年以后了,不用考虑这么多了,其实像这种级别的存量和增量的数据量,用MySQL分库分表就可以轻松搞定了
20+
21+
22+
23+
要做一些跨库跨表的SQL,不太好做,可以自己查询一些数据放到内存来做定制计算也是可以的
24+
25+
26+
27+
什么叫做海量数据?说不好听的,假设你就几百万数据,用MySQL就可以轻松高兴了,要是你有几千万数据呢?基本到MySQL的瓶颈和极限了。要是你有几亿条数据呢?而且每天数据量还在不停的增长呢?
28+
29+
30+
31+
这个时候你就可以使用hbase了,他天生就是分布式的,可以扩容很方便,数据分布式存储,自动数据分片,完善的运维管理,底层集成hdfs做分布式文件系统,增删改查的nosql功能都支持,你几亿到几十亿的数据放里面很适合,而且数据还一直在增长
32+
33+
34+
35+
绝对比mysql分库分表要来的方便的多
36+
37+
38+
39+
(2)只需要简单的增删改查的支持
40+
41+
42+
43+
你对海量的数据仅仅就是简单的增删改查的支持,绝对没有MySQL那种关系型数据库支持的列类型、索引、事务、SQL语法,那么多高阶的特性,你要是不需要索引、SQL和事务,那妥妥的用hbase就可以了
44+
45+
46+
47+
虽然hbase之上有很多开源组件,可以搞二级索引、phoniex可以支持SQL,但是说实话,真的没必要,人家hbase就不是干这个的,麻烦大家别折腾他好吗
48+
49+
50+
51+
你要海量数据下支持事务,可以用分布式数据库,比如TiDB;你要海量数据下支持复杂SQL实时分析,可以用clickhouse,或者是druid之类的

docs/03/144.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# 144、HBase的数据模型是什么样的?(上)
2+
3+
《006_HBase的数据模型是什么样的?》
4+
5+
6+
7+
hbase里其实也是建一个一个的表
8+
9+
10+
11+
表里有很多行的数据,但是其实这个表说白了就是一个逻辑模型,物理上根本没那么简单的,一个表的数据当然是拆为很多region分散在不同的机器上的,要是表里数据太多了,region数量还会变多,这样你加更多机器,region可以自动迁移到不同的机器上去
12+
13+
14+
15+
每一行都有一个rowkey,还有很多列,表里的数据行都是按照rowkey排序的,大致可以把rowkey理解为mysql里的主键id,在hbase里每一行数据都有一个rowkey行健来唯一的标识一行数据
16+
17+
18+
19+
所以一般设计rowkey是一门讲究活,后续还会讲如何设计rowkey的,因为一般要把同一类数据的rowkey设计的相似一些,比如说用户id=1的订单,就应该叫做order_1_xx之类的,这样一个用户的订单就会在排序之后靠近在一起
20+
21+
22+
23+
rowkey 列
24+
25+
order_1_110 xxx
26+
27+
order_1_111 xxx
28+
29+
order_2_256 xxx

docs/03/145.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# 145、HBase的数据模型是什么样的?(下)
2+
3+
《007_HBase的数据模型是什么样的?(下)》
4+
5+
6+
7+
rowkey order:base order:detail order:extent
8+
9+
order_1_110 xxx xxx
10+
11+
order_1_111 x1(t1); x2(t2) xxx xxx
12+
13+
14+
15+
每一行数据都有一些列族,就是column family,每个列族都包含一些列,每个列族都有一系列的存储属性,比如说是否把列族里的列值缓存在内存里,列族里的数据如何进行压缩,类似这种
16+
17+
18+
19+
一个表里有固定的一些列族,每一行都有这些列族,当然有可能你一行数据在某个列族里没存什么东西,是有可能的
20+
21+
22+
23+
然后就是列,每个列就是一个列族+分号+列限定符(column qualifier),比如说列族是order,列可能就是order:base,或者是order:detail
24+
25+
26+
27+
每个表的列族是固定的,但是每一行数据有哪些列是不固定的,插入数据的时候可以动态可以给这行数据设定多个列,每个列都是属于一个列族,就是一个列族+分号+列限定符的形式,就可以确定一个列
28+
29+
30+
31+
时间戳,timestamp,每一行的每个列的值写入的时候就会有一个时间戳,时间戳就代表了这一行这个列的某个版本的值,当然这个timestamp你也可以自己插入的时候指定一个timestamp也是ok的
32+
33+
34+
35+
单元格,也就是cell,其实就是一行的某个列族下的某个列(由列限定符来确定)的某个timestamp版本对应的值,说白了就这么个东西,在hbase里,每一行的每个列的值,是有多个版本的,每个版本都是一个cell

0 commit comments

Comments
 (0)