原因
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實現,目前還沒弄,後面會貼上代碼