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. typescript-----javascript的超集,typescript学习笔记持续更新中......

    Typescript,冲! Typescript 不是一门全新的语言,Typescript是 JavaScript 的超集,它对 JavaScript进行了一些规范和补充.使代码更加严谨. 一个特别好 ...

  2. 人生最好的php,mysql,linux,redis,docker等相关技术经典面试题,新手收藏学习,持续更新中。。。

    php面试题 1.写出你能想到的所有HTTP返回状态值,并说明用途(比如:返回404表示找不到页面) # 200:服务器请求成功 # 301:永久重定向,旧网页已被新网页永久替代 # 302:表示临时 ...

  3. JS逆向学习笔记 - 持续更新中

    JS逆向学习笔记 寻找深圳爬虫工作,微信:cjh-18888 文章目录 JS逆向学习笔记 一. JS Hook 1. JS HOOK 原理和作用 原理:替换原来的方法. (好像写了句废话) 作用: 可 ...

  4. Docker快速入门学习笔记-持续更新中

    Docker安装 #1.卸载旧的版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker ...

  5. 渗透学习-SQL注入篇-基础知识的学习(持续更新中)

    提示:仅供进行学习使用,请勿做出非法的行为.如若由任何违法行为,将依据法律法规进行严惩!!! 文章目录 前言 一.SQL注入产生的原因 二.手工注入大致过程 1.判断注入点: 2.猜解列名 3.猜解能 ...

  6. 专升本 计算机 公共课学习笔记(持续更新中...)

    计算机公共课学习笔记 第一章 计算机基础知识(30分) 1.计算机概述 计算机(Computer)的起源与发展 计算机(Computer)也称"电脑",是一种具有计算功能.记忆功能 ...

  7. Java学习笔记(持续更新中)

    文章目录 项目实战 mall项目(SpringBoot项目) 1. 添加Swagger-UI配置,修改MyBatis Generator注释的生成规则 2. redis基础配置 3. SpringSe ...

  8. 【电气设计】理论知识学习(持续更新中...)

    背景介绍: 魔石建筑/2013年电气设计初级班/王维民工程师 培训目标: 1.学会多层及下高层建筑电气施工图设计: 2.能够进入设计院从事多层及小高层建筑电气施工图设计: 3.能够从事助理电气设计师工 ...

  9. PIXI学习历程 -- 持续更新

    开头先贴上PIXI官方文档入门到制作小游戏过程链接:https://github.com/Zainking/learningPixi : 以下是个人自我摸索的过程,有好的建议和错误欢迎指出~~ 目前使 ...

最新文章

  1. js 创建一条通用链表
  2. Android Studio - HPROF文件查看和分析工具
  3. bootstrap inputfile.js
  4. python数据库自动对接_如何使用Python连接MySQL建立自动化监控报表
  5. 服务器安装系统的工具,工具集#08 服务器安装系统指南
  6. ERP项目实施记录04
  7. 【软测试】(两)计算机组成原理-cpu
  8. java服务发现_【Java】Eureka – 服务发现(Server)
  9. 如何将pdf转换成word文档,文件格式转换器选择
  10. 计算机病毒445端口,关闭135 445端口_445端口关闭方法_怎么防止电脑中勒索病毒
  11. 各种卫星产品数据总结
  12. 谢霆锋张柏芝被曝婚变 范范微博擦泪为好友祷告
  13. 网站快照被劫持解决办法:织梦程序
  14. 计算机系统限制某个用户只允许,Win10系统如何设置某些用户只能运行指定应用程序...
  15. Unity中图片挖洞
  16. 来自一位双非本科跌跌撞撞的秋招指南(秋招攻略/经验分享/干货)
  17. 文献综述十九:基于会员通用积分的客户关系管理系统设计与实现
  18. 如何批量生成食品电子监管码
  19. RA-CNN算法笔记
  20. Android - 谷歌的一剂药

热门文章

  1. 支付宝app支付对接2(文档和对接注意问题)
  2. 第一周(1.8-1.14)
  3. 《Objective-c》Foundation框架 -(结构体:Range、Point、Size、Rect)
  4. Android 抓包的一些命令 及 adb使用的一些注意事项
  5. UNIX环境高级编程——无名管道和有名管道
  6. Css实现的鼠标滑动选项卡菜单代码
  7. 论文阅读|How Does Batch Normalization Help Optimization
  8. Linux挂载共享文件
  9. char[],char *,string之间转换
  10. bzoj 4747: [Usaco2016 Dec]Counting Haybales