安装Impala时需要调整几个HDFS参数,以达到最佳性能:

1.dfs.client.read.shortcircuit(必选):

当设置这个参数后,客户端callblockSeekTo(target)会去获取一个BlockReaderLocal,不过这里注意,当block复制未完成时不可进行shortcircuit read(HDFS-2757:https://issues.apache.org/jira/browse/HDFS-2757),其中的数据输入流和校验输入流(都是FileInputStream类型)是通过DomainSocket构建,因此需要正确设置参数dfs.domain.socket.path(当配置该参数时,由于创建输入流需要用到native library来处理fd,因此如果没有找到libhadoop或者版本不匹配,则会报异常);之后读取都是直接进行本地读而不用走IPC.

另外,还有另外几个相关的参数:dfs.client.read.shortcircuit.streams.cache.sizedfs.client.read.shortcircuit.streams.cache.expiry.ms以及dfs.client.read.shortcircuit.skip.checksumdfs.client.read.shortcircuit.buffer.size.其中,在客户端读取前会创建一个FileinputStreamCache,就是由前两个参数控制大小和过期时间的,其中key就是Datanode+block;后两个参数就是决定是否跳过校验以及校验的块大小.

2.dfs.datanode.hdfs-blocks-metadata.enabled(可选)

enable这个特性后,客户端可以call getFileBlockStorageLocations这个API来获取Block(BLOCKLOCATION)disk(VOLUMNS)的映射:

首先并行(并行度和超时时间通过dfs.client.file-block-storage-locations.num-threadsdfs.client.file-block-storage-locations.timeout决定)对Datanode进行RPC CALL获取所有副本的HdfsBlockMetadata,之后利用该信息构建映射并返回.