转自:http://www.linuxidc.com/Linux/2012-04/57831.htm

系统默认的LineRecordReader是按照每行的偏移量做为map输出时的key值,每行的内容作为map的value值,默认的分隔符是回车和换行。

现在要更改map对应的输入的<key,value>值,key对应的文件的路径(或者是文件名),value对应的是文件的内容(content)。

那么我们需要重写InputFormat和RecordReader,因为RecordReader是在InputFormat中调用的,当然重写RecordReader才是重点!

下面看代码InputFormat的重写:

  1. public class chDicInputFormat extends FileInputFormat<Text,Text>
  2. implements JobConfigurable{
  3. private CompressionCodecFactory compressionCodecs = null;
  4. public void configure(JobConf conf) {
  5. compressionCodecs = new CompressionCodecFactory(conf);
  6. }
  7. /**
  8. * @brief isSplitable 不对文件进行切分,必须对文件整体进行处理
  9. *
  10. * @param fs
  11. * @param file
  12. *
  13. * @return false
  14. */
  15. protected boolean isSplitable(FileSystem fs, Path file) {
  16. //  CompressionCodec codec = compressionCodecs.getCode(file);
  17. return false;//以文件为单位,每个单位作为一个split,即使单个文件的大小超过了64M,也就是Hadoop一个块得大小,也不进行分片
  18. }
  19. public RecordReader<Text,Text> getRecordReader(InputSplit genericSplit,
  20. JobConf job, Reporter reporter) throws IOException{
  21. reporter.setStatus(genericSplit.toString());
  22. return new chDicRecordReader(job,(FileSplit)genericSplit);
  23. }
  24. }

下面来看RecordReader的重写:

  1. public class chDicRecordReader implements RecordReader<Text,Text> {
  2. private static final Log LOG = LogFactory.getLog(chDicRecordReader.class.getName());
  3. private CompressionCodecFactory compressionCodecs = null;
  4. private long start;
  5. private long pos;
  6. private long end;
  7. private byte[] buffer;
  8. private String keyName;
  9. private FSDataInputStream fileIn;
  10. public chDicRecordReader(Configuration job,FileSplit split) throws IOException{
  11. start = split.getStart(); //从中可以看出每个文件是作为一个split的
  12. end = split.getLength() + start;
  13. final Path path = split.getPath();
  14. keyName = path.toString();
  15. LOG.info("filename in hdfs is : " + keyName);
  16. final FileSystem fs = path.getFileSystem(job);
  17. fileIn = fs.open(path);
  18. fileIn.seek(start);
  19. buffer = new byte[(int)(end - start)];
  20. this.pos = start;
  21. }
  22. public Text createKey() {
  23. return new Text();
  24. }
  25. public Text createValue() {
  26. return new Text();
  27. }
  28. public long getPos() throws IOException{
  29. return pos;
  30. }
  31. public float getProgress() {
  32. if (start == end) {
  33. .0f;
  34. else {
  35. .0f, (pos - start) / (float)(end - start));
  36. }
  37. }
  38. public boolean next(Text key, Text value) throws IOException{
  39. while(pos < end) {
  40. key.set(keyName);
  41. value.clear();
  42. fileIn.readFully(pos,buffer);
  43. value.set(buffer);
  44. //      LOG.info("---内容: " + value.toString());
  45. pos += buffer.length;
  46. LOG.info("end is : " + end  + " pos is : " + pos);
  47. return true;
  48. }
  49. return false;
  50. }
  51. public void close() throws IOException{
  52. if(fileIn != null) {
  53. fileIn.close();
  54. }
  55. }
  56. }

通过上面的代码,然后再在main函数中设置InputFormat对应的类,就可以使用这种新的读入格式了。

【转载】Hadoop自定义RecordReader的更多相关文章

  1. [Hadoop] - 自定义Mapreduce InputFormat&OutputFormat

    在MR程序的开发过程中,经常会遇到输入数据不是HDFS或者数据输出目的地不是HDFS的,MapReduce的设计已经考虑到这种情况,它为我们提供了两个组建,只需要我们自定义适合的InputFormat ...

  2. Hadoop自定义类型处理手机上网日志

    job提交源码分析 在eclipse中的写的代码如何提交作业到JobTracker中的哪?(1)在eclipse中调用的job.waitForCompletion(true)实际上执行如下方法 con ...

  3. Hadoop自定义分组Group

    matadata: hadoop a spark a hive a hbase a tachyon a storm a redis a 自定义分组 import org.apache.hadoop.c ...

  4. [转载]hadoop SecondNamenode详解

    SecondNamenode名字看起来很象是对第二个Namenode,要么与Namenode一样同时对外提供服务,要么相当于Namenode的HA.真正的了解了SecondNamenode以后,才发现 ...

  5. [转载] Hadoop和Hive单机环境搭建

    转载自http://blog.csdn.net/yfkiss/article/details/7715476和http://blog.csdn.net/yfkiss/article/details/7 ...

  6. [转载] Hadoop MapReduce

    转载自http://blog.csdn.net/yfkiss/article/details/6387613和http://blog.csdn.net/yfkiss/article/details/6 ...

  7. Hadoop日记Day13---使用hadoop自定义类型处理手机上网日志

    测试数据的下载地址为:http://pan.baidu.com/s/1gdgSn6r 一.文件分析 首先可以用文本编辑器打开一个HTTP_20130313143750.dat的二进制文件,这个文件的内 ...

  8. Hadoop自定义JobTracker和NameNode管理页面

    为了可以方便地在hadoop的管理界面(namenode和jobtracker)中自定义展示项,使用代理servlet的方式实现了hadoop的管理界面. 首先, 在org.apache.hadoop ...

  9. hadoop自定义数据类型

    统计某手机数据库的每个手机号的上行数据包数量和下行数据包数量 数据库类型如下: 数据库内容如下: 下面自定义类型SimLines,类似于平时编写的model import java.io.DataIn ...

随机推荐

  1. js - 除法

    取整数 1.丢弃小数部分,保留整数部分 js:parseInt(7/2) 2.向上取整,有小数就整数部分加1 js: Math.ceil(7/2) 3,四舍五入. js: Math.round(7/2 ...

  2. Android 基础知识 -- Linux环境搭建

    Android 开发工具下载网站:http://www.androiddevtools.cn/ 1 JDK 1.1 下载JDK,解压后放到/usr/lib/jvm/目录 sudo mv jdk1.7. ...

  3. Oracle 12c 如何在 PDB 中添加 SCOTT 模式(数据泵方式)

    Oracle 12c 建库后,没有 scott 模式,本篇使用数据泵方式,在12c版本之前数据库中 expdp 导出 scott 模式,并连接 12c 的 pdb 进行 impdp 导入. 目录 1. ...

  4. Linux vim三种模式的快捷键

    1.移动光标 数字 + h,j,k,l 上,下,左,右 ctrl-e 移动页面 ctrl-f 上翻一页 ctrl-b 下翻一页 ctrl-u 上翻半页 ctrl-d 下翻半页 w 跳到下一个字首,按标 ...

  5. 前端开发 css、less编写规范

    壹 ❀ 引 早在大半年前,我在负责整理定义了前端组JavaScript开发规范与less.css样式开发规范.一直想将两个规范整理成文章,但在整理了JavaScript规范后,我花了较多的时间在学习J ...

  6. POJ 1099 Square Ice 连蒙带猜+根据样例找规律

    目录 题面 思路 思路 AC代码 题面 Square Ice Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4526   A ...

  7. LeetCode subarray-sum-equals-k题解 前缀和+Hash表+枚举——线性做法

    文章目录 题意 思路 连续子数组的和sum[i,j] 源码 结果记录 题意 给定一个数组,求连续的子数组的和为k的子数组个数. 思路 连续子数组的和sum[i,j] sum[i,j]=∑k=ijAk( ...

  8. 零基础入门 Kubernetes,你需要知道这些

    Kubernetes是什么? 大概很多人对此都有疑问,不过在容器领域,Kubernetes却无人不晓. 阿里.字节跳动.腾讯.百度等中国互联网行业巨擘们,近年来都在深耕容器领域,而Kubernetes ...

  9. kuangbin专题专题十一 网络流 Minimum Cost POJ - 2516

    题目链接:https://vjudge.net/problem/POJ-2516 思路:对于每种商品跑最小费用最大流,如果所有商品和人一起建图跑,O(v^2*m)数量级太大,会超时. 把店里的商品拆点 ...

  10. CVE-2019-9081:laravel框架序列化RCE复现分析

    这里贴上两篇大佬的分析的帖子 本人习惯把平常的一些笔记或者好的帖子记录在自己的博客当中,便于之后遇到同样的漏洞时快速打开思路 1.https://xz.aliyun.com/t/5510#toc-8 ...