1. 场景

  基于客户的数据处理需求,客户分发诸多小数据文件,文件每行代表一条记录信息,且每个文件以"类型_yyyyMMdd_批次号"命名。由于同一条记录可能存在于多个文件中,且处于多个文件中的相同记录最终只有时间最新的记录有效,但文件的每行记录并未提供时间信息,因此需要从每个文件名中提取时间信息作为文件每行记录信息。

  因此,考虑到小文件数量较多,且数据总量近千万级别,因此借助Hadoop工具,在MapReduce中获取处理该条记录所对应的拆分后的文件名信息。

2. 技术实现

  当Hadoop处理简单文本输入时,如job.setInputFormatClass(TextInputFormat.class);,mapper运行时,可以使用如下方法获取对应的filesplit,进而获取到文件路径信息、文件名信息等:

// 0.19 hadoop
(FileSplit) (reporter.getInputSplit()); // 0.20 hadoop
(FileSplit) (context.getInputSplit());

  但如果使用多输入文件时,如:MultipleInputs.addInputPath(job, new Path(path), SequenceFileInputFormat.class, ProfileMapper.class);,会出现如下异常信息:

java.lang.ClassCastException: org.apache.hadoop.mapreduce.lib.input.TaggedInputSplit cannot be cast to org.apache.hadoop.mapreduce.lib.input.FileSplit

  而实际需要的FileSplit是TaggedInputSplit中的成员变量inputSplit,但是TaggedInputSplit类在社区版的Hadoop中并非public,所以无法直接获取对应信息。  

  可以采用反射来获取TaggedInputSplit中的inputSplit,具体实现方法如下:

String getFileName(){
InputSplit inputSplit = context.getInputSplit();
Class<? extends InputSplit> splitClass = inputSplit.getClass();
FileSplit fileSplit = null;
if(splitClass.equals(FileSplit.class)){
fileSplit = (FileSplit) inputSplit;
}else if(splitClass.getName().equals("org.apache.hadoop.mapreduce.lib.input.TaggedInputSplit")){
try {
Method getInputSplitMethod = splitClass.getDeclaredMethod("getInputSplit");
getInputSplitMethod.setAccessible(true);
fileSplit = (FileSplit) getInputSplitMethod.invoke(inputSplit);
} catch (Exception e) {
}
}
return fileSplit.getPath().getName();
}

参考:

(1) https://blog.csdn.net/rabbitxl/article/details/8645428 

(2)https://stackoverflow.com/questions/11130145/hadoop-multipleinputs-fails-with-classcastexception

工作采坑札记:4. Hadoop获取InputSplit文件信息的更多相关文章

  1. 工作采坑札记:1. Hadoop中的BytesWritable误区

    1. 背景 近日帮外部门的同事处理一个小需求,就是将HDFS中2018年至今所有存储的sequence序列化文件读取出来,重新保存成文本格式,以便于他后续进行处理.由于同事主要做机器学习方向,对had ...

  2. 工作采坑札记:2. Hadoop中MultipleInputs的使用陷阱

    1. 背景 近日在一个Hadoop项目中使用MultipleInputs增加多输入文件时,发现相同路径仅会加载一次,导致后续的统计任务严重失真.本博文旨在记录异常的排查及解决方案. 2. 情景重现 ( ...

  3. 工作采坑札记:3. Spark中es-hadoop插件异常解决

    1. Es-Hadoop异常: org.elasticsearch.hadoop.EsHadoopException: Could not write all entries [615/300864] ...

  4. 工作采坑札记: 4. linux指定目录使用df和du的统计结果相差很大

    1. 背景 近日,线上的服务出现异常,调用服务返回的JSON格式数据不完整,导致客户端解析异常,因此记录了本次的填坑之旅(nnd)... 2. 排查过程 2.1 服务器分析 登录到服务所在linux服 ...

  5. C# 获取 mp3文件信息

    C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612   string fil ...

  6. android播放器如何获取音乐文件信息

    转http://blog.csdn.net/hellofeiya/article/details/8464356, android自带的音乐播放器中,在获取音乐文件信息的时候是通过扫描得到相关信息的. ...

  7. 【ASP.NET 进阶】获取MP3文件信息并显示专辑图片

    突发奇想,想弄个显示MP3文件信息和专辑图片的小Demo,个人不是大牛,遂百度之,总算搞定,现分享如下. 效果图: GIF效果图: 主要是依靠2个DLL文件:ID3.dll 和 Interop.She ...

  8. C# 获取 mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】

    C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612   string fil ...

  9. nuxt 2.0采坑计之 (引入静态文件css)

    nuxt 2.0采坑计之静态文件css 外部引入css 全局引用方法为   (在nuxt.config.js配置中在   module.exports = {}  中添加) head: { meta: ...

随机推荐

  1. window.document 对象

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Sql 不确定列 行转列操作

    做项目时,用到了汇总统计的行转列,且 表结构: 具体存储过程脚本如下: -- =============================================-- Author:  -- C ...

  3. centos7 .net core 使用supervisor守护进程,可以后台运行

    1.安装supervisor yum install supervisor 2.配置supervisor vi /etc/supervisord.conf 拉到最后,这里的意思是 /etc/super ...

  4. 趣图:向客户介绍的产品VS实际开发的产品

      趣图:客户需求 vs 最终产品 趣图:你永远想不到用户怎么使用你的产品

  5. spring boot 第一个Dome

    1.创建Maven项目 按照下面的步骤 项目创建完成后的目录结构 2. 参照Spring boot官方文档修改pom.xml 修改 maven编译的jdk版本 将spring boot设置为 pare ...

  6. [BZOJ2879][Noi2012]美食节(费用流)

    题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...

  7. Cygwin apt-cyg ”MD5 sum did not match”

    直接编辑apt-cyg 文件,找到md5sum,替换修改成sha512sum. # check the md5 digest=`cat "desc" | awk '/^instal ...

  8. 条目十三《尽量使用vector和string来代替使用数组》

    条目十三<尽量使用vector和string来代替使用数组> 数组在现代编程语言中基本都存在,应用可谓广泛,不可或缺,虽然在一些语言中(go)有切片等数据结构,但是数组还是存在的. 但是在 ...

  9. PHP脚本占用内存太多,解决方案

    Fatal Error: Allowed memory size of xxxxxx bytes exhausted 今天遇到服务器很多自动任务的php脚本占用服务内存过多,并且程序不在运行了. 解决 ...

  10. bootstrap的使用2

    表单控件: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...