hadoop jar執行報錯java.io.FileNotFoundException: /tmp/hadoop-unjarxxx(No space left on device)終極解決方案

原因

MapReduce提交過程中,會把jar解壓到/tmp目錄下生成臨時文件夾hadoop-unjarxxx,任務執行完成後,會主動刪除這個臨時目錄hadoop-unjarxxx, 但是我們偶爾會遇到一些情況,導致hadoop任務異常結束,沒有清理掉這個任務的臨時目錄,臨時文件就會越來越多了。
可能導致/tmp磁盤空間不足或者inode索引不足導致報錯,因此使用下面命令查找錯誤,查看使用率

df -h  查看磁盤
df -i 查看inode

解決

思路就是降低jar包大小並定時清除/tmp/hadoop-unjarxxx過期文件夾

方案一、將依賴包提前上傳至HDFS,適用於編程代碼中設置
1.將依賴jar包上傳至hdfs目錄,如/app/hive/libs/
2.job.addFileToClassPath添加所有依賴

Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
...
...
...
String depJarPath = "/app/hive/libs/";
String depJarNames = "orc-mapreduce-1.2.1.jar:orc-core-1.2.1.jar:hive-storage-api-2.1.1-pre-orc.jar:aircompressor-0.3.jar";
for(String depJarName : depJarNames.split(":")){
   job.addFileToClassPath(new Path(depJarPath + depJarName))
}

3.定時任務清除/tmp/hadoop-unjarxxx過期文件夾,這個可用shell或者py實現,目前還沒弄,後面會貼上代碼

方案二、設置HADOOP_CLASSPATH環境變量(適用於代碼無法設置,不太推薦)
本人採用的方案二,因爲使用的Sqoop java api提交任務,無法拿到job對象,也就無法使用方案一
1.本人使用的shade打包方式,可以有選擇性的排除依賴,使用provided配置,我將hadoop、hive、sqoop相關依賴都排除,jar由130M+減小到10M,配置參考如下

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>${hadoop.version}</version>
            <scope>provided</scope>
        </dependency>

2.編寫start.sh腳本,將排除的hadoop相關依賴路徑添加到HADOOP_CLASSPATH環境變量,如下:

#!/bin/bash
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/cloudera/parcels/CDH/lib/hive/lib/*:/opt/cloudera/parcels/CDH/lib/sqoop/sqoop-1.4.6-cdh5.15.2.jar:/opt/cloudera/parcels/CDH/lib/sqoop/lib/*
hadoop jar xxx.jar mainClass

當然也可以簡單打包jar,將集羣不存在的依賴上傳到提交任務機器上,然後在HADOOP_CLASSPATH添加路徑,這樣jar就可以減少到最小

3.定時任務清除/tmp/hadoop-unjarxxx過期文件夾,這個可用shell或者py實現,目前還沒弄,後面會貼上代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章