本文為您介紹在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/emr/hadoop/下觀察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 * 副本數