Docker Ubuntu环境下Hadoop ImportTsv导入CSV失败求助
Hadoop ImportTsv 容器退出码1及ClassCastException 排查方案
核心问题定位
容器退出码1 + java.lang.ClassCastException 通常是数据类型不匹配、配置参数错误或依赖类加载冲突导致的,结合ImportTsv场景,优先从以下方向排查:
1. 检查ImportTsv命令参数格式
确保命令中指定的列类型与CSV数据完全匹配,避免类型声明与实际数据不符:
- 正确命令模板(以导入HBase为例):
hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-3.3.4.jar \ -Dmapreduce.job.name=ImportEmpData \ -Dmapreduce.map.output.key.class=org.apache.hadoop.io.Text \ -Dmapreduce.map.output.value.class=org.apache.hadoop.io.Text \ -mapper org.apache.hadoop.mapred.lib.IdentityMapper \ -reducer org.apache.hadoop.mapred.lib.IdentityReducer \ -input /path/to/emp_data.csv \ -output /path/to/hdfs/output \ -inputformat org.apache.hadoop.mapred.TextInputFormat \ -outputformat org.apache.hadoop.hbase.mapreduce.TsvImporterOutputFormat \ -Dimporttsv.columns=HBASE_ROW_KEY,info:emp_id,info:emp_name,info:salary
注意:若导入HBase,需保证importtsv.columns的列类型与HBase表列族定义一致,比如薪资列是数值类型就不能传入字符串格式数据
2. 排查Hadoop配置文件兼容性
检查核心配置是否符合Hadoop 3.3.4 + OpenJDK 8要求:
core-site.xml:确认hadoop.common.configuration.version设为3.3.4,无过时配置项- 若涉及HBase,检查
hbase-site.xml中hbase.client.version与Hadoop版本兼容,避免跨版本类加载冲突 - 验证
HADOOP_CLASSPATH未混入不同版本依赖:
echo $HADOOP_CLASSPATH # 确保输出仅包含Hadoop 3.3.4及对应版本的依赖Jar,无旧版本Jar
3. 分析ClassCastException具体堆栈
从日志中提取完整异常信息,比如:
java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.IntWritable
这种情况直接对应输出类型与Reducer期望类型不匹配,需在命令中显式指定mapreduce.job.output.key.class和mapreduce.job.output.value.class参数,或调整Mapper/Reducer的输出类型。
4. 验证CSV数据格式
- 检查CSV文件分隔符是否与命令指定一致:默认是制表符,若实际用逗号需添加
-Dimporttsv.separator=,参数 - 确认每行列数与
importtsv.columns声明的列数一致,无缺失或多余列 - 排查空值、特殊字符未转义问题,可通过
head -20 emp_data.csv查看前20行数据验证
5. 容器环境权限与路径检查
- 确保HDFS输入路径
/path/to/emp_data.csv存在,且容器内Hadoop用户拥有读权限 - 确认输出路径
/path/to/hdfs/output不存在(Hadoop不允许输出路径已存在) - 验证OpenJDK 8安装完整性:
java -version # 确认输出为openjdk version "1.8.0_xxx"
内容的提问来源于stack exchange,提问作者Machkour Oke
相关产品推荐
相关产品推荐

