group By操作
map端部分聚合。并不是所有的聚合操作都需要在reduce部分进行,很多聚合操作都可以先在map端进行部分聚合,然后在reduce端得出最终结果。
hive.map.aggr=true,用于设定是否在map端进行聚合,默认为True。hive.groupby.mapaggr.checkinterval=100000,用于设定在map端进行聚合操作的条目数。
有数据倾斜(数据分布不均匀)时进行负载均衡。此处需要设定hive.groupby.skewindata,当选项设定为true时,生成的查询计划会有两个MapReduce任务。在第一个MapReduce中,map的输出结果集合会随机分布到reduce中,每个reduce做部分聚合操作,并输出结果。这样处理的结果是,相同的额Group By Key有可能被分发到不同的reduce中,从而达到负载均衡的目的;第二个MapReduce任务再根据预处理的数据结果按照Group By Key分布到reduce中(这个过程可以保证相同的Group By Key分布到同一个Reduce中),最后完成最终的聚合操作。
HBase详解
HBase是Apache Hadoop的数据,能够对大型数据提供随机、实时的读写访问。HBase的运行依赖于其他文件系统,它模仿并提供基于Google文件系统的大表(bigtable)数据库的所有功能。
HBase的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列组成的大型数据。
HBase是一个开源的、分布式的、多版本的、面向列的存储模型。它可以直接使用本地文件系统,也可以使用Hadoop的HDFS文件存储系统。不过,为了提高数据的可靠性和系统的健壮性,并且发挥HBase处理大型数据的能力,还是使用HDFS作为文件存储系统更为稳妥。
HBase Shell
HBase为用户提供了一个非常方便的使用方式,我们称之为HBase Shell。
HBase Shell提供了大多数的HBase命令,通过HBase Shell用户可以方便地创建、删除及修改表,还可以向表中添加数据、列出表中的相关信息等。
在启动HBase之后,用户可以通过下面的命令进入HBase Shell中,代码:hbase shell
HBase配置
如果要对HBase进行配置,修改conf/hbase-default.xml文件或conf/hbase-site.xml文件中的property节点即可。
hbase.client.write.buffer
通过此参数设置写入缓冲区的数据大小,以字节为单位,默认写入缓冲区的数据大小为2MB。服务器通过此缓冲区可以加快处理速度,但是此值如果设置得过大势必加重服务器的负担,因此一定要根据实际情况设置。
hbase.master.meta.thread.rescanfrequency
HMaster会扫描ROOT和META表的时间间隔,以毫秒为单位。默认值为60000毫秒。此值不宜设置得过小,尤其是当存储数据过多的时候,否则频繁地扫描ROOT和META表将严重影响系统的性能。
hbase.regionserver.handler.count
客户端向服务器请求服务时,服务器现将客户端的请求连接放入一个队列中。然后服务器通过轮询的方式对其进行处理。这样每一个请求就会产生一个线程。此值要根据实际情况来设置,建议设置得大一些。在服务器端由于写数据缓存所消耗的大小为:habse.client.write.buffer * hbase.regionsever.handler.count
hbase.hregion.max.filesize
通过此参数可以设置HRegion中HstoreFile文件的最大值,以字节为单位。当表中的列族超过此值时,它将被分割。其默认大小为256MB。
hfile.block.cache.size
HFile/StoreFile缓存所占Java虚拟机堆大小的百分比,默认值为0.2,即20%。将其值设置为0表示禁用此选项
hbase.regionserver.global.memstore.upperLimit
在Region服务器中所有的memstore所占用Java虚拟机比例的最大值。默认值为0.4,即40%。当memstore所占用的空间超过此值时,更新操作将被阻塞,并且所有的内容将被强制写出。
hbase.hregion.memstore.flush.size
如果memstore缓存的内容大小超过此参数所设置的值,那么它将被写到磁盘上。默认值为64MB。
另外,在配置文件中还有很多关于zookeeper配置的参数。
HBase体系结构
HBase的服务器体系结构遵从简单的主从服务器架构,它由HRegion服务器(HRegion Server)群和HBase Master服务器负责管理所有的HRegion服务器,而HBase中所有的服务器都是通过Zookeeper来进行协调并处理HBase服务器运行期间可能遇到的错误的。HBase Master Server本身并不存储HBase中的任何数据,HBase逻辑上的表可能被划分成多个HRegion,然后存储到HRegion Server群中。HBase Master Server中存储的是从数据到HRegion Server的映射。
HRegion
当表的大小超过设置值的时候,HBase会自动地将表划分为不同的区域,每个区域包含所有行的一个子集。对用户来说,每个表是一堆数据的集合,靠主键来区分。从物理上来说,一张表被拆分成了多块,每一块就是一个HRegion。我们用表名+开始/结束主键,来区分每一个HRegion,一个HRegion会保存一个表里面某段连续的数据,从开始主键到结束主键,一张完整的表格是保存在多个HRegion上面的。
HRegion服务器
所有的数据库数据一般是保存在Hadoop分布式文件系统上面的,用户通过一系列HRegion服务器获取这些数据,一台机器上面一般只运行一个HRegion服务器,且每一个区段的HRegion也只会被一个HRegion服务器维护。
当用户更新数据的时候,他会被分配到对应的HRegion服务器上提交修改,这些修改先是被写到Hmemcache缓存和服务器的Hlog文件里面,在操作写入Hlog之后,commit()调用才会将其返回给客户端。
在读取数据的时候,HRegion服务器会先访问Hmemcache缓存,如果缓存里面没有该数据,才会回到Hstores磁盘上面寻找,每一个列族都会有一个Hstore集合,每个Hstore集合包含很多具体的HstoreFile文件,这些文件都是B树结构的,方便快速读取。
系统会定期调用HRegion.flushcache()把缓存里面的内容写到文件中,一般这会增加一个新的HstoreFile文件,而此时高速缓存就会被清空,并且会写一个标记到Hlog上,这表示上面的内容已经被写入到文件中保存。