本文为您介绍在E-MapReduce(简称EMR)上使用HDFS进行实时计算场景化配置的一些建议,以便优化HDFS的稳定性。

前提条件

已创建集群,详情请参见创建集群

调整DataNode Xceiver连接数

  • 背景:通常实时计算框架会打开较多的HDFS文件写入流(Stream),方便不断地向HDFS写入新的数据。HDFS允许同时打开的文件数量是有限的,受限于DataNode参数dfs.datanode.max.transfer.threads
  • 建议:您可以在EMR控制台HDFS服务的配置页面,在配置搜索区域,搜索参数dfs.datanode.max.transfer.threads,该参数表示DataNode处理读或写流的线程池大小,默认值为4096。当您在日志目录下或者客户端运行日志中发现如下报错时,可以适当地调大该参数值:
    • 在日志目录/var/log/hadoop-hdfs/下观察DataNode服务端日志,发现如下报错。
      java.io.IOException: Xceiver count 4097 exceeds the limit of concurrent xcievers: 4096
              at org.apache.hadoop.hdfs.server.datanode.DataXceiverServer.run(DataXceiverServer.java:150)
    • 在客户端运行日志中发现如下报错。
      DataXceiver error processing WRITE_BLOCK operation  src: /10.*.*.*:35692 dst: /10.*.*.*:50010
      java.io.IOException: Premature EOF from inputStream

配置预留磁盘空间

  • 背景:HDFS对于打开的文件写入流,会预先保留128 MB Blocksize的磁盘剩余空间,从而确保该文件可以正常写入。如果该文件实际大小很小,例如仅为8 MB,则当文件调用close方法关闭输入流时只会占用8 MB的磁盘空间。

    通常实时计算框架会打开较多的HDFS文件写入流,如果同时打开很多文件, 则HDFS会预先保留较多的磁盘空间。如果磁盘剩余空间不够,则会导致创建文件失败。

  • 建议:如果同时打开的文件数为N,则集群至少需要预留的磁盘空间为N * 128 MB * 副本数