文档章节

Hadoop实战读书笔记(8)

祥林会跟你远走高飞
 祥林会跟你远走高飞
发布于 2014/12/08 21:01
字数 1900
阅读 239
收藏 16
点赞 0
评论 0

什么是开发数据集?

一个流行的开发策略是为生产环境中的大数据集建立一个较小的、抽样的数据子集,称为开发数据集。这个开发数据集可能只有几百兆字节。当你以单机或者伪分布式模式编写程序来处理它们时,你会发现开发周期很短,在自己的机器上运行程序也很方便,而且还可以在独立的环境中进行调试。

 

为什么选择专利引用数据做测试?

1、因为它们与你将来会遇到的大多数数据类型相似

2、专利引用数据所构成的关系图与网页链接以及社会网络图可谓大同小异

3、专利发布以时间为序,有些特性类似于时间序列

4、每个专利关联到一个人 (发明人) 和一个位置 (发明人的国家),你可以将之视为个人信息或地理数据

5、你可以将这些数据视为具有明确模式的普通数据库关系,而格式上简单地以逗号分开

 

数据集采用标准

数据集采用标准的逗号分隔取值 (comma-separated values, CSV) 格式。

 

构建MapReduce程序的基础模板

大多数MapReduce程序的编写都可以简单地依赖于一个模板及其变种,当撰写一个新得MapReduce程序时,我们通常会采用一个现有的MapReduce程序,并将其修改成我们所希望的样子。

 

典型的Hadoop程序的模板

public class MyJob extends Configured implements Tool {

       public static class MapClass extends MapReduceBase

              implements Mapper<Text, Text, Text, Text> {

              public void map (Text key, Text value,

                                   OutputCollector<Text, Text> output,

                                   Reporter reporter) throws IOException {

                     output.collect(value, key);

              }

       }

       public static class Reduce extends MapReduceBase

              implements Reducer<Text, Text, Text, Text> {

              public void reduce(Text key, Iterator<Text> values,

                                   OutputCollector<Text, Text> output,

                                   Reporter reporter) throws IOException {

                     String csv = "";

                     while (values.hasNext()) {

                            if (csv.length() > 0) csv += ",";

                            csv += values.next().toString();

                     }

                     output.collect(key, new Text(csv));

              }

       }

       public int run(String[] args) throws Exception {

              Configuration conf = getConf();

 

              JobConf job = new JobConf(conf, MyJob.class);

 

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

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

              FileInputFormat.setInputPaths(job, in);

              FileOutputFormat.setOutputPath(job, out);

             

              job.setJobName("MyJob");

              job.setMapperClass(MapClass.class);

              job.setReducerClass(Reduce.class);

 

              job.setInputFormat(KeyValueTextInputFormat.class);

              job.setOutputFormat(TextOutputFormat.class);

              job.setOutputKeyClass(Text.class);

              job.setOutputValueClass(Text.class);

              job.set("key.value.separator.in.input.line", ",");

 

              JobClient.runJob(job);

 

              return 0;

       }

 

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

              int res = ToolRunner.run(new Configuration(), new MyJob(), args);

              System.exit(res);

       }

}

1、我们习惯用单个类来完整地定义每个MapReduce作业,这里成为MyJob

2Hadoop要求MapperReducer必须是它们自身的静态类,这些类非常小,模板将它们包含在MyJob类中作为内部类,这样做的好处是可以把所有的东西放在一个文件内,简化代码管理

3、但是需要记住这些内部类是独立的,通常不与MyJob类进行交互

4、在作业执行期间,采用不同JVM的各类节点复制并运行MapperReducer,而其他的作业类仅在客户机上执行

 

解释下run()方法

1、框架的核心在run()方法中,也称为driver

2、它实例化、配置并传递一个JobConf对象命名的作业给JobClient.runJob()以启动MapReduce作业(反过来,JobClient类与JobTracker通信让该作业在集群上启动)

3JobConf对象将保持作业运行所需的全部配置参数

4Driver需要在作业中为每个作业定制基本参数,包括输入路径、输出路径、Mapper类和Reducer

5、每个作业可以重置默认的作业属性,例如,InputFormatOutputFormat等,也可以调用JobConf对象中的set()方法填充任意的配置参数

6、一旦传递JobConf对象到JobClient.runJob(),他就被视为决定这个作业如何运行的蓝本

 

关于driver的配置的一些说明

1JobConf对象有许多参数,但我们并不希望全部的参数都通过编写driver来设置,可以把Hadoop安装时的配置文件作为一个很好的起点

2、用户可能希望在命令行启动一个作业时传递额外的参数来改变作业配置

3Driver可以通过自定义一组命令并自行处理用户参数,来支持用户修改其中的一些配置

4、因为经常需要做这样的任务,Hadoop框架便提供了ToolRunnerToolConfigured来简化其实现。

5、当它们在上面的MyJob框架中被同时使用时,这些类使得作业可以理解用户提供的被GenericOptionParser支持的选项

 

比如下面的命令:

bin/hadoop jar playgroup/MyJob.jar MyJob input/cite75-99.txt output

如果我们运行作业仅仅是想看到mapper的输出 (处于调试的目的), 可以用选项 -D mapred.reduce.tasks=0reducer的数目设置为0

bin/hadoop jar playgroup/MyJob.jar MyJob -D mapred.reduce.tasks=0 input/cite75-99.txt output

 

通过使用ToolRunnerMyJob可以自动支持一下选项
GenericOptionsParser
支持的选项

选项

描述

-conf <configuration file>

指定一个配置文件

-D <property=value>

JobConf属性赋值

-fs <local | namenode:port>

指定一个NameNode,可以是 "local"

-jt <local | jobtracker:port>

指定一个JobTracker

-files <list of files>

指定一个以逗号分隔的文件列表,用于MapReduce作业。这些文件自动地分布到所有节点,使之可从本地获取

-libjars <list of jars>

指定一个以逗号分隔的jar文件,使之包含在所有任务JVMclasspath

-archives <list of archives>

指定一个以逗号分隔的存档文件列表,使之可以在所有任务节点上打开

 

模板代码MappperReducer

模板中习惯将Mapper类称为MapClass,而将Reducer类称为Reduce

MapperReducer都是MapReduceBase的扩展

MapReduceBase是个小类,包含configure()close(),我们使用上两个方法来建立和清除map(reduce)任务,除非是更高级的作业,通常我们并不需要覆盖它们

 

Mapper类和Reducer类模板说明

public static class MapClass extends MapReduceBase

       implements Mapper<K1, V1, K2, V2> {

       public void map (K1 key, V1 value,

                                   OutputCollector<K2, V2> output,

                                   Reporter reporter) throws IOException { }

}

public static class Reduce extends MapReduceBase

       implements Reducer<K1, V2, K3, V3> {

       public void reduce(K2 key, Iterator<V2> values,

                                   OutputCollector<K3, V3> output,

                                   Reporter reporter) throws IOException { }

}

Mapper类的核心操作为map()方法,Reduce类为reduce()方法。每一个map()方法的调用分别被赋予一个类型为K1V1的键/值对。这个键/值对由mapper生成,并通过OutputCollector对象的collect()方法来输出。你需要在map()方法中的合适位置调用:

output.collect((K2) k, (V2) v);

 

Reducerreduce()方法的每次调用均被赋予K2类型的键,以及V2类型的一组值。注意它必须与Mapper中使用的K2V2类型相同。Reduce()方法可能会循环遍历V2类型的所有值。

while (values.hasNext()) {

       V2 v = values.next();

}

Reduce()方法还使用OutputCollector来搜集其键/值的输出,它们的类型为K3/V3。在reudce()方法中可以调用

output.collect((K3) k, (V3) v);

除了在MapperReducer之间保持K2V3的类型一致,还需要确保在MapperReducer中使用的键值类型与在driver中设置的输入格式、输出键的类,以及输出值的类保持一致

使用KeyValueTextInputFormat意味着K1V1必须均为Text类型

Driver则必须调用setOutputKeyClass()setOutputValueClass()分别指定K2V2的类

最终:

1、所有的键与值的类型必须是Writable的子类型,来确保Hadoop的序列化接口可以把数据在分布式集群上发送

2、键的类型实现了WritableComparable,它是Writable的子接口,键的类型还需额外支持compareTo()方法,因为在MapReduce框架中键会被用来进行排序


© 著作权归作者所有

共有 人打赏支持
祥林会跟你远走高飞
粉丝 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实战读书笔记(6)

putmerge程序的大体流程是? 1、根据用户定义的参数设置本地目录和HDFS的目录文件 2、提取本地输入目录中每个文件的信息 3、创建一个输出流写入到HDF文件 4、遍历本地目录中的每个文件,打开...

祥林会跟你远走高飞 ⋅ 2014/12/08 ⋅ 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实战读书笔记(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

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

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

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

读书笔记博客实战之搜索引擎索引和流量涨跌策略分析[图]

写在前面:最近百度动作频繁,变化十分大,以至于很多网站都出现了流量的大范围波动,引起了站长们的思考和分析猜测,但通过数据来分析是最可靠的观点,那么我们今天就来分析一下这几天百度在...

原创小博客 ⋅ 05/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

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

JavaScript零基础入门——(十)JavaScript的DOM基础 欢迎大家回到我们的JavaScript零基础入门,上一节课,我们了解了JavaScript中的函数,这一节课,我们来了解一下JavaScript的DOM。 第一节...

JandenMa ⋅ 19分钟前 ⋅ 0

Spring mvc DispatchServlet 实现原理

在Spring中, ContextLoaderListener只是辅助类,在web 容器启动的时候查找并创建WebApplicationContext对象,通过该对象进行加载spring的配置文件。而真正的逻辑实现其实是在DispatcherSer...

轨迹_ ⋅ 30分钟前 ⋅ 0

Weex起步

本教程假设你已经在你的本地环境安装了node 其实weex起步教程在 https://github.com/lilugirl/incubator-weex 项目说明文件中都已经有了,但为了有些同学看到英文秒变文盲,所以这里我重新写...

lilugirl ⋅ 38分钟前 ⋅ 0

Jenkins实践1 之安装

1 下载 http://mirrors.jenkins.io/war/latest/jenkins.war 2 启动 java -jar jenkins.war 前提:安装jdk并配置环境变量 启动结果节选: ************************************************......

晨猫 ⋅ 45分钟前 ⋅ 0

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 =...

阿豪boy ⋅ 54分钟前 ⋅ 0

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 今天 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 今天 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 今天 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部