持续分享有用、有价值、精选的优质大数据面试题
致力于打造全网最全的大数据面试专题题库
141、底层数据同样存储在HDFS,HBase为什么比Hive查询速度快?
参考答案:
(1)Hive
1)hive 是基于MapReduce来处理,离线计算速度慢。
2)MapReduce处理数据是基于行的模式,查询数据默认是扫描整个表。
3)hive中的表是纯逻辑表,只是表的定义,本身不存储数据,完全依赖hdfs和MapReduce。
(2)Hbase
1)hbase 是物理表,有独立的物理结构,查询的时候将相应的数据加载到内存,提升后续的查询效率。
2)Hbase 是基于列存储的,查询的时候可以只扫描某一个列或者某几列,避免扫描所有数据。
3)Hbase 有一级索引rowkey,根据rowkey查询速度非常快。
4)Hbase 提供了一个超大的内存hash表,搜索引擎通过这个hash表存储索引,提升查询效率。
142、如果HBase集群中的节点宕机了,HBase集群内部后续是如何处理的?是否影响线上业务?
参考答案:
1.如果是Master宕机,通过Zookeeper重新选举另外一个Master提供服务,此短暂期间负载均衡,region迁移,元数据操作无法进行,但不影响数据读写。
2.如果是RegionServer宕机,当前RegionServer上面的region会迁移到其他RegionServer。此短暂期间,无法响应region I/O请求以及region切分。
3.因为HBase集群是高可用的,故HBase集群中有节点宕机,不影响线上业务运行。
143、HBase写数据的原理是什么?
参考答案:
1.客户端
(1)客户端发起Put写请求,将put写入writeBuffer,如果是批量提交,写满缓存后自动提交 。
(2)根据rowkey将put分发给不同regionserver 。
2.服务端
(1)Regionserver将put按rowkey分给不同的region 。
(2)Region首先把数据写入wal。
(3)wal写入成功后,把数据写入memstore,此时写成功,并返回通知客户端。
(4)Memstore写完后,检查memstore大小是否达到flush阈值。
(5)如果达到flush阈值,将memstore写入到HDFS,生成HFile文件。
144、Hbase如何设计rowkey?列簇怎么设计比较好?
参考答案:
(1)Rowkey设计
1)业务逻辑简单,同时满足业务查询
2)数据是连续查询还是随机查询
3)考虑热点问题,选择不同的高位散列方法
4)设计原则:长度、散列、唯一 2、列簇设计:
(2)列簇设计
1)列簇一般2~3个比较合适;
2)具有相同IO特性的列放在一个列簇,降低IO;
3)列簇的名称尽可能短。
145、怎么实现Hbase的预分区?
参考答案:
1.首先确定分区个数。
regionNum=数据总量/region大小。
2.确定rowkey范围。
1)可以抽样。
2)可以指定一个范围(如使用java short类型16进制)。
3.计算参数中的startkey和endkey。
4.调用Java api分区方法。
admin.createTable(tableDescriptor, Bytes.toBytes(startkey), Bytes.toBytes(endkey), regionNum);
146、HBase的特点是什么?
参考答案:
1.大:单表可以数十亿行,数百万列。
2.无模式:同一个表的不同行可以有截然不同的列。
3.面向列:存储、权限控制、检索均面向列。
4.稀疏:空列不占用存储,表是稀疏的。
5.多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳。
6.数据类型单一:数据都是字符串,没有类型。
147、hbase导入数据有哪些方式?
参考答案:
1.通过HBase API进行批量写入数据。
2.使用Sqoop工具批量导数到HBase集群。
3.使用MapReduce批量导入。
4.HBase BulkLoad的方式。
148、hbase 的存储结构?
参考答案:
Hbase 中的每张表都通过行键(rowkey)按照一定的范围被分割成多个子表(HRegion),默认一个 HRegion 超过 256M 就要被分割成两个,由 HRegionServer 管理,管理哪些 HRegion由 Hmaster 分配。 HRegion 存取一个子表时,会创建一个 HRegion 对象,然后对表的每个列族(Column Family)创建一个 store 实例,每个 store 都会有 0 个或多个 StoreFile 与之对应,每个 StoreFile 都会对应一个 HFile, HFile 就是实际的存储文件,因此,一个 HRegion 还拥有一个 MemStore 实例。
149、解释下 hbase 实时查询的原理
参考答案:
实时查询,可以认为是从内存中查询,一般响应时间在 1 秒内。 HBase 的机制是数据先写入到内存中,当数据量达到一定的量(如 128M),再写入磁盘中, 在内存中,是不进行数据的更新或合并操作的,只增加数据,这使得用户的写操作只要进入内存中就可以立即返回,保证了 HBase I/O 的高性能。
150、描述 Hbase 中 scan 和 get 的功能以及实现的异同?
参考答案:
1.按指定RowKey 获取唯一一条记录, get方法(org.apache.hadoop.hbase.client.Get)Get 的方法处理分两种 : 设置了 ClosestRowBefore 和没有设置的 rowlock .主要是用来保证行的事务性,即每个 get 是以一个 row 来标记的.一个 row 中可以有很多 family 和 column。
2.按指定的条件获取一批记录, scan 方法(org.apache.Hadoop.hbase.client.Scan)实现条件查询功能使用的就是 scan 方式。
1)scan 可以通过 setCaching 与 setBatch 方法提高速度(以空间换时间);
2)scan 可以通过 setStartRow 与 setEndRow 来限定范围([start, end]start 是闭区间, end 是开区间)。范围越小,性能越高。
3)scan 可以通过 setFilter 方法添加过滤器,这也是分页、多条件查询的基础。
3.全表扫描,即直接扫描整张表中所有行记录。