mapreduce异常分析:mr.MapredLocalTask: I/O error in redirector thread

问题背景

分析数据时,发现一个表的数据有异常,排查发现2023-02-23和2023-05-23两个分区的数据在2023-05-27日被更新了。
这张表的源表经常会更新历史数据,在hive中的更新方式是读取分区全部数据,进行数据更新,然后再重写分区数据。
分析执行日志,发现更新数据时,出现了mapreduce异常:

2023-05-27 02:06:13	Starting to launch local task to process map join;	maximum memory = 1908932608
2023-05-27 02:06:14	Uploaded 1 File to: file:/tmp/root/65db026d-d38d-4b76-9ec6-d851202146d3/hive_2023-05-27_02-05-10_700_8462898577308007189-1/-local-10005/HashTable-Stage-11/MapJoin-mapfile01--.hashtable (515 bytes)
Execution completed successfully
MapredLocal task succeeded
Launching Job 3 out of 6
23/05/27 02:06:15 WARN mr.MapredLocalTask: I/O error in redirector thread.
java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:170)
at java.io.BufferedInputStream.read(BufferedInputStream.java:336)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at org.apache.hadoop.hive.common.log.LogRedirector.run(LogRedirector.java:64)
at java.lang.Thread.run(Thread.java:750)
Number of reduce tasks is set to 0 since there's no reduce operator

日志解读:
在执行sql时,使用了mapjoin优化,启动了MapredLocalTask,上传mapfile成功后,出现redirector thread I/O错误。

分析

结论:资源抢占导致mapreduce任务丢失数据。

日志中的主要异常是”mr.MapredLocalTask: I/O error in redirector thread.”。

在MapReduce任务中,当Mapper或Reducer需要读取或写入数据时,会通过输入输出流(InputStream/OutputStream)进行操作。而这些输入输出流可能是来自于本地磁盘、网络文件系统(NFS)、HDFS等不同的数据源和目标。

为了实现对这些输入输出流的统一管理和控制,MapReduce框架引入了重定向器(Redirector),它负责将输入输出流从底层数据源和目标转换成Java标准输入输出流(System.in/System.out),以便Mapper或Reducer能够方便地使用。

而redirector thread则是重定向器内部的一个线程,它负责处理输入输出流之间的数据传输和缓存,确保数据能够顺利地流动,并且避免因为数据量过大导致内存溢出等问题。
因此,在MapReduce任务执行期间,如果发生了I/O错误或者其他异常情况,就有可能触发redirector thread抛出异常,例如上面提到的"mr.MapredLocalTask: I/O error in redirector thread."异常。

这个异常可能是由于MapReduce任务中的本地任务(LocalTask)在执行过程中遇到了I/O错误,导致重定向线程(redirector thread)无法正常工作。具体原因可能包括:

  1. 本地磁盘空间不足或者权限问题,导致无法读写数据文件。
  2. 网络连接出现故障,导致无法访问远程数据源或者输出目标。
  3. 数据格式不正确或者损坏,导致无法解析或者处理数据。
  4. 其他系统资源不足,例如内存、CPU等,导致任务无法正常运行。

结合我们的应用情况分析,造成这个问题的原因可能是计算资源不足导致的。凌晨2点任务执行比较集中,CPU、内存和磁盘等资源抢占严重,导致程序IO数据缺失,进而导致Mapper或Reducer数据缺失。

如何解决或规避

规避的主要思路是避免资源抢占情况发生,可以优化工作流或者增加集群资源。

为了解决这个异常,可以尝试以下几种方法:

  1. 检查本地磁盘空间和权限,确保能够正常读写数据文件。
  2. 检查网络连接是否正常,如果有故障需要修复或者更换网络设备。
  3. 对输入数据进行检查和清洗,确保数据格式正确并且没有损坏。
  4. 调整系统配置,增加资源配额,以提高任务的可靠性和稳定性。

如何监控

数据增量监控

通过对比表前后两天的数据总量,找出数据增量不合理的表进行告警。

假设一个表的数据的正常日增量区间在0-10w之间。
在2023-05-26日统计到的数据总量是1000w,2023-05-27日统计到数据总量是950w,那么在2023-05-27日进行检测,2023-05-27日相对于2023-05-26日的数据增量为-50w,不在正常的数据增量区间中,则对该表发出数据增量异常告警,人工及时介入处理。

历史数据变更监控

感知业务表的历史数据变化,发现更新历史数据的业务表进行告警。

假设数据检测按照T+1执行,一个表在2023-05-27日的数据存在2023-05-23日的更新数据,那么在2023-05-28日进行检测,会发现存在不属于2023-05-27日的数据,则对该表进行告警,人工及时介入处理,进行数据校验。

你可能感兴趣的:(Bigdata,mapreduce,mr,hadoop)