HDFS与HBase优化策略

Hdfs优化策略

Hdfs本身的优化
  • 文件块block的大小设置:
    (1). 数据块的备份数(复制因子,默认3)
    (2). HDFS数据块的大小,默认值是128M(hdfs的大小应当根据两个因素来确定,一个是系统中常见文件的大小,一个是系统硬盘的速度,最优值应当接近硬盘速度)
  • hdfs小文件归档,hdfs中可能存储了大量的小文件,及其影响性能,我们可以对其进行归档,生成har文件,将小文件合并为一个块大小的har文件
    (执行:Hadoop archive–archiveName myhar.har –p /user/Ubuntu /user/my
    查看:Hdfs dfs –lsrhar:///user/my/myhar.har
    解归档:Hdfs dfs –cphar:///user/my/my.har /user/your)
  • 选用合适的压缩格式 我们采用的是 默认压缩格式+ORC 格式(ORC和parquet格式对比,join性能极高,压缩比高)
  • NameNode中用于处理RPC调用的线程数,默认为10; (dfs.namenode.handler.count)
  • DataNode中用于处理RPC调用的线程数,默认为3; (dfs.datanode.handler.count)
  • HDFS数据存储目录。将数据存储分布在各个磁盘上可充分利用节点的I/O读写性能,建议多个; (dfs.datanode.data.dir)
  • Hadoop临时目录,默认为系统目录/tmp,推荐多个,可提高HDFS和MapReduce的I/O效率; (hadoop.tmp.dir)
  • HDFS文件缓冲区大小,默认为4096(即4K);( io.file.buffer.size)
  • HDFS清理回收站的时间周期,单位为分钟。默认为0,一般设置为4~7;(fs.trash.interval)
  • DataNode保留空间大小,单位为字节保留部分磁盘空间工其他应用程序使用(dfs.datanode.du.reserved)
  • 启用机架感知(较大的集群,建议启用HDFS的机架感应功能,使HDFS优化数据块备份的分布, 节点较少时不开启)
  • datanode 可同時处理的最大文件数量,推荐将这个值调大,默认是256,最大值可以配置为65535;(dfs.datanode.max.xcievers)
  • 避免脏读写操作(不使用失效的datanode数据) (dfs.namenode.avoid.read.stale.datanode;dfs.namenode.avoid.write.stale.datanode)
HDFS小文件弊端

​ HDFS上每个文件都要在NameNode上建立一个索引,这个索引的大小约为150byte,这样当小文件比较多的时候,就会产生很多的索引文件,一方面会大量占用NameNode的内存空间,另一方面就是索引文件过大使得索引速度变慢。

HDFS小文件解决方案

1.在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS。

2.在业务处理之前,在HDFS上使用MapReduce程序对小文件进行合并。

3.在MapReduce处理时,可采用CombineTextInputFormat提高效率。

具体:

  • Hadoop Archive:是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样就减少了NameNode的内存使用。

  • Sequence Fileequence File由一系列的二进制key/value组成,如果key为文件名, value为文件内容,则可以将大批小文件合并成一个大文件。

  • CombineFilelnputFormat是一种新的InputFormat,用于将多个文件合并成一个单独的Split,另外,它会考虑数据的存储位置。

  • 开启JVM重用:Hadoop的默认配置通常是使用派生JVM来执行map和Reduce任务的。这时JVM的启动和关闭过程可能会造成相当大的开销,尤其是执行的job包含有成百上千task任务的情况。JVM重用可以使得JVM实例在同一个job中重新使用N次。对于大量小文件Job,可以开启JVM重用会减少45%运行时间。JVM重用原理:一个Map运行在一个JVM上,开启重用的话,该Map在JVM上运行完毕后, JVM继续运行其他Map.
    具体设置: mapreduce.job.jvm.numtasks值在10-20之间

linux服务器为配合HDFS进行的优化

1.1 优化文件系统(推荐使用EXT4和XFS文件系统,相比较而言,更推荐后者,因为XFS已经帮我们做了大量的优化。为服务器存储目录挂载时添加noatime属性)
1.2 预读技术可以有效的减少磁盘寻道次数和应用的I/O等待时间,增加Linux文件系统预读缓冲区的大小(默认为256 sectors,128KB),可以明显提高顺序文件的读性能,
建议调整到1024或2048 sectors。预读缓冲区的设置可以通过blockdev命令来完成。
1.3 放弃RAID和LVM磁盘管理方式,选用JBOD
1.4 内存调优,避免使用swap分区,通过配置降低swap使用的可能性。
1.5 调整内存分配策略
1.6 网络参数调优

HBase性能优化

RowKey设计(目的:散列逐步put进来的数据)
  • 生成随机数、hash、散列值

    例如:
    原 本 rowKey 为 1001 的 , SHA1 后 变 成 :
    dd01903921ea24941c26a48f2cec24e0bb0e8cc7

  • 字符串反转

    例如:20210924000001 转成 10000042901202

  • 字符串拼接

    例如:20210924000001_a12e

内存优化

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

基础优化

1.允许在 HDFS 的文件中追加内容
hdfs-site.xml、hbase-site.xml
属性:dfs.support.append
解释:开启 HDFS 追加同步,可以优秀的配合 HBase 的数据同步和持久化。默认值为 true。

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

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

4.优化数据的写入效率
mapred-site.xml
属性:
mapreduce.map.output.compress
mapreduce.map.output.compress.codec
解释:开启这两个数据可以大大提高文件的写入效率,减少写入时间。第一个属性值修改为
true,第二个属性值修改为:org.apache.hadoop.io.compress.GzipCodec 或者其
他压缩方式。

5.设置 RPC 监听数量
hbase-site.xml
属性:Hbase.regionserver.handler.count
解释:默认值为 30,用于指定 RPC 监听的数量,可以根据客户端的请求数进行调整,读写
请求较多时,增加此值。

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

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

8.指定 scan.next 扫描 HBase 所获取的行数
hbase-site.xml
属性:hbase.client.scanner.caching
解释:用于指定 scan.next 方法获取的默认行数,值越大,消耗内存越大。

9.flush、compact、split 机制
当 MemStore 达到阈值,将 Memstore 中的数据 Flush 进 Storefile;compact 机制则是把 flush
出来的小文件合并成大的 Storefile 文件。split 则是当 Region 达到阈值,会把过大的 Region
一分为二。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT二叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值