[hadoop in Action] 第3章 Hadoop组件
- 管理HDFS中的文件
- 分析MapReduce框架中的组件
- 读写输入输出数据
import java.io.IOException; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path; public class PutMerge { public static void main(String[] args) throws IOException { Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);
FileSystem local = FileSystem.getLocal(conf); Path inputDir = new Path(args[0]); //(1)设定输入目录和输出文件
Path hdfsFile = new Path(args[1]); try {
FileStatus[] inputFiles = local.listStatus(inputDir); //(2)得到本地文件列表
FSDataOutputStream out = hdfs.create(hdfsFile); //(3)生成HDFS输出流 for (int i=0; i<inputFiles.length; i++) {
System.out.println(inputFiles[i].getPath().getName());
FSDataInputStream in = local.open(inputFiles[i].getPath()); //(4)打开本地输入流
byte buffer[] = new byte[256];
int bytesRead = 0;
while( (bytesRead = in.read(buffer)) > 0) {
out.write(buffer, 0, bytesRead);
}
in.close();
}
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 输入数据;
- 输入数据被分布在节点上;
- 每个map任务处理一个数据分片;
- Mapper输出中间数据;
- 节点间的数据交换在“洗牌”阶段完成;
- 相同key的中间数据进入相同的reducer;
- 存储Reducer的输出。
|
类
|
描述
|
|
BooleanWritable
|
标准布尔变量的封装
|
|
ByteWritable
|
单字节数的封装
|
|
DoubleWritable
|
双字节数的封装
|
|
FloatWritable
|
浮点数的封装
|
|
IntWritable
|
整数的封装
|
|
LongWritable
|
长整数的封装
|
|
Text
|
使用UTF8格式的文本封装
|
|
NullWritable
|
无键值的占位符
|
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException; import org.apache.hadoop.io.WritableComparable; public class Edge implements WritableComparable<Edge> { private String departureNode;
private String arrivalNode; public String getDepartureNode() { return departureNode;} @Override
public void readFields(DataInput in) throws IOException { //(1)说明如何读入数据
departureNode = in.readUTF();
arrivalNode = in.readUTF();
} @Override
public void write(DataOutput out) throws IOException { //(2)说明如何写入数据
out.writeUTF(departureNode);
out.writeUTF(arrivalNode);
} @Override
public int compareTo(Edge o) { //(3)定义数据排序
return (departureNode.compareTo(o.departureNode) != 0)
? departureNode.compareTo(o.departureNode)
: arrivalNode.compareTo(o.arrivalNode);
}
}
- void configure(JobConfjob):该函数提取XML配置文件或者应用程序主类中的参数,在数据处理之前调用该函数。
- void close():作为map任务结束前的最后一个操作,该函数完成所有的结尾工作,如关闭数据库连接、打开文件等。
|
类
|
描述
|
|
IdentityMapper<k,v>
|
实现Mapper<k,v,k,v>将输入直接映射到输出
|
|
InverseMapper<k,v>
|
实现Mapper<k,v,v,k>反转键/值对
|
|
RegexMapper<k>
|
实现Mapper<k,text,text,LongWritable>,为每个常规表达式的匹配项生成一个(match,1)对
|
|
TokenCountMapper<k>
|
实现Mapper<k,text,text,LongWritable>,当输入的值为分词时,生成一个(token,1)对
|
|
类
|
描述
|
|
IdentityReudcer<k,v>
|
实现Reducer<k,v,k,v>将输入直接映射到输出
|
|
LongSumReducer<k>
|
实现<k,LongWritable,k,LongWritable>, 计算与给定键相对应的所有值的和
|
public class EdgePartitioner implements Partitioner<Edge, Writable>
{
@verride
public int getPartition(Edge key, Writable value, int numPartitions)
{
return key.getDepartureNode().hashCode() % numPartitions;
} @verride
public void configure(JobConf conf) { }
}
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.lib.TokenCountMapper;
import org.apache.hadoop.mapred.lib.LongSumReducer; public class WordCount2 {
public static void main(String[] args) {
JobClient client = new JobClient();
JobConf conf = new JobConf(WordCount2.class); FileInputFormat.addInputPath(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1])); conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(LongWritable.class);
conf.setMapperClass(TokenCountMapper.class);
conf.setCombinerClass(LongSumReducer.class);
conf.setReducerClass(LongSumReducer.class); client.setConf(conf);
try {
JobClient.runJob(conf);
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
InputFormat
|
描述
|
|
TextInputFormat
|
在文本文件中每一行均为一个记录。键(key)为一行的字节偏移,而值(value)为一行的内容
key: LongWritable
value: Text
|
|
KeyValueTextInputFormat
|
在文本文件中的每一行均为一个记录。以每行的第一个分隔符为界,分隔符之前的是键(key),之后的是值(value)。分离器在属性key.value.separator.in.input.line中设定,默认为制表符(\t)。
key: Text
Value: Text
|
|
SequenceFileInputFormat<k,v>
|
用于读取序列文件的InputFormat。键和值由用户定义。序列文件为hadoop专用的压缩二进制文件格式。它专用于一个MapReduce作业和其他MapReduce作业之间传送数据。
key: K(用户定义)
value: V(用户定义)
|
|
NLineInputFormat
|
与TextInputFormat相同,但每个分片一定有N行。N在属性mapred.line.input.format.linespermap中设定,默认为1.
key: LongWritable
value: Text
|
|
OutputFormat
|
描述
|
|
TextOutputFormat<k,v>
|
将每个记录写为一行文本。键和值以字符串的形式写入,并以制表符(\t)分隔。这个分隔符可以在属性mapred.textoutputformat.separator中修改 |
|
SequenceFileOutputFormat<k,v>
|
以hadoop专有序列文件格式写入键/值对。与SequenceFileInputForamt配合使用 |
|
NullOutputFormat<k,v>
|
无输出 |
[hadoop in Action] 第3章 Hadoop组件的更多相关文章
- [Hadoop in Action] 第1章 Hadoop简介
编写可扩展.分布式的数据密集型程序和基础知识 理解Hadoop和MapReduce 编写和运行一个基本的MapReduce程序 1.什么是Hadoop Hadoop是一个开源的框架,可编写和运 ...
- [Hadoop in Action] 第7章 细则手册
向任务传递定制参数 获取任务待定的信息 生成多个输出 与关系数据库交互 让输出做全局排序 1.向任务传递作业定制的参数 在编写Mapper和Reducer时,通常会想让一些地方可以配 ...
- [Hadoop in Action] 第6章 编程实践
Hadoop程序开发的独门绝技 在本地,伪分布和全分布模式下调试程序 程序输出的完整性检查和回归测试 日志和监控 性能调优 1.开发MapReduce程序 [本地模式] 本地模式 ...
- [Hadoop in Action] 第5章 高阶MapReduce
链接多个MapReduce作业 执行多个数据集的联结 生成Bloom filter 1.链接MapReduce作业 [顺序链接MapReduce作业] mapreduce-1 | mapr ...
- [Hadoop in Action] 第4章 编写MapReduce基础程序
基于hadoop的专利数据处理示例 MapReduce程序框架 用于计数统计的MapReduce基础程序 支持用脚本语言编写MapReduce程序的hadoop流式API 用于提升性能的Combine ...
- Hadoop专业解决方案-第13章 Hadoop的发展趋势
一.前言: 非常感谢Hadoop专业解决方案群:313702010,兄弟们的大力支持,在此说一声辛苦了,经过两周的努力,已经有啦初步的成果,目前第13章 Hadoop的发展趋势小组已经翻译完成,在此对 ...
- [hadoop读书笔记] 第四章 Hadoop I/O操作
P92 压缩 P102 序列化 序列化:将结构化对象转为字节流便于在网上传输或写到磁盘进行永久性存储的过程 用于进程之间的通信或者数据的永久存储 反序列化:将字节流转为结构化对象的逆过程 Hadoop ...
- [Hadoop in Action] 第2章 初识Hadoop
Hadoop的结构组成 安装Hadoop及其3种工作模式:单机.伪分布和全分布 用于监控Hadoop安装的Web工具 1.Hadoop的构造模块 (1)NameNode(名字节点) ...
- Hadoop专业解决方案-第12章 为Hadoop应用构建企业级的安全解决方案
一.前言: 非常感谢Hadoop专业解决方案群:313702010,兄弟们的大力支持,在此说一声辛苦了,春节期间,项目进度有所延迟,不过元宵节以后大家已经步入正轨, 目前第12章 为Hadoop应用构 ...
随机推荐
- Html5 Json应用
本文主要说明Json的基本概念,和一个在Html中使用Json给元素赋值的小例子,属于基础性信息 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Obj ...
- python学习 正则表达式
一.re 模块中 1.re.match #从开始位置开始匹配,如果开头没有match()就返回none 语法:re.match(pattern, string, flags=0) pattern 匹配 ...
- u-boot源码汇编段简要分析
Hi,大家好!我是CrazyCatJack,你们可以叫我CCJ或者疯猫.今天我给大家带来的是u-boot的源代码汇编段分析,以后还会给大家讲解后续的C代码,请持续关注哦^_^ 先简单说一下u-boot ...
- mac linux rename命令行批量修改文件名
我的mac使用命令行批量修改名字时发现居然没有rename的指令: zsh: command not found: rename 所以使用HomeBrew先安装一下: ➜ ~ brew install ...
- Apworks框架实战(五):EasyMemo的领域模型设计
在上一讲中,我们已经新建了一个聚合根对象Account,并已经可以开始设计领域模型了.在这一讲中,我们会着重介绍EasyMemo领域模型的分析和设计,并引入Visual Studio Ultimate ...
- 本博客现已迁移到chuxiuhong.com
欢迎大家访问,我会暂时保留这个博客的更新,实现两个博客的同步. 新博客地址: http://chuxiuhong.com
- scikit-learn一般实例之四:使用管道和GridSearchCV选择降维
本例构建一个管道来进行降维和预测的工作:先降维,接着通过支持向量分类器进行预测.本例将演示与在网格搜索过程进行单变量特征选择相比,怎样使用GrideSearchCV和管道来优化单一的CV跑无监督的PC ...
- Marshal.Copy将指针拷贝给数组
lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...
- Visual Studio for Mac Preview离线下载安装
Visual Studio for Mac离线下载安装. 环境:OS X EI Caption 10.11.2 .NET Core SDK 1.1 需预先安装 .NET Core 1.1 SDK ma ...
- SQL SERVER 竖表变成横表
现有数据如下: Sql: select a.MODELID, max( case a.PNAME when'计划开始' then a.PVALUE end) as RStart, max( case ...