离线数据分析平台实战——060深入理解MapReduce 01(案例)
用户自定义数据类型
MapReduce中的数据类型至少有两种用途。
第一个用途,这些类型定义的数据可以被序列化进行网络传输和文件存储,
第二个用途,在shuffle阶段要可以进行大小比较。
那么在hadoop中解决
第一种方式采用hadoop的接口Writable,
第二种采用接口java接口Comparable(Hadoop将这两个接口结合提供了WritableComparable接口)。
Hadoop提供了很多的内置数据类型,
比如:MapWritable, LongWritable, IntWritable, BooleanWritable, ByteWritable, DoubleWritable, FloatWritable, Text, NullWritable等。
用户定制数据输入格式化器
数据输入格式(InputFormat)用于描述MR作业的数据输入格式规范。
MapReduce框架依赖InputFormat进行输入数据分片以及提供读取分片数据的RecordReader实例对象。
每一个InputFormat类都会有一个对应的RecordReader类,
RecordReader类主要作用是将输入数据转换为键值对,
传输给mapper阶段的map方法。
MapReduce默认的数据输入格式是:
TextInputFormat(LineRecordReader)。
除了这个格式器以外,
还有KeyValueTextInputFormat, CombineTextInputFormat, SequenceFileInputFormat, DBInputFormat等。
InputFormat详解
全称:org.apache.hadoop.mapreduce.InputFormat
方法详解:
getSplits
:返回值是分片信息集合;作用:通过分片个数确定mappre的个数,并根据分片信息中的数据地址信息决定是否采用数据本地化策略。
createRecordReader
:创建一个具体读取数据并构造key/value键值对的RecordReader实例对象。
RecordReader详解
全称:org.apache.hadoop.mapreduce.RecordReader
方法详解:
initialize
:根据对应的分片信息进行初始化操作。
nextKeyValue
:判断是否还有下一个key/value键值对,如果有返回true;否则返回false。
getCurrentKey
/getCurrentValue
:获取当前key/value键值对。
getProgress
:获取操作进度信息。
close
:关闭资源读取相关连接。
FileSplit详解
全称:org.apache.hadoop.mapreduce.InputSplit
方法详解:
getLength
:获取分片长度。
getLocations
:获取该分片数据对应的位置信息,确定数据本地化时候有用。
用户定制数据输出格式化器
数据输出格式(OutputFormat)用于描述MR作业的数据输出格式规范。
MapReduce框架依赖OutputFormat进行输出路径(输出空间)检测、获取提交job的OutputCommitter实例对象以及提供一个具体定义如何输出数据的RecordWriter实例对象。
每一个OutputFormat类都会有一个对应的RecordWriter类,RecordWriter类主要作用是明确定义如何写入以及写入的格式,接收reducer阶段输出的key/value键值对。
MapReduce默认的数据输出格式是:
TextOutputFormat(LineRecordWriter)。
除了这个格式器以外,还有SequenceFileOutputFormat, DBOutputFormat等。
OutputFormat详解
全称:org.apache.hadoop.mapreduce.OutputFormat
方法详解:
getRecordWriter
:创建一个具体写数据的RecordWriter实例。
checkOutputSpecs
:检测输出空间相关信息,如果检测失败,直接抛出异常。
getOutputCommitter
:获取一个提交job的committer对象。一般情况下,直接使用FileOutputCommitter
对象即可。如果觉得FileOutputCommitter
内容比较多,也可以自己实现一个完全为空的类。
案例-MongoDB Hadoop实例
实现功能:从MongoDB中读取日志数据,将MapReduce程序处理过的数据写出到MongoDB中。