最短路径系列
之一
从零开始学习 Hadoop
作者三个主站:
csdn 主页:http://blog.csdn.net/lizhe_dashuju
豆瓣主页:http://www.douban.com/people/79049984/
新浪博客:http://blog.sina.com.cn/u/2436144507
敬请关注,谢谢!
内容目录
第 2
前言.................................................................................................................................................................................................5
章 Hadoop 的安装..................................................................................................................................................................7
第 1
1. 操作系统...............................................................................................................................................................................7
2. Hadoop 的版本......................................................................................................................................................................7
3. 下载 Hadoop..........................................................................................................................................................................7
4. 安装 Java JDK.......................................................................................................................................................................8
5. 安装 hadoop..........................................................................................................................................................................9
6. 安装 rsync 和 ssh.................................................................................................................................................................10
7. 启动 hadoop........................................................................................................................................................................10
8. 测试 hadoop.........................................................................................................................................................................11
9. 练习.....................................................................................................................................................................................11
章 第一个 MapReduce 程序................................................................................................................................................12
1. Hadoop 从头说....................................................................................................................................................................12
1.1 Google 是一家做搜索的公司.....................................................................................................................................12
1.2 MapReduce 和 HDFS 是如何工作的.........................................................................................................................13
1.3 API 参考.......................................................................................................................................................................13
2. 词频统计.............................................................................................................................................................................13
3. 标准形式的 MapReduce 程序............................................................................................................................................14
3.1 目录和文件结构.........................................................................................................................................................14
3.2 TokenizerMapper .java 文件的源代码.......................................................................................................................14
3.3 IntSumReducer.java 文件的源代码............................................................................................................................16
3.4 WordCount.java 文件的源代码..................................................................................................................................18
3.5 编译.............................................................................................................................................................................19
3.6 打包..............................................................................................................................................................................20
3.7 执行..............................................................................................................................................................................20
3.8 查看结果......................................................................................................................................................................20
4. 最简形式的 MapReduce.....................................................................................................................................................20
4.1 目录和文件结构.........................................................................................................................................................21
4.2 WordCount.java 文件的源代码..................................................................................................................................21
4.3 编译..............................................................................................................................................................................22
4.4 打包..............................................................................................................................................................................23
4.5 运行..............................................................................................................................................................................23
4.6 查看结果......................................................................................................................................................................23
章 HDFS 分布式文件系统..................................................................................................................................................24
1. 文件系统从头说.................................................................................................................................................................24
2. Hadoop 的文件系统...........................................................................................................................................................25
3. 如何将文件复制到 HDFS..................................................................................................................................................25
3.1 目录和文件结构.........................................................................................................................................................25
3.2 FileCopy.java 文件的源代码......................................................................................................................................25
3.3 编译..............................................................................................................................................................................26
第 3
3.4 打包..............................................................................................................................................................................26
3.5 运行..............................................................................................................................................................................27
3.6 检查结果......................................................................................................................................................................27
4. 从 HDFS 删除文件.............................................................................................................................................................27
4.1 目录和文件结构.........................................................................................................................................................27
4.2 FileDelete.java 文件的源代码....................................................................................................................................27
4.3 编译..............................................................................................................................................................................28
4.4 打包..............................................................................................................................................................................28
4.5 运行..............................................................................................................................................................................28
4.6 检查结果......................................................................................................................................................................29
5. 读取 HDFS 的文件.............................................................................................................................................................29
5.1 目录和文件结构.........................................................................................................................................................29
5.2 FileCat.java 文件的源代码.........................................................................................................................................29
5.3 编译..............................................................................................................................................................................30
5.4 打包..............................................................................................................................................................................30
5.5 运行..............................................................................................................................................................................31
6. 获取文件的属性信息.........................................................................................................................................................31
6.1 目录和文件结构.........................................................................................................................................................31
6.2 FileInfo.java 文件的源代码........................................................................................................................................31
6.3 编译..............................................................................................................................................................................32
6.4 打包..............................................................................................................................................................................32
6.5 运行..............................................................................................................................................................................33
7. 列出目录下所有文件.........................................................................................................................................................33
7.1 目录和文件结构.........................................................................................................................................................33
7.2 FileList.java 文件的源代码........................................................................................................................................34
7.3 编译..............................................................................................................................................................................34
7.4 打包..............................................................................................................................................................................34
7.5 运行..............................................................................................................................................................................35
章 序列化..............................................................................................................................................................................36
1. 序列化从头说.....................................................................................................................................................................36
2. Hadoop 的序列化接口.......................................................................................................................................................36
3. IntWritable 如何序列化......................................................................................................................................................37
3.1 目录和文件结构.........................................................................................................................................................37
3.2 IntSer.jav 文件的源代码.............................................................................................................................................37
3.3 编译..............................................................................................................................................................................39
3.4 打包..............................................................................................................................................................................39
3.5 运行..............................................................................................................................................................................39
章 压缩..................................................................................................................................................................................40
1. 压缩从头说.........................................................................................................................................................................40
2. 从文件到文件的压缩.........................................................................................................................................................40
2.1 文件和目录结构.........................................................................................................................................................40
2.2 CprsF2F.java 源文件的代码.......................................................................................................................................41
2.3 编译..............................................................................................................................................................................42
2.4 打包..............................................................................................................................................................................42
第 4
第 5
第 6
2.5 执行..............................................................................................................................................................................42
3. 从标准输入到文件的压缩.................................................................................................................................................42
3.1 文件和目录结构.........................................................................................................................................................42
3.2 CprsIn2F.java 源文件的代码......................................................................................................................................42
3.3 编译..............................................................................................................................................................................43
3.4 打包..............................................................................................................................................................................43
3.5 执行..............................................................................................................................................................................44
4 从文件到文件的解压缩......................................................................................................................................................44
4.1 文件和目录结构.........................................................................................................................................................44
4.2 DcprsF2F.java 源文件的代码.....................................................................................................................................44
4.3 编译..............................................................................................................................................................................45
4.4 打包..............................................................................................................................................................................46
4.5 执行..............................................................................................................................................................................46
章 MapReduce 的输入输出................................................................................................................................................47
1. InputFormat 类....................................................................................................................................................................47
2. OutputFormat 类.................................................................................................................................................................50
章 Hadoop MapReduce 的运行机制..................................................................................................................................51
章 一个实际的例子.............................................................................................................................................................54
1. Pi 值估算原理.....................................................................................................................................................................54
2. 旧版 API 的 Pi 值估算 MapReduce 程序...........................................................................................................................54
3. 新版 API 的 Pi 值估算的 MapReduce 程序.......................................................................................................................61
3.1 NewPiEst.java 文件的源代码.....................................................................................................................................61
3.2 编译和运行..................................................................................................................................................................66
推荐书目.......................................................................................................................................................................................68
后记...............................................................................................................................................................................................69
未来的趋势是什么.................................................................................................................................................................69
为什么大数据很重要.............................................................................................................................................................69
如何学习大数据最快.............................................................................................................................................................70
第 7
第 8
前言
Hadoop 是最著名使用最广泛的分布式大数据处理框架,它是用 Java 开发的。
这本书有一个明确的目标:只要有一台能上网的计算机,就可以让读者在最短的时间内,学会 Hadoop 的初级开
发。所以,这本书只讲干货,也就是必须要知道的 Hadoop 的最核心知识点,包括如何搭建 Hadoop,如何写代码,
如何查 API。对于更多细节问题,书后会列一个书目给大家参考,这些书已经讲得很好了,不需要在这里饶舌浪费时
间。
操作系统的计算机,能做到开机,输入密码,进入图形界面,打开命令终端,就可以了。懂一点点 Java
这本书对读者的预要求很少:懂一点点 Linux,懂一点点 Java
编程。 懂一点点 Linux”是指,假如有一台装了
”编程
Linux
是指,在 Linux 上,用记事本写一个 Java 的 HelloWorld 程序,然后把它编译出来,执行一下,就可以了。这个预要
求非常低,接近于零,所以这本书叫 从零开始学习 Hadoop”。Hadoop 是用 Java 开发的,它通过 Streaming 方式支持
其他语言,诸如 Python,C++,Ruby,但如果想真正理解 Hadoop,必须从 Java 开始,用其他语言以 Streaming 方式
学 Hadoop 是一条不归路,这是笔者用一个月时间得来的教训。
“
“
“
”
只要有一台能上网的计算机 ,Hadoop 的伪分布式运行模式,可以在一台电脑上运行 Hadoop 的全部功能。在伪
“
分布式下编写和运行的代码,不作任何修改便能运行在 Hadoop 集群上,这是学习 Hadoop 的最方便的优点之一。
“
最短的时间 ,这是一个有点长的话题。学习一项技能,有很多种途径。最快的途径找个高手教,高手会说看哪些书,
从哪里做一下,哪些地方注意不要犯错,哪些地方是不需要的不要在上面浪费时间,哪些地方很关键要多做做将来
会很有用。只要没有出现诸如高手数量不多,或者高手很忙,或者高手是同事但职位只比你高一点点 教会你对他
其实没什么好处的这些情况之外,这个途径是最好的。
—
”
另外一个途径是报一些培训班学习,费用相对高一些。
性价比最高的途径是自学,如果自学能力比较强,从网上找相关的电子书教学视频官方教程学习,笔者个人比较
推崇这种方式,这种方式可以很好地锻炼学习能力。能力是一得永得的,将来学习其他技能可以举一反三,缺点是
比较耗时,自学的过程其实很大程度上是试错的过程。如果技术比较复杂,而且工作中很快要用到,或者下个星期
就要面试笔试,那肯定是妥妥地来不及的。
如何在最短的时间内解决 Hadoop 入门问题呢?理性的方式,是从流程和细节上解决。1898 年,科学管理之父泰
勒做了一个铁块搬运实验。当时,工人们每天平均搬运 12~13 吨铁块。泰勒的实验方式是对搬运过程计时,分析不
同搬运方式的影响,分析休息时间和劳动时间的搭配,最终可以让工人在不太累的情况下,每天搬运 47 吨铁块,
效率提高到近 4 倍。
事实上,可以用同样的方式解决学习问题。比如说,请一个对 Hadoop 一无所知的小白同学自学 Hadoop,然后要
求他记下每天学了哪些内容,遇到什么问题,是怎么解决的,分别花了多少时间,有哪些是必须的,有哪些后来验
证是弯路,哪些可以省略。待到他学完了,根据这个学习记录整理出一条快捷之路,避开没用的地方,简化过于复
杂的地方,调整到合理的次序,于是就得到一个 最短的时间 学习方案。这本书就是这么产生的,而且是真简化。
”
“
”
“
做一遍 是最佳的快速学习方式。比如说,学习 C 语言编程,如果学习方式是看书,读一遍乃至读十遍,不写代
码,不会在大脑留下任何痕迹。如果将书中的例题代码原样输入编译执行,理解会好很多。如果不但调通了例题,而
且将书里的大部分习题独立做出来,会觉得自己对 C 语言很熟悉。如果写了一个有质量的五千到一万行的项目,就
觉得自己真的可以用 C 语言做工作。所以说,做一遍是最好的学习方式。
笔者见过一些高效的人是以反其道而行之的方式学习的。当他们需要用到一种新技术的时候,就找一本相关的书,
看一下目录,再看一下每章的简介,大略看看范例。然后,根据范例立刻写代码,需要什么功能,就到书里和 API
里找,如果遇到 Bug,在 Google 上检索一下。这种方式会很快做完功能,同时也就学会这个技术。如果从头开始看书,
一点一点做例题做习题,对他们来说太慢了,时间成本太高,很不划算。
还有另外一种方式,笔者将它称之为吉祥物大师法(Master Mascot),注意,不要看成吉祥物大法师。一些有趣
的技术公司会给自己设计吉祥物玩具。假如员工在工作中遇到解决不了的问题,按照 潜规则 ,要先把这个问题讲
给吉祥物玩具听,多数情况下讲完了自己就知道答案了,这就是吉祥物大师法。
“
”
这本书的例子,是按照 做一遍 的方式编写的。每个例子都是完整的,从目录和文件结构,到编译打包运行。这种
完整很重要,可以大幅度减少试错,查询 API,编译和调试的时间。熟悉这些范例,先手工输入和编译,然后再合上
书,自己从零开始做一遍,对着代码找感觉和体会。
“
”
”
“
尤其非常重要的是,要想象如果自己是 Hadoop 的作者,会怎么设计 Hadoop,用这种眼光审视 Hadoop,会突然
之间 开悟 ,原来如此。这种 开悟 ,要自己走过一遍,想过一遍,做过一遍,才会达到。一旦 开悟 了,会信心满
满,应对这个体系架构的诸多问题,会漂亮地解决未知问题,就像厨师做一道好菜,像浪子泡 MM。这种书有点像
武侠小说里金世遗练的邪派功夫,简单,见效快,但见效之后要补上一些细节,免得走火入魔。所谓走火入魔就是
觉得 Hadoop 如此简单,没什么搞头,其实 Hadoop 真的是很有搞头。
“
”
“
”
如果你对 Java 很熟悉,对 Linux 很熟悉,这本书对你来说太简单了,只需要一个下午就能搞定。Hadoop 很大,但
大部分东西都是在 Linux 出现过。你只需要安装它,然后手写一下例题,编译,运行,然后去看看 Hadoop 的 API,
就足够了。
未来将根据这本书发布一系列的视频,更为直观。本书的理念是让零起点的读者根据这本书能在一个星期或者更
短的时间内学会 Hadoop 的初步技能,快速让大家安装 Hadoop,快速跑一个 Hadoop 的 Demo,快速了解 Hadoop 的
运行流程,写一些初级的 Hadoop
的应用 ,以应对诸如快速开发,面试笔试,大数据课程实践等需求 。如果需要掌
握更多的 Hadoop
细节,请参考本书的推荐书目,或者关注 最短路径系列 的未来书目。
“
”
第 1
章 Hadoop 的安装
Hadoop 的安装比较繁琐,有如下几个原因:其一,Hadoop 有非常多的版本;其二,官方文档不尽详细,有时候
更新脱节,Hadoop 发展的太快了;其三,网上流传的各种文档,或者是根据某些需求定制,或者加入了不必须要
的步骤,或者加入容易令人误解的步骤。其实安装是很重要的步骤,只有安装好了,才能谈及下一步。
在本书撰写的时候,选用 Hadoop 的 stable 版安装。
笔者的登录用户名是 brian,大家可以根据自己的登录名更改命令,后面凡是出现 brian 的地方,都用自己的登录
用户名替换掉。
1. 操作系统
操作系统是 Ubuntu 10.04 桌面版。
如果操作系统其他版本的 Ubuntu,在图形界面上会略有一点区别,但对安装影响不大。不同发行版的 Linux 的安
装 Hadoop 的过程基本类似,没太大的差别。
2. Hadoop 的版本
Hadoop 当前的 stable 版是 1.2.1。
3. 下载 Hadoop
3.1 在 Hadoop 的主页上提供了多个下载链接。
http://www.apache.org/dyn/closer.cgi/hadoop/common/
3.2 任选一个下载站点如下:
http://mirror.esocc.com/apache/hadoop/common/
3.3 选择 stable 版,其实 stable 版就是 1.2.1 版:
http://mirror.esocc.com/apache/hadoop/common/stable/
在这个目录下有多个文件,是针对不同的 linux 发行版的,不需要全部下载。
3.4 下载 hadoop-1.2.1.tar.gz
打开命令终端,下文的命令都是在终端里执行,为方便起见,命令都用引号引起。
将 stable 版本的 Hadoop
命令如下:
的两个文件下载到 ~/setup/hadoop”
和 hadoop-1.2.1.tar.gz.mds
“
目录下,也就是 /home/brian/setup/hadoop”目录,
”
”
”
”
” ”
,那么 ~”
就表示 /home/john”目录。
是下载文件的命令行工具, man wget”有详细说明。
就表示目录 /home/brian”,如果开机时候,登录用户是 john
命令是创建新目录。 -p”参数的意思是,假如 hadoop 目录的上级目录不存在,也创建上级目录。在
3.4.1 “mkdir -p ~/setup/hadoop”
mkdir
”
“
终端里执行 man mkdir”,可以看到对这个命令的更详细的解释,按一下 q 键重新返回终端。
在命令终端里, ~ 表示当前登录用户的主目录。比如说,在开机的时候,登录用户是 brian,那么在命
”
令终端里, ~”
3.4.2 "cd ~/setup/hadoop"
cd 就是 change directory 的缩写,切换当前目录。
3.4.3 "wget http://mirror.esocc.com/apache/hadoop/common/stable/hadoop-1.2.1.tar.gz.mds"
wget
3.4.4 "wget http://mirror.esocc.com/apache/hadoop/common/stable/hadoop-1.2.1.tar.gz"
3.4.5 "md5sum hadoop-1.2.1.tar.gz"
md5sum 命令,计算一个文件的 md5 码。开源社区在提供源码下载的时候,会同时提供下载文件的 md5
码。md5 码是根据文件内容生成的 32 位字符串,不同的文件的 md5 码是不同的,如果下载出错,下载文件的 md5 码
跟正常文件的 md5 码是不一样的,由此检测下载是否正常,只有在极其罕见的情况下,才会出现不同的文件有相同
md5 码。hadoop-1.2.1.tar.gz 是一个比较大的文件,需要检查下载的文件是否完整,执行这个命令之后,会出现形
如"8D 79 04 80 56 17 C1 6C B2 27 D1 CC BF E9 38 5A hadoop-1.2.1.tar.gz"的字符串,前面的一串字符串就是 32 位的
md5 校验码。
3.4.6 "cat hadoop-1.2.1.tar.gz.mds",
cat 命令,cat 是 catenate 的缩写,在标准输出上打印文件内容,通常标准输出就是屏幕。这个命令会在屏
幕上打印 hadoop-1.2.1.tar.gz.mds 的内容,也就是一些校验码,在里面找到"md5"这一行,如果跟 md5sum 出来的一
致,则表明下载文件完整的,否则需要重新下载。
”
4. 安装 Java JDK
”
在这个页面,找 Java SE Development Kit 7u40”
4.1 在这里有 jdk 1.7 的下载
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
如果是 CPU 是 32 位,选择下载 Linux x86,如果 CPU 是 64 位的,选择 Linux x64。一般来说,如果计算机是双
核的,肯定支持 64
位操作系统。或者可以运行 uname -a”命令看一下,在笔者的笔记本上运行这个命令结果如下:
Linux brian-i3 2.6.32-51-generic #113-Ubuntu SMP Wed Aug 21 19:46:35 UTC 2013 x86_64 GNU/Linux
后面的 x86_64 表明系统是 64 位的。
Agreement”,接受 License 才能下载。
下载的 jdk 1.7
4.2 "sudo su -"
切换到 root
jdk 安装操作是在/usr/local 目录下进行的,用 root 用户更方便。
4.3 "cd /usr/local/lib"
4.4 "tar -zxvf /home/brian/setup/java-jdk-1.7/java-jdk-7u40-linux-i586.tar.gz"
tar 是 linux
i586.tar.gz 压缩包解压到当前目录下。解压缩完毕之后,执行"ls",能看到当前目录下有一个新目录叫"jdk1.7.0_40"
4.5 配置环境变量:
,存放到 /home/brian/setup/java-jdk-1.7/”目录。
”
用户,参考 man sudo”。这个命令会切换到 root 用户,也就是最高权限的用户。因为后面要执行的
下载的文件是 java-jdk-7u40-linux-i586.tar.gz”,java jdk 的版本常常有更新,次版本号有可能会比 40 更高一点。
下的打包和解压命令行工具,具体细节可以参考 man tar”
,注意,这里有一个选项,必须选择 Accept License
。这个命令将 java-jdk-7u40-linux-
“
”
”
”
”