一、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. javascript中继承(一)-----原型链继承的个人理解

    [寒暄]好久没有更新博客了,说来话长,因为我下定决心要从一个后台程序员转为Front End,其间走过了一段漫长而艰辛的时光,今天跟大家分享下自己对javascript中原型链继承的理解. 总的说来, ...

  2. 封装dll遇到的奇葩错误:error LNK2005: _DllMain@12 已经在 DLLMain.obj 中定义

    在定义一个dll工程的时候,一添加MFC的头文件就会报出这个 错误:error LNK2005: _DllMain@12 已经在 DLLMain.obj 中定义  既蛋疼又蛋疼!! 然后逛论坛,查资料 ...

  3. Ckeditor注册事件

    这段时间使用js+cookies进行自动草稿保存,个人觉的,这些全在客户端处理比较的好,所以没有使用AJAX+数据库的自动草稿保存方法. 结果出现Ckeditor无法绑定onkeyup,onselec ...

  4. SEO优化的黑帽手法是否值得使用?

    PR劫持 可能很多人也会听到说,什么网站权重越高越好,这也就是后面越来越多人都对谷歌的PR的宣传看的很重,自建站的都追求PR值,权重越高代表这个网站越受信任. 比如一个新站PR值为0,一个老站PR为6 ...

  5. 2016年度 JavaScript 展望(上)

    [编者按]本文作者为资深 Web 开发者 TJ VanToll, TJ 专注于移动端 Web 应用及其性能,是<jQuery UI 实践> 一书的作者. 本文系 OneAPM 工程师编译呈 ...

  6. Google NACL 简介

    Back to README Getting Started This page tells you how to install Native Client and run demos, both ...

  7. POJ 3281

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8577   Accepted: 3991 Descriptio ...

  8. POJ 1953

    //FINBONACI数列 #include <iostream> #define MAXN 100 using namespace std; int _m[MAXN]; int main ...

  9. (转)Android学习进阶路线导航线路(Android源码分享)

     转载请注明出处:http://blog.csdn.net/qinjuning 前言:公司最近来了很多应届实习生,看着他们充满信心但略带稚气的脸庞上,想到了去年的自己,那是的我是不是也和 现在的他们一 ...

  10. Nutch配置:nutch-default.xml详解

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...