HBase的优化

高可用

在 HBase 中 Hmaster 负责监控 RegionServer 的生命周期,均衡 RegionServer 的负载,如果

Hmaster 挂掉了,那么整个 HBase 集群将陷入不健康的状态,并且此时的工作状态并不会维

持太久。所以 HBase 支持对 Hmaster 的高可用配置。

  1. 关闭 HBase 集群 ( 如果没有开启则跳过此 步) )
  1. $ bin/stop-hbase.sh
  1. 在 在 conf 目录下创建 backup-masters 文件
  1. $ touch conf/backup-masters
  1. 在 在 backup-masters 文件中配置高可用 HMaster 节点
  1. $ echo linux02 > conf/backup-masters
  1. 将整个 conf 目录 scp
  1. $ scp -r conf/ linux02:/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/
  2. $ scp -r conf/ linux03:/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/
  1. 打开页面测试查看
  1. 0.98 版本之前:http://linux01:60010
  2. 0.98 版本之后:http://linux01:16010

Hadoop 的通用性优化

  1. NameNode 元数据备份使用 SSD

  2. 定时备份 NameNode 上的元数据 据

    每小时或者每天备份,如果数据极其重要,可以 5~10 分钟备份一次。备份可以通过定时任

    务复制元数据目录即可。

  3. 为 为 NameNode 指定多个元数据目录

    使用 dfs.name.dir 或者 dfs.namenode.name.dir 指定。这样可以提供元数据的冗余和健壮性,

    以免发生故障。

  4. NameNode 的 的 dir 自恢复

    设置 dfs.namenode.name.dir.restore 为 true,允许尝试恢复之前失败的 dfs.namenode.name.dir

    目录,在创建 checkpoint 时做此尝试,如果设置了多个磁盘,建议允许。

  5. HDFS 保证 RPC 调用会有较多的线程数

    hdfs-site.xml

  1. 属性:dfs.namenode.handler.count
  2. 解释:该属性是 NameNode 服务默认线程数,的默认值是 10,根据机器的可用内存可以调
  3. 整为 50~100
  4. 属性:dfs.datanode.handler.count
  5. 解释:该属性默认值为 10,是 DataNode 的处理线程数,如果 HDFS 客户端程序读写请求比
  6. 较多,可以调高到 15~20,设置的值越大,内存消耗越多,不要调整的过高,一般业务中,
  7. 5~10 即可。
  1. HDFS 副本数的调整

    hdfs-site.xml
  1. 属性:dfs.replication
  2. 解释:如果数据量巨大,且不是非常之重要,可以调整为 2~3,如果数据非常之重要,可以
  3. 调整为 3~5
  1. HDFS 文件块大小的调整

    hdfs-site.xml
  1. 属性:dfs.blocksize
  2. 解释:块大小定义,该属性应该根据存储的大量的单个文件大小来设置,如果大量的单个文
  3. 件都小于 100M,建议设置成 64M 块大小,对于大于 100M 或者达到 GB 的这种情况,建议
  4. 设置成 256M,一般设置范围波动在 64M~256M 之间。
  1. MapReduce Job 任务服务线程数调整

    mapred-site.xml
  1. 属性:mapreduce.jobtracker.handler.count
  2. 解释:该属性是 Job 任务线程数,默认值是 10,根据机器的可用内存可以调整为 50~100
  1. Http 服务器工作线程数

    mapred-site.xml

  1. 属性:mapreduce.tasktracker.http.threads
  2. 解释:定义 HTTP 服务器工作线程数,默认值为 40,对于大集群可以调整到 80~100
  1. 文件排序合并 优化

    mapred-site.xml
  1. 属性:mapreduce.task.io.sort.factor
  2. 解释:文件排序时同时合并的数据流的数量,这也定义了同时打开文件的个数,默认值为
  3. 10,如果调高该参数,可以明显减少磁盘 IO,即减少文件读取的次数。
  1. 设置任务并发

    mapred-site.xml
  1. 属性:mapreduce.map.speculative
  2. 解释:该属性可以设置任务是否可以并发执行,如果任务多而小,该属性设置为 true 可以
  3. 明显加快任务执行效率,但是对于延迟非常高的任务,建议改为 false,这就类似于迅雷下
  4. 载。
  1. MR 输出数据的压缩

    mapred-site.xml
  1. 属性:mapreduce.map.output.compressmapreduce.output.fileoutputformat.compress
  2. 解释:对于大集群而言,建议设置 Map-Reduce 的输出为压缩的数据,而对于小集群,则不
  3. 需要。
  1. 优化 Mapper 和 和 Reducer 的个数

    mapred-site.xml
  1. 属性:
  2. mapreduce.tasktracker.map.tasks.maximum
  3. mapreduce.tasktracker.reduce.tasks.maximum
  4. 解释:以上两个属性分别为一个单独的 Job 任务可以同时运行的 Map Reduce 的数量。
  5. 设置上面两个参数时,需要考虑 CPU 核数、磁盘和内存容量。假设一个 8 核的 CPU,业务
  6. 内容非常消耗 CPU,那么可以设置 map 数量为 4,如果该业务不是特别消耗 CPU 类型的,
  7. 那么可以设置 map 数量为 40reduce 数量为 20。这些参数的值修改完成之后,一定要观察
  8. 是否有较长等待的任务,如果有的话,可以减少数量以加快任务执行,如果设置一个很大的
  9. 值,会引起大量的上下文切换,以及内存与磁盘之间的数据交换,这里没有标准的配置数值,
  10. 需要根据业务和硬件配置以及经验来做出选择。
  11. 在同一时刻,不要同时运行太多的 MapReduce,这样会消耗过多的内存,任务会执行的非
  12. 常缓慢,我们需要根据 CPU 核数,内存容量设置一个 MR 任务并发的最大值,使固定数据
  13. 量的任务完全加载到内存中,避免频繁的内存和磁盘数据交换,从而降低磁盘 IO,提高性
  14. 能。
  15. 大概估算公式:
  16. map = 2 + cpu_core
  17. reduce = 2 + cpu_core

Linux 优化

  1. 开启 文件系统的预读缓存可以提高读取速度
  1. $ sudo blockdev --setra 32768 /dev/sda
  2. 尖叫提示:ra readahead 的缩写
  1. 关闭进程睡眠池
  1. 即不允许后台进程进入睡眠状态,如果进程空闲,则直接 kill 掉释放资源
  2. $ sudo sysctl -w vm.swappiness=0
  1. 调整 ulimit 上限,默认值为比较小的数字
  1. $ ulimit -n 查看允许最大进程数
  2. $ ulimit -u 查看允许打开最大文件数
  3. 优化修改:
  4. $ sudo vi /etc/security/limits.conf 修改打开文件数限制
  5. 末尾添加:
  6. * soft nofile 1024000
  7. * hard nofile 1024000
  8. Hive - nofile 1024000
  9. hive - nproc 1024000
  10. $ sudo vi /etc/security/limits.d/20-nproc.conf 修改用户打开进程数限制
  11. 修改为:
  12. #* soft nproc 4096
  13. #root soft nproc unlimited
  14. * soft nproc 40960
  15. root soft nproc unlimited
  1. 开启集群的时间同步 NTP
  1. 集群中某台机器同步网络时间服务器的时间,集群中其他机器则同步这台机器的时间。
  1. 更新系统补丁
  1. 更新补丁前,请先测试新版本补丁对集群节点的兼容性。

Zookeeper 优化

  1. 优化 Zookeeper 会话超时时间

    hbase-site.xml
  1. 参数:zookeeper.session.timeout
  2. 解释:In hbase-site.xml, set zookeeper.session.timeout to 30 seconds or less to bound failure
  3. detection (20-30 seconds is a good start).该值会直接关系到 master 发现服务器宕机的最大周
  4. 期,默认值为 30 秒,如果该值过小,会在 HBase 在写入大量数据发生而 GC 时,导致
  5. RegionServer 短暂的不可用,从而没有向 ZK 发送心跳包,最终导致认为从节点 shutdown
  6. 一般 20 台左右的集群需要配置 5 zookeeper

HBase 优化

预分区

每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey

范围,则该数据交给这个 region 维护。那么依照这个原则,我们可以将数据索要投放的分

区提前大致的规划好,以提高 HBase 性能。

  1. 手动设定分区
  1. hbase> create 'staff','info','partition1',SPLITS => ['1000','2000','3000','4000']
  1. 生成 16 进制序列预分区
  1. create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
  1. 按照文件中设置的规则预分区
  1. 创建 splits.txt 文件内容如下:
  2. aaaa
  3. bbbb
  4. cccc
  5. dddd
  6. 然后执行:
  7. create 'staff3','partition3',SPLITS_FILE => 'splits.txt'
  1. 使用 JavaAPI 创建预分区
  1. //自定义算法,产生一系列 Hash 散列值存储在二维数组中
  2. byte[][] splitKeys = 某个散列值函数
  3. //创建 HBaseAdmin 实例
  4. HBaseAdmin hAdmin = new HBaseAdmin(HBaseConfiguration.create());
  5. //创建 HTableDescriptor 实例
  6. HTableDescriptor tableDesc = new HTableDescriptor(tableName);
  7. //通过 HTableDescriptor 实例和散列值二维数组创建带有预分区的 HBase 表
  8. hAdmin.createTable(tableDesc, splitKeys);

RowKey 设计

一条数据的唯一标识就是 rowkey,那么这条数据存储于哪个分区,取决于 rowkey 处于哪个

一个预分区的区间内,设计 rowkey 的主要目的 ,就是让数据均匀的分布于所有的 region

中,在一定程度上防止数据倾斜。接下来我们就谈一谈 rowkey 常用的设计方案。

  1. 生成随机数、hash、散列值
  1. 比如:
  2. 原本 rowKey 1001 的,SHA1 后变成:dd01903921ea24941c26a48f2cec24e0bb0e8cc7
  3. 原本 rowKey 3001 的,SHA1 后变成:49042c54de64a1e9bf0b33e00245660ef92dc7bd
  4. 原本 rowKey 5001 的,SHA1 后变成:7b61dec07e02c188790670af43e717f0f46e8913
  5. 在做此操作之前,一般我们会选择从数据集中抽取样本,来决定什么样的 rowKey Hash
  6. 后作为每个分区的临界值。
  1. 字符串反转
  1. 20170524000001 转成 10000042507102
  2. 20170524000002 转成 20000042507102
  3. 这样也可以在一定程度上散列逐步 put 进来的数据。
  1. 字符串拼接
  1. 20170524000001_a12e
  2. 20170524000001_93i7

内存优化

  1. HBase 操作过程中需要大量的内存开销,毕竟 Table 是可以缓存在内存中的,一般会分配整
  2. 个可用内存的 70%给 HBase Java 堆。但是不建议分配非常大的堆内存,因为 GC 过程持
  3. 续太久会导致 RegionServer 处于长期不可用状态,一般 16~48G 内存就可以了,如果因为框
  4. 架占用内存过高导致系统内存不足,框架一样会被系统服务拖死。

基础优化

  1. 允许在 在 HDFS 的文件中追加内容
  1. 不是不允许追加内容么?没错,请看背景故事:
  2. http://blog.cloudera.com/blog/2009/07/file-appends-in-hdfs/
  3. hdfs-site.xml hbase-site.xml
  4. 属性:dfs.support.append
  5. 解释:开启 HDFS 追加同步,可以优秀的配合 HBase 的数据同步和持久化。默认值为 true
  1. 优化 DataNode 允许的最大文件打开数

    hdfs-site.xml
  1. 属性:dfs.datanode.max.transfer.threads
  2. 解释:HBase 一般都会同一时间操作大量的文件,根据集群的数量和规模以及数据动作,设
  3. 置为 4096 或者更高。默认值:4096
  1. 优化延迟高的数据操作的等待时间

    hdfs-site.xml
  1. 属性:dfs.image.transfer.timeout
  2. 解释:如果对于某一次数据操作来讲,延迟非常高,socket 需要等待更长的时间,建议把该
  3. 值设置为更大的值(默认 60000 毫秒),以确保 socket 不会被 timeout 掉。
  1. 优化数据的写入效率

    mapred-site.xml
  1. 属性:
  2. mapreduce.map.output.compress
  3. mapreduce.map.output.compress.codec
  4. 解释:开启这两个数据可以大大提高文件的写入效率,减少写入时间。第一个属性值修改为
  5. true,第二个属性值修改为:org.apache.hadoop.io.compress.GzipCodec 或者其他压缩方式。
  1. 优化 DataNode 存储
  1. 属性:dfs.datanode.failed.volumes.tolerated
  2. 解释: 默认为 0,意思是当DataNode中有一个磁盘出现故障,则会认为该DataNode shutdown
  3. 了。如果修改为 1,则一个磁盘出现故障时,数据会被复制到其他正常的 DataNode 上,当
  4. 前的 DataNode 继续工作。
  1. 设置 RPC 监听数量

    hbase-site.xml
  1. 属性:hbase.regionserver.handler.count
  2. 解释:默认值为 30,用于指定 RPC 监听的数量,可以根据客户端的请求数进行调整,读写
  3. 请求较多时,增加此值。
  1. 优化 HStore 文件大小

    hbase-site.xml
  1. 属性:hbase.hregion.max.filesize
  2. 解释:默认值 1073741824010GB),如果需要运行 HBase MR 任务,可以减小此值,
  3. 因为一个 region 对应一个 map 任务,如果单个 region 过大,会导致 map 任务执行时间过长。
  4. 该值的意思就是,如果 HFile 的大小达到这个数值,则这个 region 会被切分为两个 Hfile
  1. 优化 hbase 客户端缓存

    hbase-site.xml
  1. 属性:hbase.client.write.buffer
  2. 解释:用于指定 HBase 客户端缓存,增大该值可以减少 RPC 调用次数,但是会消耗更多内
  3. 存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少 RPC 次数的目的。
  1. 指定 scan.next 扫描 HBase 所获取的行数

    hbase-site.xml
  1. 属性:hbase.client.scanner.caching
  2. 解释:用于指定 scan.next 方法获取的默认行数,值越大,消耗内存越大。
  1. flush 、compact 、split 机制
  1. MemStore 达到阈值,将 Memstore 中的数据 Flush Storefilecompact 机制则是把 flush
  2. 出来的小文件合并成大的 Storefile 文件。split 则是当 Region 达到阈值,会把过大的 Region
  3. 一分为二。
  4. 涉及属性:
  5. 即:128M 就是 Memstore 的默认阈值
  6. hbase.hregion.memstore.flush.size134217728
  7. 即:这个参数的作用是当单个 HRegion 内所有的 Memstore 大小总和超过指定值时,flush
  8. HRegion 的所有 memstoreRegionServer flush 是通过将请求添加一个队列,模拟
  9. 生产消费模型来异步处理的。那这里就有一个问题,当队列来不及消费,产生大量积压请求
  10. 时,可能会导致内存陡增,最坏的情况是触发 OOM
  11. hbase.regionserver.global.memstore.upperLimit0.4
  12. hbase.regionserver.global.memstore.lowerLimit0.38
  13. 即:当 MemStore 使用内存总量达到 hbase.regionserver.global.memstore.upperLimit 指定
  14. 值时,将会有多个 MemStores flush 到文件中,MemStore flush 顺序是按照大小降序执行
  15. 的,直到刷新到 MemStore 使用内存略小于 lowerLimit

本博客仅为博主学习总结,感谢各大网络平台的资料。蟹蟹!!

HBase的优化的更多相关文章

  1. hbase性能优化总结

    hbase性能优化总结 1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都 ...

  2. Hadoop生态圈-HBase性能优化

    Hadoop生态圈-HBase性能优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  3. HBase性能优化方法总结(转)

    原文链接:HBase性能优化方法总结(一):表的设计 本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客. ...

  4. HBase参数优化

    zookeeper.session.timeout默认值:3分钟(180000ms)说明:RegionServer与Zookeeper间的连接超时时间.当超时时间到后,ReigonServer会被Zo ...

  5. HBASE的优化、hadoop通用优化,Linux优化,zookeeper优化,基础优化

    HBase 的优化3.1.高可用在 HBase 中 Hmaster 负责监控 RegionServer 的生命周期,均衡 RegionServer 的负载,如果Hmaster 挂掉了,那么整个 HBa ...

  6. Hbase性能优化

    HBase性能优化方法总结 1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户 ...

  7. hbase读写优化

    一.hbase读优化 客户端优化 1.scan缓存是否设置合理? 优化原理:一次scan请求,实际并不会一次就将所有数据加载到本地,而是多次RPC请求进行加载.默认100条数据大小. 优化建议:大sc ...

  8. HBase性能优化方法总结(转)

    本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,这里涉及的不多,这部分可以参考:淘宝Ken Wu同学的博客. 1. 表的设计 1.1 Pr ...

  9. HBase性能优化方法总结(一):表的设计

    本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客. 下面是本文总结的第一部分内容:表的设计相关的优化方法 ...

随机推荐

  1. .NET Core RC2在Linux下部署

    前言 目前ASP.NET Core RC2已经正式发布了,可以参考如下链接: https://blogs.msdn.microsoft.com/dotnet/2016/05/06/net-core-r ...

  2. uni-app中Vuex的引用

    //store 中 store.js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const store = new Vue ...

  3. hive表批处理

    对hive中的表进行批量处理,如下是一个简单的脚本 #给定一个hive数据库名,生成它的所有表的create SQL语句,并导出到文件 create_fun(){ hive -e } #显示一个表中所 ...

  4. 深入理解Java虚拟机(字节码执行引擎)

    深入理解Java虚拟机(字节码执行引擎) 本文首发于微信公众号:BaronTalk 执行引擎是 Java 虚拟机最核心的组成部分之一.「虚拟机」是相对于「物理机」的概念,这两种机器都有代码执行的能力, ...

  5. Hyperledger Fabric1.4环境搭建过程

    简单记录一下fabric版本1.4的环境搭建,运行环境为Ubuntu18.04,其中一些内容是根据官方文档整理的,如有错误欢迎批评指正. 本文只介绍最简单的环境搭建方法,具体的环境搭建解析在这里深入解 ...

  6. java源码解析之String类(五)

    /* * 切片函数,非常重要,这里一定要牢记beginIndex是开始位置,endIndex是结束位置,区别于以前学的offset是开始位置,而count或length是个数和长度 * 比如说,new ...

  7. 在同一页面中显示多个echart图表

    整理了一下大概有两种做法来实现在同一个页面中显示多个echart图表,废话不说直接上代码. 在同一个echart对象中绘制多个图表 <!DOCTYPE html> <html lan ...

  8. Oracle常用的一些 数据字典 转https://www.cnblogs.com/neozhu/archive/2008/07/22/1248422.html

    Oracle常用数据字典表   Oracle常用数据字典表      查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_ ...

  9. spring源码深度解析— IOC 之 循环依赖处理

    什么是循环依赖 循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环.比如A依赖于B,B依赖于C,C又依赖于A.如下图所示: 注意,这里不是函数的循环调用,是对象的相互 ...

  10. 2018.9.26 2018NOIP冲刺之栈

    最小字典序(stack) 输入序列中有 n 个正整数,栈 S 开始为空. 你每次只可以进行下面两种操作之一:① 将输入序列头端的数据移至 S 栈顶(进 S 栈): ②  将 S 栈顶元素输出并删除(退 ...