1. 程式人生 > 其它 >HDFS小檔案處理

HDFS小檔案處理

缺點:

  • 儲存層面:1個檔案塊,佔用namenode多大記憶體150位元組

​ 128G能儲存多少檔案塊? 128 g* 1024m1024kb1024byte/150位元組 = 9.1億檔案塊

  • 計算層面:每個小檔案都會起到一個MapTask,1個MapTask預設記憶體1G。浪費資源

解決方法:

  • 採用har歸檔方式,將小檔案歸檔

將多個小檔案打包成一個字尾為.har檔案

  • 採用CombineTextInputFormat

將多個小檔案從邏輯上規劃到一個切片中,交給一個 MapTask 處理。

  • 小檔案場景開啟JVM重用;如果沒有小檔案,不要開啟JVM重用,因為會一直佔用使用到的task卡槽,直到任務完成才釋放。

Hadoop裡每個task任務的執行都會啟動JVM程序來執行。

啟動一個新的JVM程序將耗時1秒左右,對於執行時間較長(比如1分鐘以上)的job影響不大,但如果都是時間很短的task,那麼頻繁啟停JVM會有開銷。

注意:JVM重用技術不是指同一Job的兩個或兩個以上的task可以同時運行於同一JVM上,而是排隊按順序執行。

Hadoop中有個引數是mapred.job.reuse.jvm.num.tasks,預設是1,表示一個JVM上最多可以順序執行的task數目(屬於同一個Job)是1。也就是說一個task啟一個JVM。

一個tasktracker最多可以同時執行的task數目由mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximum決定,並且這兩個引數在mapred-site.xml中設定。預設是2,注意這個數字指的是同一個job的task數量。

如果task屬於不同的job,那麼JVM重用機制無效,不同job的task需要不同的JVM來執行。

​ JVM重用可以使得JVM例項在同一個job中重新使用N次,N的值可以在Hadoop的mapred-site.xml檔案中進行配置。通常在10-20之間

<property>
    <name>mapreduce.job.jvm.numtasks</name>
    <value>10</value>
    <description>How many tasks to run per jvm,if set to -1 ,there is  no limit</description>
</property>