文档章节

Hadoop实战读书笔记(6)

祥林会跟你远走高飞
 祥林会跟你远走高飞
发布于 2014/12/08 15:03
字数 2001
阅读 54
收藏 3
点赞 0
评论 0

putmerge程序的大体流程是?

1、根据用户定义的参数设置本地目录和HDFS的目录文件

2、提取本地输入目录中每个文件的信息

3、创建一个输出流写入到HDF文件

4、遍历本地目录中的每个文件,打开一个输入流来读取该文件,剩下就是一个标准的Java文件复制过程了

具体程序如下:

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

       Configuration conf = new Configuration();

       FileSystem hdfs = FileSystem.get(conf);

       FileSystem local = FieSystem.getLocal(conf);

       // 设定输入目录与输出文件

       Path inputDir = new Path(args[0]);

       Path hdfsFile = new Path(args[1]);

 

       try {

              // 得到本地文件列表

              FileStatus[] inputFiles = local.listStatus(inputDir);

              // 生成HDFS输出流

              FSDataOutputStream out = hdfs.create(hdfsFile);

 

              for (int i = 0; i < inputFiles.length; i++) {

                     System.out.println(inputFiles[i].getPath().getName());

                     // 打开本地输入流

                     FSDataInputStream in = local.open(inputFiles[i].getPath());

                     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();

       }

}

 

那么现在有数据了,还要对它进行处理、分析以及做其他的操作。

MapReduce程序通过操作键/值对来处理数据,一般形式为

map: (K1, V1) -> list(K2, V2)

reduce:(K2, list(V2)) -> list(K3, V3)

 

Hadoop数据类型有哪些?

MapReduce框架并不允许它们是任意的类。

虽然我们经常把某些键与值称为整数、字符串等,但它们实际上并不是IntegerString等哪些标准的Java类。为了让键/值对可以在集群上移动,MapReduce框架提供了一种序列化键/值对的方法。因此,只有那些支持这种序列化的类能够在这个框架中充当键或者值。

 

更具体的Hadoop类型说明

实现Writable接口的类可以是值

而实现WritableComparable<T>接口的类既可以是键也可以是值

注意WritableComparable<T>接口是Writablejava.lang.Comparable<T>接口的组合,对于键而言,我们需要这个比较,因为它们将在Reduce阶段进行排序,而值仅会被简单地传递。

 

/值对经常使用的数据类型列表,这些类均实现WritableComparable接口

描述

BooleanWritable

标准布尔变量的封装

ByteWritable

单字节数的封装

DoubleWritable

双字节数的封装

FloatWritable

浮点数的封装

IntWritable

整数的封装

LongWritable

Long的封装

Text

使用UTF-8格式的文本封装

NullWritable

无键值时的站位符

 

如何自定义数据类型?

只要它实现了Writable(WritableComparable<T>)接口。

 

定义一个Edge类型用于表示一个网络的边界

public class Edge implements WritableComparable<Efge> {

       private String departureNode;

       private String arrivalNode;

 

       public String getDepartureNode() {

              return departureNode;

       }

       // 说明如何读入数据

       @Override

       public void readFields(DataInput in) throws IOException {

              departureNode = in.readUTF();

              arrivalNode = in.readUTF();

       }

       // 说明如何写出数据

       @Override

       public void write(DataOutput out) throws IOException {

              out.writeUTF(departureNode);

              out.writeUTF(arrivalNode);

       }

       // 定义数据排序

       @Override

       public int compareTo(Edge o) {

              return (departureNode.compareTo(o.departureNode) != 0)

                     ? departureNode.compareTo(o.departureNode)

                     : arrivalNode.compareTo(o.arrivalNode);

       }

}

 

Mapper类是什么?

一个类要作为mapper,需继承MapReduceBase基类并实现Mapper接口。

mapperreducer的基类均为MapReduceBase

其中包含一些函数或方法:

1void configure(JobConf job),该函数提取XML配置文件或者应用程序主类中的参数,在数据处理之前调用该函数。

2void close(),作为map任务结束前的最后一个操作,该函数完成所有的结尾工作,如关闭数据库连接、打开文件等。

Mapper接口负责数据处理阶段,它采用Mapper<K1, V1, K2, V2>Java泛型,这里键类和值类分别实现WritableComparableWritable接口。

Mapper类只有是一个方法-map,用于处理一个单独的键/值对。

void map (K1 key,

              V1 value,

              OutputCollector<K2, V2> output,

              Reporter reporter

              ) throws IOException

 

上面这个map函数的参数都是什么意思?

该函数处理一个给定的键/值对 (K1, V1),生成一个键/值对 (K2, V2) 的列表 (该列表页可能为空)

OutputCollector接收这个映射过程的输出

Reporter可提供对mapper相关附加信息的记录

 

Hadoop提供了一些有用的mapper实现,这些实现是?

描述

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  

 

Reducer是什么?

一个类要作为reducer,需继承MapReduceBase基类并实现Reducer接口。

以便于允许配置和清理。

此外,它还必须实现Reducer接口使其具有如下的单一方法:

void reduce (K2 key,

                     Iterator<V2> values,

                     OutputCollector<K3, V3> output,

                     Reporter reporter

                     ) throws IOException

reducer任务接收来自各个mapper的输出时,它按照键/值对中的键对输入数据进行排序,并将相同键的值归并。然后调用reduce()函数,并通过迭代处理哪些与指定键相关联的值,生成一个 (可能为空的) 列表 K3, V3

OutputCollector接收reduce阶段的输出,并写入输出文件

Reporter可提供对reducer相关附加信息的记录,形成任务进度

 

一些非常有用的由Hadoop预定义的Reducer实现

描述

IdentityReducer<K, V>

实现Reducer<K,   V, K, V>, 将输入直接映射到输出

LongSumReducer<K>

实现<K,   LongWritable, K, LongWritable>   计算与给定键相对应的所有值的和

 

注:虽然我们将Hadoop程序称为MapReduce应用,但是在mapreduce两个阶段之间还有一个极其重要的步骤:将mapper的结果输出给不同的reducer。这就是partitioner的工作。

 

初次使用MapReduce的程序员通常有一个误解?

仅需要一个reducer 采用单一的reducer可以在处理之前对所有的数据进行排序。

No,采用单一的reducer忽略了并行计算的好处。

那么就应该使用多个reducer是么?但需要解决一个问题,如何确定mapper应该把键/值对输出给谁。

默认的作法是对键进行散列来确定reducerHadoop通过HashPartitioner类强制执行这个策略。但有时HashPartitioner会出错。

 

HashPartitioner会出什么错?

假如你使用Edge类来分析航班信息来决定从各个机场离港的乘客数目,这些数据可能是:

(San Francisco, Los Angeles) Chuck Lam

(San Francisco, Dallas) James Warren

如果你使用HashPartitioner,这两行可以被送到不同的reducer 离港的乘客数目被处理两次并且两次都是错误的

 

如何为你的应用量身定制partitioner呢?

上面的情况,我希望具有相同离港地的所有edge被送往相同的reducer,怎么做呢?只要对Edge类的departureNode成员进行散列就可以了:

public class EdgePartitioner implements Partitioner<Edge, Writable> {

       @Override

       public int getPartition (Edge key, Writable value, int numPartitions) {

              return key.getDepartureNode().hashCode() % numPartitions;

       }

       @Override

       public void configure(JobConf conf) { }

}

一个定制的partitioner只需要实现configure()getPartition()两个函数,前者将Hadoop对作业的配置应用在patitioner上,而后者返回一个介于0reduce任务数之间的整数,指向键/值对将要发送的reducer

 

Combiner:本地reduce

在许多MapReduce应用场景中,我们不妨在分发mapper结果之前做一下 "本地Reduce"。再考虑一下WordCount的例子,如果作业处理的文件中单词 "the" 出现了574次,存储并洗牌一次 ("the", 574) /值对比许多次 ("the", 1) 更为高效。这种处理步骤被称为合并。

 

预定义mapperReducer类的单词计数

public class WordCount {

       public static void main (String[] args) {

              JobClient client = new JobClient();

              JobConf conf = new JobConf(WordCount.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); // Hadoop自己的TokenCountMapper

              conf.setCombinerClass(LongSumReducer.class);

              conf.setReducerClass(LongSumReduver.class); // Hadoop自己的LongSumReducer

              client.setConf(conf);

              try {

                     JobClient.runJob(conf);

              } catch (Exception e) {

                     e.printStackTrace();

              }

       }

}

使用Hadoop预定义的类TokenCountMapperLongSumReducer,编写MapReduce分厂的容易,Hadoop也支持生成更复杂的程序,这里只是强调Hadoop允许你通过最小的代码量快速生成实用的程序。


© 著作权归作者所有

共有 人打赏支持
祥林会跟你远走高飞
粉丝 26
博文 49
码字总数 98029
作品 0
昌平
程序员
读书笔记_Index

第1章 Java性能调优概述 第2章 设计优化 第3章 Java程序优化 第4章 并行程序开发及优化 第5章 JVM调优 第6章 Java性能调优工具 第1章 简介 第2章 线程安全性 第3章 对象的共享 第1章 走近Jav...

陶邦仁 ⋅ 2014/03/19 ⋅ 0

Hadoop实战读书笔记(5)

HDFS文件操作 你可以把一个大数据集(100TB)在HDFS中存储为单个文件,而大多数其他的文件系统无力实现这一点。虽然该文件存在多个副本分布在多台机器上来支持并行处理,你也不必考虑这些细节...

祥林会跟你远走高飞 ⋅ 2014/12/08 ⋅ 0

优秀技术网址收集

Ruthless java多线程,java高级特性,Android基础,Android高级,Android常用控件,j2ee案例,Redis,Spring,javascript,Linux,Oracle,Ext,Hadoop,Jquery,Lucence,Nginx,Dubbo等 孤狼...

HenrySun ⋅ 2015/07/28 ⋅ 0

Hadoop实战读书笔记(8)

什么是开发数据集? 一个流行的开发策略是为生产环境中的大数据集建立一个较小的、抽样的数据子集,称为开发数据集。这个开发数据集可能只有几百兆字节。当你以单机或者伪分布式模式编写程序...

祥林会跟你远走高飞 ⋅ 2014/12/08 ⋅ 0

Hadoop实战读书笔记(7)

输入数据概要 输入数据通常驻留在较大的文件中,通常几十或者数百GB,甚至更大。MapReduce处理的基本原则之一是将输入数据分割成块。这些块可以在多台计算机上并行处理,在Hadoop的术语中这些...

祥林会跟你远走高飞 ⋅ 2014/12/08 ⋅ 0

敏捷教练成长记:漫漫长路第三周

看到跆拳道的软文,讲到: 学跆拳道的正确顺序: 第一阶段:有兴趣 第二阶段:没兴趣 第三阶段:逼练习 第四阶段:成习惯 第五阶段:有兴趣 第六阶段:真热爱 大部分家长在孩子第二阶段时放弃...

转型实践者 ⋅ 2017/11/17 ⋅ 0

Hadoop实战读书笔记(9)

如何将一个反向引用索引的程序的Reducer输出的类型改为IntWritable public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, IntWritable> { public void ......

祥林会跟你远走高飞 ⋅ 2014/12/09 ⋅ 0

2017年年终总结

前言 不知不觉,2017年又接近尾声了,又到了该写年终总结的时候了,往年这个时候都会熙熙攘攘,各大平台提早预热过年的气氛,而今年显得格外的平静,这可能正如我的现在的心境,波澜而不惊!...

韩俊强 ⋅ 01/03 ⋅ 0

《scrum实战-敏捷软件项目管理与开发》读书笔记

负责软件项目管理有段时间了,偶然得到一本讲scrum的书,摘出了一些自己看得懂的文字。 个体和互动高于流程和工具; 工作的软件优先于文档 客户合作高于合同谈判 变化优先于计划 scrumMaste...

taojinhuo ⋅ 2014/05/24 ⋅ 0

敏捷教练成长记:秋高气爽第四周

不知不觉坚持了四周了,这周很忙,写读书笔记时尽显疲态,有厌倦的感觉了。需要自我调整,继续坚持。 1、敏捷方面读不少于50页的书或者文章。 阅读《持续交付-发布可靠软件的系统方法》第三章...

转型实践者 ⋅ 2017/11/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 17分钟前 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 43分钟前 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 51分钟前 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 57分钟前 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

容器之查看minikue的environment——minikube的环境信息

执行如下命令 mjduan@mjduandeMacBook-Pro:~/Docker % minikube docker-envexport DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.99.100:2376"export DOCKER_CERT_PATH="/U......

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部