一、github使用手册

1. 我也用github(2)——关联本地工程到github

2. Git错误non-fast-forward后的冲突解决

3. Git中从远程的分支获取最新的版本到本地

4. Git教程

二、案例:倒排索引

1. 完成功能:

统计一系列文本文件中的每个单词构成的倒排索引。

1)分析:
(1)倒排索引主要是用来存储某个单词在一个文档中或者一组文档中出现的位置映射关系,即提供一个根据内容查找文档的方式。

(2)加权倒排索引,在确定指定单词到文档位置的映射关系的时候,加入权重考虑信息。

代码演示:

git@github.com:yeahwell/demobigdata.git

三、用户自定义数据类型

1. MapReduce中的数据类型

至少有两种用途:
第一个用途,这些类型定义的数据可以被序列化进行网络传输和文件存储,

第二个用途,在shuffle阶段要可以进行大小比较。

那么在hadoop中解决第一种方式采用hadoop的接口Writable,第二种采用接口java接口Comparable

(Hadoop将这两个接口结合提供了WritableComparable接口)。

Hadoop提供了很多的内置数据类型,比如:MapWritable, LongWritable, IntWritable, BooleanWritable, ByteWritable, DoubleWritable, FloatWritable, Text, NullWritable等。

2. 用户定制数据输入格式化器

数据输入格式(InputFormat)用于描述MR作业的数据输入格式规范。

MapReduce框架依赖InputFormat进行输入数据分片以及提供读取分片数据的RecordReader实例对象。

每一个InputFormat类都会有一个对应的RecordReader类,RecordReader类主要作用是将输入数据转换为键值对,传输给mapper阶段的map方法。

MapReduce默认的数据输入格式是:TextInputFormat(LineRecordReader)。除了这个格式器以外,还有KeyValueTextInputFormat, CombineTextInputFormat, SequenceFileInputFormat, DBInputFormat等。

1)全称:org.apache.hadoop.mapreduce.InputFormat

方法详解:
getSplits:返回值是分片信息集合;作用:通过分片个数确定mappre的个数,并根据分片信息中的数据地址信息决定是否采用数据本地化策略。
createRecordReader:创建一个具体读取数据并构造key/value键值对的RecordReader实例对象。

2)全称:org.apache.hadoop.mapreduce.RecordReader

方法详解:
initialize:根据对应的分片信息进行初始化操作。
nextKeyValue:判断是否还有下一个key/value键值对,如果有返回true;否则返回false。
getCurrentKey/getCurrentValue:获取当前key/value键值对。
getProgress:获取操作进度信息。
close:关闭资源读取相关连接。

3)全称:org.apache.hadoop.mapreduce.InputSplit

方法详解:
getLength:获取分片长度。
getLocations:获取该分片数据对应的位置信息,确定数据本地化时候有用。

3. 用户定制数据输出格式化器

数据输出格式(OutputFormat)用于描述MR作业的数据输出格式规范。

MapReduce框架依赖OutputFormat进行输出路径(输出空间)检测、获取提交job的OutputCommitter实例对象以及提供一个具体定义如何输出数据的RecordWriter实例对象。

每一个OutputFormat类都会有一个对应的RecordWriter类,RecordWriter类主要作用是明确定义如何写入以及写入的格式,接收reducer阶段输出的key/value键值对。
MapReduce默认的数据输出格式是:TextOutputFormat(LineRecordWriter)。除了这个格式器以外,还有SequenceFileOutputFormat, DBOutputFormat等。

1)全称:org.apache.hadoop.mapreduce.OutputFormat

方法详解:
getRecordWriter:创建一个具体写数据的RecordWriter实例。
checkOutputSpecs:检测输出空间相关信息,如果检测失败,直接抛出异常。
getOutputCommitter:获取一个提交job的committer对象。一般情况下,直接使用FileOutputCommitter对象即可。如果觉得FileOutputCommitter内容比较多,也可以自己实现一个完全为空的类。

2)全称:org.apache.hadoop.mapreduce.RecordWriter

方法详解:
write:接收reducer阶段产生的输出key/value键值对数据,并将其写出。
close:关闭流,进行一些其他操作。

四、案例:MongoDB Hadoop

1. 实现功能:

从MongoDB中读取日志数据,将MapReduce程序处理过的数据写出到MongoDB中。

2. 代码演示:

git@github.com:yeahwell/demobigdata.git

五、Shuffle阶段说明

1. shuffle阶段

1)shuffle阶段主要包括map阶段的combine、group、sort、partition以及reducer阶段的合并排序。

2)map阶段通过shuffle后会将输出数据按照reduce的分区分文件的保存,文件内容是按照定义的sort进行排序好的。

3)map阶段完成后会通知ApplicationMaster,然后AM会通知Reduce进行数据的拉取,在拉取过程中进行reduce端的shuffle过程。

2. 用户自定义combiner

1)Combiner可以减少Map阶段的中间输出结果数,降低网络开销。默认情况下是没有Combiner的。

2)用户自定义的Combiner要求是Reducer的子类,以Map的输出<key,value>作为Combiner的输入<key,value>和输出<key,value>,也就是说Combiner的输入和输出必须是一样的。

3)可以通过job.setCombinerClass设置combiner的处理类,MapReduce框架不保证一定会调用该类的方法。

3. 用户自定义Partitoner

1)Partitioner是用于确定map输出的<key,value>对应的处理reducer是那个节点。

2)默认MapReduce任务reduce个数为1个,此时Partitioner其实没有什么效果,但是当我们将reduce个数修改为多个的时候,partitioner就会决定key所对应reduce的节点序号(从0开始)。

3)可以通过job.setPartitionerClass方法指定Partitioner类,默认情况下使用HashPartitioner(默认调用key的hashCode方法)。

4.  用户自定义Group

1)GroupingComparator是用于将Map输出的<key,value>进行分组组合成<key,List<value>>的关键类,直白来讲就是用于确定key1和key2是否属于同一组,如果是同一组,就将map的输出value进行组合。

2)要求我们自定义的类实现自接口RawComparator,可以通过job.setGroupingComparatorClass方法指定比较类。

3)默认情况下使用WritableComparator,但是最终调用key的compareTo方法进行比较。

5. 用户自定义Sort

1)SortComparator是用于将Map输出的<key,value>进行key排序的关键类, 直白来讲就是用于确定key1所属组和key2所属组那个在前,那个在后。

2)要求我们自定义的类实现自接口RawComparator,可以通过job.setSortComparatorClass方法指定比较类。

3)默认情况下使用WritableComparator,但是最终调用key的compareTo方法进行比较。

6. 用户自定义Reducer的Shuffle

1)在reduce端拉取map的输出数据的时候,会进行shuffle(合并排序),

2)MapReduce框架以插件模式提供了一个自定义的方式,我们可以通过实现接口ShuffleConsumerPlugin,并指定参数mapreduce.job.reduce.shuffle.consumer.plugin.class来指定自定义的shuffle规则,

但是一般情况下,直接采用默认的类org.apache.hadoop.mapreduce.task.reduce.Shuffle。

六、案例:二次排序

1. 实现功能

hadoop默认只对key进行排序,有时候我们需要将value部分也进行排序。

这种情况下有两种方式实现:

第一种,我们将排序放到reducer端进行,但是这种方式当数据量比较大的时候,会比较消耗内存。

那么另外一种方式就是二次排序。二次排序的内部实行其实是先按照key+value组合的方式进行排序,然后根据单独key进行分组的一种实行方式。

要求reducer个数为2,而且奇数到第一个reducer进行处理,偶数到第二个reducer进行处理。

2. 代码演示

git@github.com:yeahwell/demobigdata.git

hadoop jar demobigdata.jar com.webmovie.bigdata.mapreduce.shuffle.DemoRunner 

《OD大数据实战》MapReduce实战的更多相关文章

  1. 《OD大数据实战》HDFS入门实例

    一.环境搭建 1.  下载安装配置 <OD大数据实战>Hadoop伪分布式环境搭建 2. Hadoop配置信息 1)${HADOOP_HOME}/libexec:存储hadoop的默认环境 ...

  2. 《OD大数据实战》驴妈妈旅游网大型离线数据电商分析平台

    一.环境搭建 1. <OD大数据实战>Hadoop伪分布式环境搭建 2. <OD大数据实战>Hive环境搭建 3. <OD大数据实战>Sqoop入门实例 4. &l ...

  3. 《OD大数据实战》Hive环境搭建

    一.搭建hadoop环境 <OD大数据实战>hadoop伪分布式环境搭建 二.Hive环境搭建 1. 准备安装文件 下载地址: http://archive.cloudera.com/cd ...

  4. 【机器学习实战】第15章 大数据与MapReduce

    第15章 大数据与MapReduce 大数据 概述 大数据: 收集到的数据已经远远超出了我们的处理能力. 大数据 场景 假如你为一家网络购物商店工作,很多用户访问该网站,其中有些人会购买商品,有些人则 ...

  5. 《大数据Spark企业级实战 》

    基本信息 作者: Spark亚太研究院   王家林 丛书名:决胜大数据时代Spark全系列书籍 出版社:电子工业出版社 ISBN:9787121247446 上架时间:2015-1-6 出版日期:20 ...

  6. 大数据存储:MongoDB实战指南——常见问题解答

    锁粒度与并发性能怎么样? 数据库的读写并发性能与锁的粒度息息相关,不管是读操作还是写操作开始运行时,都会请求相应的锁资源,如果请求不到,操作就会被阻塞.读操作请求的是读锁,能够与其它读操作共享,但是当 ...

  7. 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习

    下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...

  8. 大数据技术 - MapReduce的Combiner介绍

    本章来简单介绍下 Hadoop MapReduce 中的 Combiner.Combiner 是为了聚合数据而出现的,那为什么要聚合数据呢?因为我们知道 Shuffle 过程是消耗网络IO 和 磁盘I ...

  9. 《OD大数据实战》环境整理

    一.关机后服务重新启动 1. 启动hadoop服务 sbin/hadoop-daemon.sh start namenode sbin/hadoop-daemon.sh start datanode ...

  10. 大数据与Mapreduce

    第十五章 大数据与Maprudece 一.引言 实际生活中的数据量是非常庞大的,采用单机运行的方式可能需要若干天才能出结果,这显然不符合我们的预期,为了尽快的获得结果,我们将采用分布式的方式,将计算分 ...

随机推荐

  1. python 小试牛刀之信息管理

    这个是之前写的半成品,但是一直没有好好的写完,今晚我把它补充完整,并且贴出了遇到的问题 这个程序并没有处理中文,主要是python 2.7对于中文的支持太蛋疼了,虽然可以设置utf8编码,但是如果列表 ...

  2. ASP.NET输出PNG图片时出现GDI+一般性错误的解决方法

    偶原来的用ASP.NET生成验证码图片时用的是JPG格式,今天想把它改成PNG格式的,结果就出现GDI+一般性错误,查了N久资料,才发现解决的办法,对分享此解决办法的网友深表感谢 Response.C ...

  3. 非阻塞式JavaScript脚本介绍

    JavaScript 倾向于阻塞浏览器某些处理过程,如HTTP 请求和界面刷新,这是开发者面临的最显著的性能问题.保持JavaScript文件短小,并限制HTTP请求的数量,只是创建反应迅速的网页应用 ...

  4. 还是说Memory Model,gcc的__sync_synchronize真是太坑爹了

    还是说Memory Model,gcc的__sync_synchronize真是太坑爹了! 时间 2012-01-29 03:18:35  IT牛人博客聚合网站 原文  http://www.udpw ...

  5. swfObject 使用说明

    1.Embed your SWF with JavaScript 使用方法  swfobject.embedSWF(swfUrl, id, width, height, version, expres ...

  6. 转载——有感于三个50岁的美国程序员的生活状态与IT职业杂想

    明天就是国庆节了,今天也不想干活干的太累了!写一篇以前去美国出差的杂想,对比于美国50多岁的程序员和大多数50多岁国内父母的生活状态有感而发. 前几年正好有一个项目的机会出差去了一次美国,地点是美国中 ...

  7. poj 1511(SPFA+邻接表)

    题目链接:http://poj.org/problem?id=1511 思路:题目意思很简单就是要求源点到各点的最短路之和,然后再求各点到源点的最短路之和,其实就是建两个图就ok了,其中一个建反图.1 ...

  8. jmeter中线程之间传递参数

    JMeter 变量作用域局限于所属线程.这样设计是经过深思熟虑的,目的是让测试线程能够独立运转.有时候用户可能需要在不同线程间(可能属于同一个线程组,也可能不属于同一个线程组)传递变量. 其中一种方法 ...

  9. java理论基础学习二

    JAVA开发工具 文本编辑器 UltraEdit EditPlus notepad++ 集成开发环境 IDE Integrated Development Enviroment JBuilder  h ...

  10. Visual Studio 2010 快捷键

    Visual Studio 2010 快捷键: CTRL + SHIFT + B 生成解决方案CTRL + F7 生成编译CTRL + O 打开文件CTRL + SHIFT + O 打开项目CTRL ...