Hadoop MapReduce ShuffleError: error in shuffle

参数:mapreduce.reduce.shuffle.input.buffer.percent   

默认值:0.70   

含义:The percentage of memory to be allocated from the maximum heap size to storing map outputs during the shuffle.

参数:mapreduce.reduce.shuffle.parallelcopies   

默认值:5   

含义:The default number of parallel transfers run by reduce during the copy(shuffle) phase.


上面两个参数表示了hadoop从map向reduce传输数据shuffle的时候所用的内存buffer限制,第一个参数

表示每个shuffle进程占用的memery比例。第二个参数表示最多有几个进程,两个参数的乘积不能最好

不要大于1,不然当同时有5个shuffle时,会占用太多内存,导致报异常。注意这里说的内存值得是java

指定的-Xmx的最大堆内存。


如果修改完上面两个参数还是报错的话,需要进行如下修改:

Hadoop伪分布式模式运行时,运行一个Job报上面错误,原因是由于Hadoop的最大对内存过小,

hadoop默认分配的最大堆内存大小为1000MB,有时候跑的job所需的内存可能比这个数值要大

很多,这是修改运行是的最大大小并不是mapreduce.map.java.opts或者mapreduce.reduce.java.opts

参数的值,他们是在分布式环境下的配置参数。

此时我们需要修改的代码位于hadoop-env.sh文件中(该文件位于HADOOP_HOME_DIR/etc/hadoop

目录下),在该文件中搜索“HADOOP_HEAPSIZE”参数,直接将该行的注释去掉,末尾增加你

需要设置的内存大小,单位默认为MB,比如你想设置最大对内存为4GB,你需要填写4096,

修改完成该行的内容为:

export HADOOP_HEAPSIZE=4096

修改完之后,重启hadoop服务,所有的-Xmx=1000都变为了-Xmx=4096:

 4271 ?        Sl     0:14 /usr/local/jdk/bin/java -Dproc_namenode -Xmx4096m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/usr/local/hadoop/logs -
 4431 ?        Sl     0:11 /usr/local/jdk/bin/java -Dproc_datanode -Xmx4096m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/usr/local/hadoop/logs -
 4660 ?        Sl     0:12 /usr/local/jdk/bin/java -Dproc_secondarynamenode -Xmx4096m -Djava.net.preferIPv4St

这是再启动job,所使用的-Xmx参数也变为了:4096m

/usr/local/jdk/bin/java -Xmx4096m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir



[root@hadoop01 jars]# hadoop jar film.jar CleanDriver /film/input /film/outputs/cleandata 25/04/02 17:25:34 INFO client.RMProxy: Connecting to ResourceManager at hadoop01/192.168.20.20:8032 25/04/02 17:25:35 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this. 25/04/02 17:25:35 INFO input.FileInputFormat: Total input paths to process : 2 25/04/02 17:25:35 INFO mapreduce.JobSubmitter: number of splits:2 25/04/02 17:25:35 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1743583799083_0005 25/04/02 17:25:35 INFO impl.YarnClientImpl: Submitted application application_1743583799083_0005 25/04/02 17:25:35 INFO mapreduce.Job: The url to track the job: http://hadoop01:8088/proxy/application_1743583799083_0005/ 25/04/02 17:25:35 INFO mapreduce.Job: Running job: job_1743583799083_0005 25/04/02 17:25:41 INFO mapreduce.Job: Job job_1743583799083_0005 running in uber mode : false 25/04/02 17:25:41 INFO mapreduce.Job: map 0% reduce 0% 25/04/02 17:25:49 INFO mapreduce.Job: map 100% reduce 0% 25/04/02 17:25:55 INFO mapreduce.Job: map 100% reduce 17% 25/04/02 17:26:01 INFO mapreduce.Job: map 100% reduce 33% 25/04/02 17:26:04 INFO mapreduce.Job: map 100% reduce 50% 25/04/02 17:26:05 INFO mapreduce.Job: map 100% reduce 67% 25/04/02 17:26:06 INFO mapreduce.Job: map 100% reduce 100% 25/04/02 17:26:06 INFO mapreduce.Job: Job job_1743583799083_0005 completed successfully 25/04/02 17:26:06 INFO mapreduce.Job: Counters: 50 File System Counters FILE: Number of bytes read=36 FILE: Number of bytes written=982026 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=17347 HDFS: Number of bytes written=0 HDFS: Number of read operations=24 HDFS: Number of large read operations=0 HDFS: Number of write operations=12 Job Counters Killed reduce tasks=1 Launched map tasks=2 Launched reduce tasks=6 Data-local map tasks=2 Total time spent by all maps in occupied slots (ms)=9878 Total time spent by all reduces in occupied slots (ms)=55847 Total time spent by all map tasks (ms)=9878 Total time spent by all reduce tasks (ms)=55847 Total vcore-milliseconds taken by all map tasks=9878 Total vcore-milliseconds taken by all reduce tasks=55847 Total megabyte-milliseconds taken by all map tasks=10115072 Total megabyte-milliseconds taken by all reduce tasks=57187328 Map-Reduce Framework Map input records=144 Map output records=0 Map output bytes=0 Map output materialized bytes=72 Input split bytes=219 Combine input records=0 Combine output records=0 Reduce input groups=0 Reduce shuffle bytes=72 Reduce input records=0 Reduce output records=0 Spilled Records=0 Shuffled Maps =12 Failed Shuffles=0 Merged Map outputs=12 GC time elapsed (ms)=535 CPU time spent (ms)=2820 Physical memory (bytes) snapshot=1039224832 Virtual memory (bytes) snapshot=16491360256 Total committed heap usage (bytes)=453517312 Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0 File Input Format Counters Bytes Read=17128 File Output Format Counters Bytes Written=0
最新发布
04-03
<think>好的,我现在需要帮用户分析他们执行Hadoop作业时的输出日志。首先,用户运行的是`hadoop jar film.jar CleanDriver /film/input /film/outputs/cleandata`这个命令,看起来是在处理电影数据,进行数据清洗。 首先看日志结构。开头是连接到ResourceManager,说明YARN集群正常启动。接下来有个警告,关于没有使用Tool接口,可能影响命令行参数解析,不过作业还是提交成功了。这个警告可能需要用户后续优化代码,但暂时不影响执行。 然后输入路径处理了两个文件,分成了两个map任务。任务提交后,Application ID生成,用户可以通过提供的URL监控作业状态。作业运行过程中,map任务很快完成到100%,但reduce阶段有波动,从0%逐步到100%。这里可能需要注意reduce任务的数量,日志显示启动了6个reduce任务,但有一个被终止,可能资源竞争或配置问题,但最终作业成功完成。 计数器部分需要详细分析。File System Counters显示HDFS读取了17347字节,但写入0,这可能有问题。正常情况下清洗后的数据应该输出,所以这里可能输出路径为空,或者代码逻辑未正确写数据。需要检查CleanDriver的Mapper或Reducer是否漏掉了输出步骤,或者是否配置了正确的OutputFormat。 Map-Reduce框架计数器显示Map输入144条记录,但输出0条,这说明Mapper可能没有产生任何输出。这会导致后续的Reduce阶段也没有数据,最终输出为空。用户需要检查Mapper逻辑是否正确处理输入数据,是否有过滤条件过于严格导致所有数据被丢弃,或者是否有bug导致未能正确写入上下文。 另外,Reduce阶段有6个任务启动,但有一个被终止,可能由于节点故障或资源不足,但最终其他任务完成。需要关注是否有频繁的任务重试,可能影响性能。 总结问题可能出在Mapper未正确输出数据,或者OutputFormat配置错误,导致最终HDFS没有写入结果。建议用户检查Mapper和Reducer代码,确保在处理后调用了context.write,并验证输出路径是否正确,是否有权限问题。同时,处理Tool接口的警告可以优化参数解析,避免未来潜在问题。</think>以下是对该Hadoop命令执行结果的分步解析: $\boxed{关键信息摘要}$ • 成功执行数据清洗作业,Job ID:$\text{job\_1743583799083\_0005}$ • 输入2个文件,输出路径$\text{/film/outputs/cleandata}$ • Map成功率100%,Reduce最终成功率100% • 总耗时约31秒(17:25:35 - 17:26:06) $\boxed{关键日志分析}$ 1. **资源配置阶段** ```log 25/04/02 17:25:34 INFO client.RMProxy: 连接到ResourceManager at hadoop01/192.168.20.20:8032 25/04/02 17:25:35 WARN mapreduce.JobResourceUploader: 未执行Hadoop命令行选项解析 ``` - 成功连接YARN资源管理器 - 警告建议实现Tool接口(可通过继承`Configured`并实现`Tool`优化) 2. **任务拆分阶段** ```log INFO input.FileInputFormat: Total input paths to process : 2 INFO mapreduce.JobSubmitter: number of splits:2 ``` - 输入文件被拆分为2个Map任务(对应HDFS块大小) 3. **任务执行监控** ```log INFO mapreduce.Job: The url to track the job: http://hadoop01:8088/proxy/application_1743583799083_0005/ ``` - 可通过Web UI实时监控作业状态(默认端口8088) 4. **执行过程统计** ```log Map 100% Reduce 100% INFO mapreduce.Job: Counters: 50 ``` - 完整计数器显示资源使用细节,其中需特别注意: ```log HDFS: Number of bytes read=17347 HDFS: Number of bytes written=0 # 输出数据量为0 Map input records=144 Map output records=0 # Map阶段无输出 Reduce input records=0 # Reduce阶段无输入 ``` $\boxed{异常现象诊断}$ 1. **数据写入异常** - 最终输出目录字节数为0,可能原因: - Mapper/Reducer中未调用`context.write()` - 数据清洗逻辑过滤了所有记录 - 输出路径权限问题 2. **Map阶段异常** - Map输入144条记录但输出0条,说明: ```java // 示例问题代码可能形式 public void map(...) { if(严格过滤条件){ // 导致所有记录被过滤 context.write(...); } } ``` $\boxed{建议排查步骤}$ 1. **代码验证** - 检查Mapper类是否包含输出逻辑 - 验证数据清洗规则是否过于严格 - 添加调试日志输出原始记录和过滤结果 2. **路径检查** ```bash hdfs dfs -ls /film/outputs/cleandata hdfs dfs -cat /film/outputs/cleandata/part-* | head ``` 3. **配置确认** - 检查`Job`是否设置正确的OutputFormat ```java job.setOutputFormatClass(TextOutputFormat.class); ``` 4. **警告处理(可选优化)** - 实现Tool接口规范参数解析: ```java public class CleanDriver extends Configured implements Tool { public int run(String[] args) throws Exception { Job job = Job.getInstance(getConf()); // 作业配置 return job.waitForCompletion(true) ? 0 : 1; } } ``` 该作业虽然显示执行成功,但实际未产生有效输出数据,需要重点检查数据处理逻辑和输出机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值