HDFS Read调优

在基于 HDFS 存储的 HBase 中,主要有两种调优方式:

  1. 绕过RPC的选项,称为short circuit reads
  2. 开启让HDFS推测性地从多个datanode读数据的选项,称为 hedged reads

Short-Circuit Reads

一般来说,HBase RegionServer 与 HDFS DataNode在一起,所以可以实现很好的数据本地化。但是在早期Hadoop 1.0.0版本中,RegionServer 在与 DataNode通过RPC通信时,与其他常规客户端一样,需要经过整个RPC通信过程。在 Hadoop 1.0.0 版本之后,加入了short-circuit read选项,它可以完全绕过RPC栈,通过本地clients直接从底层文件系统读数据。

Hadoop 2.x 之后进一步优化了这个实现。当前DataNode与HDFS客户端(HBase也是其中一个)可以使用一个称为file descriptor passing的功能,使得数据交换全部发生在OS kernel层。相较于之前的实现会更快,更高效。使得多个进程在同一个实例上进行高效地交互。

在Hadoop中,可以参考以下官方文档配置启用short-circuit reads:

https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/ShortCircuitLocalReads.html

下面是一个配置参考,需要在hbase-site.xml 与 hdfs-site.xml 两个配置文件中均配置,且配置完后需重启进程:

<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
<description>
This configuration parameter turns on short-circuit local reads.
</description> </property>
<property>
<name>dfs.domain.socket.path</name>
<value>/var/lib/hadoop-hdfs/dn_socket</value>
<description>
Optional. This is a path to a UNIX domain socket that will be used for
communication between the DataNode and local HDFS clients.
If the string "_PORT" is present in this path, it will be replaced by the
TCP port of the DataNode.
</description>
</property>

需要注意的是:dfs.domain.socket.path指定的文件(可以先不存在)的owner必须为OS的root用户,或者是运行datanode服务的用户。

最后,short-circuit read buffers的默认大小由dfs.client.read.shortcircuit.buffer.size指定,对于很繁忙的HBase 集群来说,默认值可能会比较高。在HBase中,如果没有没有显示指定此值,则会从默认的 1MB 直接降为 128KB(使用的是hbase.dfs.client.read.shortcircuit.buffer.size 属性,默认为128KB)。

在HBase 中的HDFS客户端,会为每个打开的data block分配一个direct byte buffer ,大小为参数hbase.dfs.client.read.shortcircuit.buffer.size 指定大小。此功能可以让HBase永久保持它的HDFS文件打开,所以会很快地增加。

Hedged Reads

Hedged reads是HDFS的一个功能,在Hadoop 2.4.0之后引入。一般来说,每个读请求都会由生成的一个线程处理。在Hedged reads 启用后,客户但可以等待一个预配置的时间,如果read没有返回,则客户端会生成第二个读请求,访问同一份数据的另一个block replica。之后,其中任意一个read 先返回的话,则另一个read请求则被丢弃。

Hedged reads使用的场景是:解决少概率的slow read(可能由瞬时错误导致,例如磁盘错误或是网络抖动等)。

HBase region server 是一个 HDFS client,所以我们可以在HBase中启用hedged reads,通过在 RegionServer 中的 hbase-site.xml 配置增加以下参数,并且根据实际环境对参数进行调整:

  • def.client.hedged.read.threadpool.size:默认值为0。指定有多少线程用于服务hedged reads。如果此值设置为0(默认),则hedged reads为disabled状态
  • dfs.client.hedged.read.threshold.millis:默认为500(0.5秒):在spawning 第二个线程前,等待的时间。

下面是一个示例配置,设置等待阈值为10ms,并且线程数为20:

<property>
<name>dfs.client.hedged.read.threadpool.size</name>
<value>20</value>
</property> <property>
<name>dfs.client.hedged.read.threshold.millis</name>
<value>10</value>
</property>

需要注意的是:hedged reads 在HDFS中的功能,类似于MapReduce中的speculative execution:需要消耗额外的资源。例如,根据集群的负载与设定,它可能需要触发很多额外的读操作,且大部分是发送到远端的block replicas。产生的额外的I/O、以及网络可能会对集群性能造成较大影响。对此,需要在生产环境中的负载进行测试,以决定是否使用此功能。

HBase 中读 HDFS 调优的更多相关文章

  1. (转)WebSphere 中池资源调优 - 线程池、连接池和 ORB

    WebSphere 中池资源调优 - 线程池.连接池和 ORB 来自:https://www.ibm.com/developerworks/cn/websphere/library/techartic ...

  2. HBase笔记4(调优)

    Master/Region Server调优 JVM调优 默认的RegionServer内存是1G,而Memstore默认占40%,即400M,实在是太小了,可以通过HBASE_HEAPSIZE参数修 ...

  3. HBase的几种调优(GC策略,flush,compact,split)

    一:GC的调优 1.jvm的内存 新生代:存活时间较短,一般存储刚生成的一些对象 老年代:存活时间较长,主要存储在应用程序中生命周期较长的对象 永久代:一般存储meta和class的信息 2.GC策略 ...

  4. 082 HBase的几种调优(GC策略,flush,compact,split)

    一:GC的调优 1.jvm的内存 新生代:存活时间较短,一般存储刚生成的一些对象 老年代:存活时间较长,主要存储在应用程序中生命周期较长的对象 永久代:一般存储meta和class的信息 2.GC策略 ...

  5. HBase 管理,性能调优

    设置 Hadoop 来扩展磁盘 I/O 现代服务器通常有多个磁盘硬件来提供大存储能力.这些磁盘通常配置成 RAID 阵列,作为它们的出厂设置.这在很多情况下是有益的,但对 Hadoop 却不是. Ha ...

  6. 数据迁移过程中hive sql调优

    本文记录的是,在数据处理过程中,遇到了一个sql执行很慢,对一些大型的hive表还会出现OOM,一步一步通过参数的设置和sql优化,将其调优的过程. 先上sql ) t where t.num =1) ...

  7. 013 Spark中的资源调优

    1.平常的资源使用情况 2.官网 3.资源参数调优 cores memory JVM 4.具体参数 可以在--conf参数中给定资源配置相关信息(配置的一般是JVM的一些垃圾回收机制) --drive ...

  8. hdfs调优

    本文章来自 hackershell.cn,转载请标注出处 描述 这篇文章主要从一些配置设置相关方面去调优Hadoop集群的笔记,内容来自网上或一些实践经验 1.HDFS审计日志 HDFS审计日志是一个 ...

  9. Hadoop- MapReduce在实际应用中常见的调优

    1.Reduce Task Number 通常来说一个block就对应一个map任务进行处理,reduce任务如果人工不去设置干预的话就一个reduce.reduce任务的个数可以通过在程序中设置   ...

随机推荐

  1. BZOJ#2121. 字符串游戏 [区间dp]

    // powered by c++11 // by Isaunoya #include<bits/stdc++.h> #define rep(i , x , y) for(register ...

  2. css揭秘 一

    当某些值相互依赖是,应该把它们的相互关系用代码表达出来 font-size: 20px; line-height: 1.5; // 行高是字体的1.5倍 当改变某个参数时候,做到只改尽量少的地方,最好 ...

  3. USB闪存驱动器未显示在MacOS的Finder或磁盘工具上?为什么Mac无法识别USB该如何解决?

    您可能会在Mac上无法显示的闪存驱动器上形成困扰.您确定驱动器正常,但Mac计算机无法检测到.  阅读这篇文章,闪存驱动器未显示在MacOS的Finder或磁盘工具上?为什么Mac无法识别USB该如何 ...

  4. 1.(group by)如何让group by分组后,每组中的所有数据都显示出来

    问题描述:表如下,如何让这个表按device_id这个字段分组,且组中的每条数据都查寻出来?(假如说这个表名为:devicedata) 错误答案:select * from devicedata GR ...

  5. 判断合同金额是否可以转整形和sql语句中添加条件语句

    主要用到sqlserver语句中的判断语法 if (min_hetonge.Length > 0 && int.TryParse(min_hetonge, out min)) s ...

  6. 问题 C: 神奇的口袋

    #include <cstdio> using namespace std; int n1; int nums[99]; int help(int i, int sum) { if (su ...

  7. nginx反向代理(1)

    目录 反向代理 概述 nginx代理 proxy_pass 加与不加/ ================================================================ ...

  8. matlab HW求法笔记

    for i=1:9400 Sbox_out_11(i) = length(findstr(num2str(dec2bin(Sbox_out_1(i,:))),'1')); end

  9. 0级搭建类009-Fedora 30 安装(F30) 公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  10. threadpool 实例介绍第二篇