MapReduce: map读取文件的过程

我们的输入文件 hello0, 内容如下:

xiaowang 28 [email protected][email protected] 38 [email protected][email protected] 100 unknown

逻辑上有3条记录, 它们以@[email protected]分隔.

我们看看数据是如何被map读取的...

1. 默认配置

/*
 New API
  */

     //conf.set("textinputformat.record.delimiter", "@[email protected]");

        /*
        job.setInputFormatClass(Format0.class);
        //job.setInputFormatClass(Format1.class);  error here

        //or,
        job.setInputFormatClass(Format3.class);

        //job.setInputFormatClass(Format4.class); error here

        job.setInputFormatClass(Format5.class);

        */

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class Test0 {

public static class MyMapper extends Mapper<Object, Text, Text, IntWritable> {
    public void map(Object key, Text value, Context context)  throws IOException, InterruptedException
    {
        String line = value.toString();
        System.out.println(line);
    }
}

public static void main(String[] args) throws Exception {

         Configuration conf = new Configuration();

        Job job = Job.getInstance(conf);

        job.setJarByClass(Test0.class);
        job.setJobName("myjob");

        job.setMapperClass(MyMapper.class);

        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        job.waitForCompletion(true);

    }

}

Debug我们可以看到value的值是获取了文件的整个内容作为这一条记录的值的, 因为默认情况下是以换行符作为记录分割符的, 而文件内容中没有换行符. map只被调用1次

2. 配置textinputformat.record.delimiter

我们为Configuration设置textinputformat.record.delimiter参数-

conf.set("textinputformat.record.delimiter", "@[email protected]");

这样map按照我们的预期读取记录, map被调用3次

3. 自定义TextInputFormat

自定义TextInputFormat, 在其RecordReader方法中设置需要的record delimiter

import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.lib.input.LineRecordReader;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;

public class Format5 extends TextInputFormat {

    public RecordReader createRecordReader (InputSplit split, TaskAttemptContext tac) {
        byte[] recordDelimiterBytes = "@[email protected]".getBytes();
        return new LineRecordReader(recordDelimiterBytes);
    }

}

应用到job上-

 job.setInputFormatClass(Format5.class);

这样得到和方法2一样的效果.

时间: 2024-11-17 00:05:42

MapReduce: map读取文件的过程的相关文章

【原创】大数据基础之Spark(7)spark读取文件split过程(即RDD分区数量)

spark 2.1.1 spark初始化rdd的时候,需要读取文件,通常是hdfs文件,在读文件的时候可以指定最小partition数量,这里只是建议的数量,实际可能比这个要大(比如文件特别多或者特别大时),也可能比这个要小(比如文件只有一个而且很小时),如果没有指定最小partition数量,初始化完成的rdd默认有多少个partition是怎样决定的呢? 以SparkContext.textfile为例来看下代码: org.apache.spark.SparkContext /** * Re

百度 UEditor--自定义上传文件路径及读取文件

jsp中替换掉上传和预览图片的URL 注意第一句判断,注意要用项目的相对URL return '/sirdifoa/kentra/file/uploadImage.do'; if(UE.Editor.prototype._bkGetActionUrl == undefined)UE.Editor.prototype._bkGetActionUrl = UE.Editor.prototype.getActionUrl;     UE.Editor.prototype.getActionUrl = 

FileReader读取文件中文乱码问题

有一个UTF-8编码的文本文件,用FileReader读取到一个字符串,然后转换字符集:str=newString(str.getBytes(),"UTF-8");结果大部分中文显示正常,但最后仍有部分汉字显示为问号! Java代码 public static List<String> getLines(String fileName){ List<String> lines=newArrayList<String>(); try { Buffere

MapReduce剖析笔记之五:Map与Reduce任务分配过程

在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体来说,存在一个抽象类:TaskScheduler,主要负责分配任务,继承该类的有几个类: CapacityTaskScheduler.FairScheduler.JobQueueTaskScheduler(LimitTasksPerJobTaskScheduler又继承于该类). 从名字大致可以看出

MapReduce(十五): 从HDFS读取文件的源码分析

以Map任务读取文本数据为例: 1)   LineRecordReader负责对文件分割的定位,以及对读取每一行内容的封装供用户Map任务使用.每次在定位在文件中不为0的位置时,多读取一行,因为前一个处理该位置之前的数据时,会完整把该一行已经读取并处理. 2)   LineReader负责对所要访问文件输入流的数据进行每一行读取,只实现对每一行读取的逻辑. 3)   DFSDataInputStream封装了DFSInputStream的实现,直接调用DFSInputStream接口完成. 4)

登录shell与非登录shell读取文件过程

登录shell与非登录shell读取文件过程登录:/etc/profile→/etc/profile.d/*.sh        ~/.bash_profile非登录:~/.bash_profile→~/.basfrc→/etc/bashrc#soure .bash_profile        手动更新/etc/profile            通用的有效环境变量/etc/profile.d/*.sh    软件包特有的环境变量~/.bash_profile        用户特有的环境变

关于一些对map和整行读取文件操作

public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>();  map.put("1", "value1");  map.put("2", "value2");  map.put("3", "value3");    //第一种:普

【转】MapReduce:详解Shuffle过程

——转自:{http://langyu.iteye.com/blog/992916} Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了解的.我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑,反而越搅越混.前段时间在做MapReduce job 性能调优的工作,需要深入代码研究MapReduce的运行机制,这才对Shuffle探了个究竟.考虑到之前我在看相关资料而看不懂时很恼火,所以在这里我尽最大的可能

MapReduce和spark的shuffle过程详解

面试常见问题,必备答案. 参考:https://blog.csdn.net/u010697988/article/details/70173104 mapReducehe和Spark之间的最大区别是前者较偏向于离线处理,而后者重视实效性,下面主要介绍mapReducehe和Spark两者的shuffle过程. MapReduce的Shuffle过程 MapReduce计算模型一般包括两个重要的阶段:Map是映射,负责数据的过滤分发:Reduce是规约,负责数据的计算归并.Reduce的数据来源于