1. Hadoop FS Shell

  Hadoop之所以可以实现分布式计算,主要的原因之一是因为其背后的分布式文件系统(HDFS)。所以,对于Hadoop的文件操作需要有一套全新的shell指令来完成,而这就是Hadoop FS Shell。它主要是用于对Hadoop平台进行文件系统的管理。

  有关HDFS的介绍博客请移步:Hadoop学习笔记之Hadoop基础

  有关Hadoop FS Shell的学习文档:Hadoop FS Shell学习文档

2. Hadoop Streaming

  我们知道Hadoop集群上的一些MapReduce代码一般是利用Java来进行开发的,那么对于很多像博主一样的不会Java的同学该怎么办呢,是不是我们必须要在使用Hadoop之前要学会Java呢?当然,如果Java对你没有什么帮助的话,你是完全没有必要额外为了Hadoop来学习Java的。Hadoop Streaming就是Hadoop为了帮助用户创建和运行一些特殊的map/reduce作业而开发的一个工具,它可以被看做是一个API,可以使用户很方便地利用一些脚本语言(比如,bash shell或者Python)来写Mapper和Reducer。

  下面是Hadoop Streaming的学习文档:Hadoop Streaming学习文档

3. Hadoop的输入和输出

  Hadoop的输入和输出分别为标准输入和标准输出,这是在学习hadoop时首先要记住的。对于第一次编写hadoop job的同学来说,如果没有认识到这点的重要性的话,可能都不知道hadoop如何在本地进行测试。Hadoop的输入输出是基于标准输入和标准输出的,那么我们在本地测试的时候就要利用bash命令来模拟这个过程,所以常见的unittest形式如下:

cat input | mapper | sort | reducer > output

  其中的sort命令的左右是在模拟reducer输入的过程。对于数据流而言,具有相同key的数据流会聚合在一起(但是value是无序的),而且会被分发给同一个reducer,所以sort命令主要是在模拟这个过程,关于这个问题在下边的combiner和partitioner部分会进行详细介绍。

4. Hadoop MapReduce & Shuffler

  我们学习Hadoop实际上就是在学习一种全新的计算框架,它基于分布式的技术存储,利用MapReduce思想实现海量数据处理的目的。在没有实际接触Hadoop时,很多参考书上都这样说:MapReduce主要为两个阶段:Map阶段和Reduce阶段。这句话确实没有错,但是如果想完全的理解整个MapReduce思想,除了认识上述两个阶段还要深刻理解一个很重要的中间过程——shuffler,其中shuffler包含了combiner和partitioner。

  下图为MapReduce的整体框架,其中shuffler部分的操作介于Mapper和Reducer之间,它的主要功能为处理Mapper的输出并为Reducer提供相应的输入文件,主要操作为combiner和partitioner。

  我们可以这样来理解上述的三种中间操作:

  combiner:分为Mapper端和Reducer端,主要作用是将键值对中具有相同key的放在一起;

  partitioner:把键值对按照key分配给reducer。

  combiner和partitioner两者结合可以使得每一个Reducer的输入是按照key进行聚合的,而且同一个key所对应的数据流只会被分配到同一个Reducer,这就极大地简化了Reducer的任务。

  下图为显示了combiner和partitioner两个中间操作的MapReduce框架图,这个例子是做词频统计:

  我们可以看到combiner的作用就是按照key将Mapper的输出进行聚合,而partitioner会将所有combiner的结果按照key进行分发,分发给不同的Reducer进行数据的处理。我们在Reducer端可以看到两点:

  第一,所有具有相同key的数据流均被分发到同一个Reducer;

  第二,每个Reducer的输入中数据流是按照key进行聚合的,即具有相同key的数据流是连在一起的。

这样我们在Reducer端就可以很轻松的完成词频统计的任务,我们可以按照数据流的顺序进行词频的统计,如果当前数据流的key与上一个数据流的key相同,那么就将该key对应的词频进行累加,如果不同说明该key已经被统计完成,则进行下一个词的统计即可。

  此外,在hadoop的配置中我们可以为partitioner配置相应的参数来控制partitioner按照不同的列来进行数据的切分,hadoop的默认设置是按照key进行数据的切分。

  其实除了combiner和partitioner以外,还有一些中间操作也需要进行深刻的理解,比如hadoop的sort过程。在这里,我们可以简单了解一下Reducer端的sort,它其实是一种二次排序(secondary sort)。我们知道在hadoop中每个Reducer的输入数据流中,数据流都是按照key聚合好的,但是其对应value则是无序的,即同一个job运行多次,由于Mapper完成的顺序不同,Reducer收到的value的顺序则是不固定的,那么如何才能使得Reducer接收的value成为有序的呢?这就是secondary sort需要解决的问题,它的应用场景常见的有求每个key下的最小/最大value值等。

  此外,我们也可以通过参数来控制secondary sort相应的作用域。

5. Hadoop常见操作

5.1 count操作

  count(计数/统计)是hadoop最为常见的操作之一。它的基本思想是就是上述词频统计的例子所讲述的,由于每个Reducer的输入都是按照key进行聚合的,所以可以根据key来顺序的进行累加。

5.2 join操作

  join(拼接)是hadoop中最为常见的操作之一,它的主要任务就是将多张数据表按照某个字段拼接成一个表。要想写出join操作需要考虑周全,否则会得到意想不到的结果。(PS:我在刚开始run第一个join job的时候,发现输出结果总是不对,检查了mapper和reducer的代码逻辑觉得都没有问题,一直不知道是哪里出问题,最后终于找到了原因,原来是MapReduce参数设置的问题: Mapper的output key fields = 2(按第1,2列排序);Reducer partition fields = 1(按第一列切分给reducer作为输入)。)

  join的思想有很多种,但是常用的一种可以这样来理解:

  mapper阶段:由于数据流来自不同的数据表,所以mapper是将每一个数据流进行打标签(tag),用于区别不同表的数据流;

  reducer阶段:根据mapper中的tag来区分数据流,并对于不同的数据流按照自己的业务需求设计不同的操作,最后将不同的表进行拼接。

  上述的join思想被称为是reducer端拼接。

  join操作还有一个巧妙的应用就是加载大词典,避免直接利用streaming加载一些特别大的词典。比如,我们现在要处理海量的日志,命中词典中userid的日志挑选出来,问题很简单,但是词表很大,可能内存不足以加载,这时候怎么办?我们借助join的思想:将大词典看作是一份特殊的日志,将两份日志join后输出即可满足要求了。[20160519 update.]

5.3 其他操作

  除了上述的count和join两种常用的操作,hadoop还有很多操作,比如简单的字段处理操作。在简单的字段处理操作中,比如加/减某个字段,改写某个字段,抽取某些字段等等,我们只需要mapper就可以了,此时不需要reducer进行任何操作,这时候reducer直接输出mapper的结果就可以了,在streaming中reducer端实际上为一个cat命令。

[Hadoop] Hadoop学习历程 [持续更新中…]的更多相关文章

  1. Pig基础学习【持续更新中】

    *本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.* Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的,可以作为MapR ...

  2. Linux学习历程(持续更新整理中)

    1.文件目录操作命令 (1) ls   显示文件和目录列表 a ls -l  显示文件的详细信息 b ls -a 列出当前目录的所有文件,包含隐藏文件. c stat '目录/文件'   显示指定目录 ...

  3. python的一些学习资料(持续更新中)

    Markdown在线编辑器 廖雪峰官方博客[基础入门好资料] python-guide[传说中的巨牛写的] the5fire的技术博客[全职python程序员博客]

  4. Java学习目录(持续更新中)

  5. GOF 的23种JAVA常用设计模式 学习笔记 持续更新中。。。。

    前言: 设计模式,前人总结下留给后人更好的设计程序,为我们的程序代码提供一种思想与认知,如何去更好的写出优雅的代码,23种设计模式,是时候需要掌握它了. 1.工厂模式 大白话:比如你需要一辆汽车,你无 ...

  6. 痞子衡嵌入式:史上最强i.MX RT学习资源汇总(持续更新中...)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MX RT学习资源. 类别 资源 简介 官方汇总 i.MXRT产品主页 恩智浦官方i.MXRT产品主页,最权威的资料都在这里,参考手 ...

  7. 史上最全的spark面试题——持续更新中

    史上最全的spark面试题——持续更新中 2018年09月09日 16:34:10 为了九亿少女的期待 阅读数 13696更多 分类专栏: Spark 面试题   版权声明:本文为博主原创文章,遵循C ...

  8. Pig语言基础-【持续更新中】

      ***本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.***   Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的, ...

  9. 中国.NET:各地微软技术俱乐部汇总(持续更新中...)

    中国.NET:各地微软技术俱乐部汇总(持续更新中...)   本文是转载文,源地址: https://www.cnblogs.com/panchun/p/JLBList.html by ​史记微软. ...

随机推荐

  1. TCP十一种状态

    2.全部11种状态 2.1.客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT . 2.2.服务器独有的:(1)L ...

  2. Servlet入门笔记

    一.一个简单的Servlet 在servlet 3.0之前,下面是基本步骤: 1.新建一个class名为FirstServlet,让它继承javax.servlet.http.HttpServlet: ...

  3. USB Host的上拉下拉电阻

      关于USB的上下拉电阻,不是随便接个任意阻值的电阻就ok了. 当你的USB为主设备的时候,D+.D-上分别接一个15K的下拉电阻,这样可以使得在没有设备插入的时候,D+.D-上始终保持低电平:当为 ...

  4. ZBrush中的头部模型该如何进行雕刻

    使用ZBrush®能够快速雕刻人物头部模型,教程只是大概介雕刻前的准备工作和一些软件基础,真正的雕刻还需要学习者具备一定的功底,本文向大家展示头部模型制作流程解析,初学者可以以它做参考拓展自己思路. ...

  5. [原]CentOS7 部署GeoServer2.92

    转载请注明作者think8848和出处(http://think8848.cnblogs.com) 1. 安装Jre 1. 安装ftp客户端 sudo yum install ftp -y 2. 登录 ...

  6. [LeetCode] Best Time to Buy and Sell Stock II 买股票的最佳时间之二

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  7. [开源].NET高性能框架Chloe.ORM-完美支持.NET Core

    扯淡 这是一款轻量.高效的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq(但不支持 Linq).借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询. ...

  8. NDT(Normal Distribution Transform) 算法(与ICP对比)和一些常见配准算法

    原文地址:http://ghx0x0.github.io/2014/12/30/NDT-match/ By GH 发表于 12月 30 2014 目前三维配准中用的较多的是ICP迭代算法,需要提供一个 ...

  9. Android 提醒公共方法 Notification

    SimpAndroidFarme是近期脑子突然发热想做的android快速开发的框架,目标是模块化 常用的控件,方便新手学习和使用.也欢迎老鸟来一起充实项目:项目地址 今天的目标是做一个公共的提醒方法 ...

  10. iOS 读取大文件时候的注意点

    转: 使用NSData读取数据,采用NSData的dataWithContentsOfFile:方法.不少人反馈说如果直接使用,将会耗尽iOS的内存. 其实这个是可以改善的. NSData还有一个AP ...