写点什么

HBase 调优详细剖析

  • 2021 年 11 月 26 日
  • 本文字数:3576 字

    阅读完需:约 12 分钟

1. 通用优化

  1. NameNode 的元数据备份使用 SSD。

  2. 定时备份 NameNode 上的元数据,每小时或者每天备份,如果数据极其重要,可以 5~10 分钟备份一次。备份可以通过定时任务复制元数据目录即可。

  3. 为 NameNode 指定多个元数据目录,使用 dfs.name.dir 或者 dfs.namenode.name.dir 指定。一个指定本地磁盘,一个指定网络磁盘。这样可以提供元数据的冗余和健壮性,以免发生故障。

  4. 设置 dfs.namenode.name.dir.restore 为 true,允许尝试恢复之前失败的 dfs.namenode.name.dir 目录,在创建 checkpoint 时做此尝试,如果设置了多个磁盘,建议允许。

  5. NameNode 节点必须配置为 RAID1(镜像盘)结构。

  6. 保持 NameNode 日志目录有足够的空间,这些日志有助于帮助你发现问题。

  7. 因为 Hadoop 是 IO 密集型框架,所以尽量提升存储的速度和吞吐量(类似位宽)。

2. Linux 优化

  1. 开启文件系统的预读缓存可以提高读取速度$ sudo blockdev --setra 32768 /dev/sda


提示:ra 是 readahead 的缩写


  1. 关闭进程睡眠池$ sudo sysctl -w vm.swappiness=0

  2. 调整 ulimit 上限,默认值为比较小的数字$ ulimit -n 查看允许最大进程数$ ulimit -u 查看允许打开最大文件数


修改:$ sudo vi /etc/security/limits.conf 修改打开文件数限制


末尾添加:


*                soft    nofile          1024000*                hard    nofile          1024000Hive             -       nofile          1024000hive             -       nproc           1024000 
复制代码


$ sudo vi /etc/security/limits.d/20-nproc.conf 修改用户打开进程数限制


修改为:


#*          soft    nproc     4096#root       soft    nproc     unlimited*          soft    nproc     40960root       soft    nproc     unlimited
复制代码


  1. 开启集群的时间同步 NTP。

  2. 更新系统补丁(提示:更新补丁前,请先测试新版本补丁对集群节点的兼容性)

3. HDFS 优化(hdfs-site.xml)

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


属性:dfs.namenode.handler.count


解释:该属性是 NameNode 服务默认线程数,的默认值是 10,根据机器的可用内存可以调整为 50~100


属性:dfs.datanode.handler.count


解释:该属性默认值为 10,是 DataNode 的处理线程数,如果 HDFS 客户端程序读写请求比较多,可以调高到 15~20,设置的值越大,内存消耗越多,不要调整的过高,一般业务中,5~10 即可。


  1. 副本数的调整


属性:dfs.replication


解释:如果数据量巨大,且不是非常之重要,可以调整为 2~3,如果数据非常之重要,可以调整为 3~5。


  1. 文件块大小的调整


属性:dfs.blocksize


解释:块大小定义,该属性应该根据存储的大量的单个文件大小来设置,如果大量的单个文件都小于 100M,建议设置成 64M 块大小,对于大于 100M 或者达到 GB 的这种情况,建议设置成 256M,一般设置范围波动在 64M~256M 之间。

4. MapReduce 优化(mapred-site.xml)

  1. Job 任务服务线程数调整


mapreduce.jobtracker.handler.count


该属性是 Job 任务线程数,默认值是 10,根据机器的可用内存可以调整为 50~100


  1. Http 服务器工作线程数


属性:mapreduce.tasktracker.http.threads


解释:定义 HTTP 服务器工作线程数,默认值为 40,对于大集群可以调整到 80~100


  1. 文件排序合并优化


属性:mapreduce.task.io.sort.factor


解释:文件排序时同时合并的数据流的数量,这也定义了同时打开文件的个数,默认值为 10,如果调高该参数,可以明显减少磁盘 IO,即减少文件读取的次数。


  1. 设置任务并发


属性:mapreduce.map.speculative


解释:该属性可以设置任务是否可以并发执行,如果任务多而小,该属性设置为 true 可以明显加快任务执行效率,但是对于延迟非常高的任务,建议改为 false,这就类似于迅雷下载。


  1. MR 输出数据的压缩


属性:mapreduce.map.output.compress、mapreduce.output.fileoutputformat.compress


解释:对于大集群而言,建议设置 Map-Reduce 的输出为压缩的数据,而对于小集群,则不需要。


  1. 优化 Mapper 和 Reducer 的个数


属性:


mapreduce.tasktracker.map.tasks.maximum


mapreduce.tasktracker.reduce.tasks.maximum


解释:以上两个属性分别为一个单独的 Job 任务可以同时运行的 Map 和 Reduce 的数量。


设置上面两个参数时,需要考虑 CPU 核数、磁盘和内存容量。假设一个 8 核的 CPU,业务内容非常消耗 CPU,那么可以设置 map 数量为 4,如果该业务不是特别消耗 CPU 类型的,那么可以设置 map 数量为 40,reduce 数量为 20。这些参数的值修改完成之后,一定要观察是否有较长等待的任务,如果有的话,可以减少数量以加快任务执行,如果设置一个很大的值,会引起大量的上下文切换,以及内存与磁盘之间的数据交换,这里没有标准的配置数值,需要根据业务和硬件配置以及经验来做出选择。


在同一时刻,不要同时运行太多的 MapReduce,这样会消耗过多的内存,任务会执行的非常缓慢,我们需要根据 CPU 核数,内存容量设置一个 MR 任务并发的最大值,使固定数据量的任务完全加载到内存中,避免频繁的内存和磁盘数据交换,从而降低磁盘 IO,提高性能。


大概估算公式:map = 2 + 2/3cpu_corereduce = 2 + 1/3cpu_core
复制代码

5. HBase 优化

  1. 在 HDFS 的文件中追加内容


HDFS 不是不允许追加内容么?没错,请看背景故事:



属性:dfs.support.append


文件:hdfs-site.xml、hbase-site.xml


解释:开启 HDFS 追加同步,可以优秀的配合 HBase 的数据同步和持久化。默认值为 true。


  1. 优化 DataNode 允许的最大文件打开数


属性:dfs.datanode.max.transfer.threads


文件:hdfs-site.xml


解释:HBase 一般都会同一时间操作大量的文件,根据集群的数量和规模以及数据动作,设置为 4096 或者更高。默认值:4096


  1. **优化延迟高的数据操作的等待时间


属性:dfs.image.transfer.timeout


文件:hdfs-site.xml


解释:如果对于某一次数据操作来讲,延迟非常高,socket 需要等待更长的时间,建议把该值设置为更大的值(默认 60000 毫秒),以确保 socket 不会被 timeout 掉。


  1. 优化数据的写入效率


属性:


mapreduce.map.output.compress


mapreduce.map.output.compress.codec


文件:mapred-site.xml


解释:开启这两个数据可以大大提高文件的写入效率,减少写入时间。第一个属性值修改为 true,第二个属性值修改为:org.apache.hadoop.io.compress.GzipCodec


  1. 优化 DataNode 存储


属性:dfs.datanode.failed.volumes.tolerated


文件:hdfs-site.xml


解释:默认为 0,意思是当 DataNode 中有一个磁盘出现故障,则会认为该 DataNode shutdown 了。如果修改为 1,则一个磁盘出现故障时,数据会被复制到其他正常的 DataNode 上,当前的 DataNode 继续工作。


  1. 设置 RPC 监听数量


属性:hbase.regionserver.handler.count


文件:hbase-site.xml


解释:默认值为 30,用于指定 RPC 监听的数量,可以根据客户端的请求数进行调整,读写请求较多时,增加此值。


  1. 优化 HStore 文件大小


属性:hbase.hregion.max.filesize


文件:hbase-site.xml


解释:默认值 10737418240(10GB),如果需要运行 HBase 的 MR 任务,可以减小此值,因为一个 region 对应一个 map 任务,如果单个 region 过大,会导致 map 任务执行时间过长。该值的意思就是,如果 HFile 的大小达到这个数值,则这个 region 会被切分为两个 Hfile。


  1. 优化 hbase 客户端缓存


属性:hbase.client.write.buffer


文件:hbase-site.xml


解释:用于指定 HBase 客户端缓存,增大该值可以减少 RPC 调用次数,但是会消耗更多内存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少 RPC 次数的目的。


  1. 指定 scan.next 扫描 HBase 所获取的行数


属性:hbase.client.scanner.caching


文件:hbase-site.xml


解释:用于指定 scan.next 方法获取的默认行数,值越大,消耗内存越大。

6. 内存优化

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

7. JVM 优化

涉及文件:hbase-env.sh


  1. 并行 GC


参数:·-XX:+UseParallelGC·


解释:开启并行 GC


  1. 同时处理垃圾回收的线程数


参数:-XX:ParallelGCThreads=cpu_core – 1


解释:该属性设置了同时处理垃圾回收的线程数。


  1. 禁用手动 GC


参数:-XX:DisableExplicitGC


解释:防止开发人员手动调用 GC

8. Zookeeper 优化

  1. 优化 Zookeeper 会话超时时间


参数:zookeeper.session.timeout


文件:hbase-site.xml


解释:In hbase-site.xml, set zookeeper.session.timeout to 30 seconds or less to bound failure detection (20-30 seconds is a good start)。


该值会直接关系到 master 发现服务器宕机的最大周期,默认值为 30 秒,如果该值过小,会在 HBase 在写入大量数据发生而 GC 时,导致 RegionServer 短暂的不可用,从而没有向 ZK 发送心跳包,最终导致认为从节点 shutdown。一般 20 台左右的集群需要配置 5 台 zookeeper。

参考文档:

  1. 美团数据平台及数仓建设实践,超十万字总结

  2. 上百本优质大数据书籍,附必读清单(大数据宝藏)

  3. 五万字 | 耗时一个月整理出这份Hadoop吐血宝典

发布于: 2021 年 11 月 26 日阅读数: 3
用户头像

InfoQ签约作者 2020.11.10 加入

文章首发于公众号:五分钟学大数据。大数据领域原创技术号,深入大数据技术

评论

发布
暂无评论
HBase 调优详细剖析