|
1.5 Hadoop初体验/ \" j7 j( L) u. R6 T
一般而言, 我们想要深入学习一个新的系统时, 首先要尝试使用该系统, 了解系统对外提供的功能, 然后再通过某个功能逐步深' k; X% Y- u! t S# [" `
入其实现细节。 本节将介绍如何在 伪分布式工作模式 [4] 下使用Hadoop, 包括搭建Hadoop环境、 访问HDFS以及向YARN提交应用程序0 C$ D D+ o1 b( N, B
等最基本的操作。 本节只是有代表性地介绍Hadoop的一些基本使用方法, 使读者对Hadoop有一个初步认识, 并引导读者逐步进行更全
- F) J1 J9 I! K3 `5 H- g' e面的学习。& j/ ~ r/ K3 N9 j8 ?: R
1.5.1 搭建Hadoop环境
4 P! Y8 i' G0 L# `* k* ^0 s: z本小节仅介绍单机环境的搭建方法, 更加完整的Hadoop安装步骤和配置方法可参考本书最后的附录A和附录B。 另外, 需要注意
! b: }4 @& ]; @- r; u: X; s) D的是, 由于不同用户拥有的Linux环境不尽相同( 比如已经安装的软件不同、 统一软件的版本不同等) , 每个人安装Hadoop过程中遇到
( v5 g4 P# \. x, s/ L6 w# {0 ^# ?的问题可能不同, 此时需要根据具体的日志提示解决问题。 本小节仅给出一般情况下, Hadoop 2.0的安装步骤。- @! \$ j1 l/ S. i; p- Y
步骤1 修改Hadoop配置文件。
5 ?, ~& q" d' b r8 W4 y1) 设置环境变量。 在${HADOOP_HOME}/etc/hadoop/hadoop-env.sh中, 添加JAVA安装目录, 命令如下:, _4 T: m* v) s1 @- W
export JAVA_HOME=/usrb/jvm/java-6-openjdk0 h% g4 ^- L- }2 ~( L
修改conf目录下的mapred-site.xml、 core-site.xml、 yarn-site.xml和hdfs-site.xml四个文件, 在<configuration>与</configuration>之间添加的内
7 k, f" x! M9 I* ?: e7 j3 q8 b" w3 A容见下面的介绍。
: @$ a2 k3 L% R" ^" h: ^2) 在${HADOOP_HOME}/etc/hadoop/下, 将mapred-site.xml.templat重命名成mapred-site.xml, 并添加以下内容:
3 M, N. E# P! U* S<property>" P3 J8 j! M3 j5 q
<name>mapreduce.framework.name</name>
3 y8 {( l) z& |& o: V w<value>yarn</value>' B* r( Y0 K2 d! L- F" R, V1 T
</property>" ]* n, Q0 J" {" r/ a) b- Z
【 解释】 相比于Hadoop1.0, 用户无须再配置mapred.job.tracker, 这是因为JobTracker相关实现已变成客户端的一个库( 实际上在
7 {( x! ?0 |4 `+ r0 V' e2 SHadoop 2.0中, JobTracker已经不存在, 它的功能由另外一个称为MRAppMaster的组件实现) , 它可能被随机调度到任何一个slave上,+ t p7 S/ c3 J, N: r2 ]# o+ N
也就是它的位置是动态生成的。 需要注意的是, 在该配置文件中需用mapreduce.framework.name指定采用的运行时框架的名称, 在此指: J( L3 Q' W7 I6 t5 U% D# A
定"yarn"。9 a" h2 b0 B' W6 B( N) L6 D( N* w
3) 在${HADOOP_HOME}/etc/hadoop/中, 修改core-site.xml, 为了简单, 我们仍采用Hadoop 1.0中的HDFS工作模式( 不配置HDFS( k' w5 g' u {* } u
Federation) , 修改后如下:& j* A7 d: g& \% Q5 L
<property>8 d7 z2 S! ^ s) j) l B) S, j( o
<name>fs.default.name</name>. a7 d- K' q" X9 S8 M& h+ i3 d
<value>hdfs://YARN001:8020</value>8 i% I6 i; }3 E# T# \. L. t4 ^
</property>
* C, ^, n' W4 B, N! E u其中, YARN001表示节点的IP或者host。1 e4 F' F4 i$ O- ^4 f& ?
4) 在${HADOOP_HOME}/etc/hadoop/中, 修改yarn-site.xml, 修改后如下:: k# h0 C) B' i6 E- g) e0 [
<property>" X, H' j9 b) X E
<name>yarn.nodemanager.aux-services</name>0 X$ d# F" q5 ^9 f/ z% G
<value>mapreduce-shuffle</value>
' m, a J1 b M0 d: L</property>
: |: f6 w- v& X) K5 r7 F【 解释】 为了能够运行MapReduce程序, 需要让各个NodeManager在启动时加载shuffle server, shuffle server实际上是Jetty/Netty
3 n. L2 }9 \: T2 [5 J }Server, Reduce Task通过该server从各个NodeManager上远程复制Map Task产生的中间结果。 上面增加的两个配置均用于指定shuffle
* B' Y! P- {9 P$ y& Y0 N$ y1 Iserver。
2 O1 z- ]% I( c4 a1 b0 R3 O5) 修改${HADCOP_HOME}/etc/hadoop中的hdfs-site.xml文件:2 l* ^( e& F/ _4 K8 s4 B
<property>
& \! E! O0 m5 @$ }. d<name>dfs.replication</name>! _6 K" Z* b( Y9 V* r
<value>1</value>
* v0 H6 w8 R1 J$ W. R4 l. U</property>$ G5 g Z- m9 {3 e
【解释】 默认情况下, HDFS数据块副本数是3, 而在集群规模小于3的集群中该参数会导致出现错误, 这可通过将dfs.replication调' f; Z7 U) T2 \# m1 [. X/ c
整为1解决。. I q. _! ]( n b# _
注意 如果你是在虚拟机中搭建Hadoop环境, 且虚拟机经常关闭与重启, 为了避免每次重新虚拟机后启动Hadoop时出现各种问
; o$ e5 m9 Q) m0 W7 z题, 建议在core-site.xml中将hadoop.tmp.dir属性设置为一个非/tmp目录, 比如/data或者/home/dongxicheng/data( 注意该目录对当前用户需具/ G9 }3 J4 r) ?' ?" A
有读写权限) 。 c5 z2 }6 |- c) m4 V a
步骤2 设置免密码登录。
! Y) E+ K# w7 X7 x8 O+ l! u3 T前面提到Hadoop启动/停止脚本需要通过SSH发送命令启动相关守护进程, 为了避免每次启动/停止Hadoop都要输入密码进行验
$ t6 X( }# i8 V% H8 r/ v2 ]证, 需设置免密码登录, 步骤如下。
5 {# {' a W1 c, N- U/ j; J1 V1) 打开命令行终端, 输入以下命令:
: o$ @9 R8 M9 `ssh-keygen -t rsa
X) [9 s7 N# o1 p0 @' e将会在"~/.ssh/"目录下生成公钥文件id_rsa.pub和私钥文件id_rsa。
$ E% _* A6 Z; e- a5 h6 p- p2) 将公钥文件id_rsa.pub中的内容复制到相同目录下的authorized_keys文件中:' {4 n* @9 v8 i( L0 D
cd ~/.ssh/
) @ Y8 ]1 v* d0 F! o2 ^cat id_rsa.pub >> authorized_keys& ?! ?% i/ X. A9 D3 N
步骤3 启动Hadoop。4 J0 }( z% K: M! j3 i9 w+ Q: m ^
在Hadoop安装目录中, 按以下三步操作启动Hadoop, 我们单步启动每一个服务, 以便于排查错误, 如果某一个服务没有启动成3 @% }7 d2 z9 o
功, 可查看对应的日志查看启动失败原因。) O+ r( v9 g8 j& v9 _
1) 格式化HDFS, 命令如下:7 @# V& v7 J, s
bin/hadoop namenode -format! |6 v2 V1 P) j
2) 启动HDFS。 你可以使用以下命令分别启动NameNode和DataNode:
8 @; Q; B, O8 p/ _% x, [sbin/hadoop-daemon.sh start namenode8 Z" _* M3 c8 b
sbin/hadoop-daemon.sh start datanode0 K' p& N$ m2 w" V i# U" g
如果有多个DataNode, 可使用hadoop-daemons.sh启动所有DataNode, 具体命令如下:! C9 g0 n5 A, d( Q" ]
sbin/hadoop-daemons.sh start datanode$ ^7 i. R' d3 P3 U) C: z9 _
你也可以使用以下命令一次性启动NameNode和所有DataNode:
4 p8 H* ~0 ~* {- T/ p. q7 Nsbin/ start-dfs.sh+ [9 [/ x9 L2 V- I/ @
3) 启动YARN。 你可以使用以下命令分别启动ResourceManager和NodeManager:
9 [% a4 N K7 J$ w1 w- |1 asbin/hadoop-daemon.sh start namenode
( L g* p2 L/ q* _( bsbin/hadoop-daemon.sh start datanode1 Y5 j, w; u- z9 z* M0 i
如果有多个NodeManager, 可使用yarn-daemon.sh启动所有NodeManager, 具体命令如下:
9 |: Q5 U7 S1 osbin/yarn-daemon.sh start nodemanager' i' s8 k7 [6 u7 F% O: J8 _: c" N
你也可以使用以下命令一次性启动ResourceManager和所有NodeManager:1 t- C2 A" d1 s
sbin/start-yarn.sh
) w7 M4 X3 _/ |8 @$ [0 ~& O通过如下jps命令查看是否启动成功:' ^. w6 N) {1 T! G; j* U$ o4 `
dong@YARN001:/opt/hadoop/hadoop-2.0$ jps
4 D6 D( E$ Q5 H T" K27577 NameNode$ e* Q2 j+ j4 S- R; L8 F' T* H2 o; E
30315 ResourceManager
/ m; ^4 k! e( p, {- C5 e27924 SecondaryNameNode7 F1 N Q0 E* l( \5 q. R
16803 NodeManager5 c/ t6 d9 c# q- j" s. T
通过以下URL可查看YARN是否启动成功:
6 A" G( y6 ?3 Z" h7 R) Whttp://YARN001:8080/
) z/ ]5 I6 A0 E" p; J) B0 F9 lYARN对外提供的Web运行界面如图1-10所示。# Z% e' P0 {% x' E# i: {" U. i
图1-10 YARN对外提供的Web界面6 Z) m) @( _8 G4 P. c
如果安装过程中出现问题, 可通过查看日志发现问题所在。 Hadoop日志存放在$HADOOP_HOME/logs目录下的以".log"结尾的文件7 k- |1 @9 X4 L
中, 比如yarn-dongxicheng-resourcemanager-yarn001.log就是ResourceManager产生的日志。 z) x: c( D; S
经过以上三步操作, Hadoop成功启动后, 接下来可以通过Hadoop Shell或者Eclipse插件访问HDFS和提交MapReduce作业。 下面两小! I' ?9 c* L# z5 c) ~
节分别介绍Hadoop Shell和Eclipse插件使用方法。
# i' e$ }3 h; A, F8 C1.5.2 Hadoop Shell介绍* P! S: F6 j* p* [# L3 t. P
在1.4节我们曾提到, bin目录下是最基础的集群管理脚本, 用户可以通过该脚本完成各种功能, 如HDFS文件管理、 MapReduce作
1 q& i' Z& U* @) a. `- C业管理等, 更加详细的脚本使用说明, 可参考附录C。
, r' Q! G5 _" s# z* N: M作为入门, 本节介绍的是bin目录下Hadoop脚本的使用方法。 如果你已经对Hadoop 1.0有所了解( 比如尝试安装和使用过Hadoop$ R: h6 v9 q; S8 o- D( q5 u$ D3 m; V
1.0) , 那么可直接使用该脚本, 因为该脚本的功能与Hadoop 1.0对应的Hadoop脚本功能完全一致。5 N T) ?' G" ?* s* d' w
该脚本的使用方法为:
$ c7 z* |! \! {6 q A+ a' ]6 Q" g7 ahadoop [--config confdir] COMMAND0 Z6 J: B7 w0 e. M# ?
其中, --config用于设置Hadoop配置文件目录。 默认目录为${HADOOP_HOME}/conf。 而COMMAND是具体的某个命令, 常用的8 f/ P$ ~0 q! x# a% t
有HDFS管理命令fs、 作业管理命令job和作业提交命令jar等, 它们的使用方法如下。
# n0 K1 v& L$ x0 c( 1) HDFS管理命令fs和作业管理命令job
( L0 G: {: i' ?4 B+ J) _它们的用法一样, 均为:; \4 U* z7 V9 `( M3 C( o
bin/hadoop command [genericOptions] [commandOptions]
* f0 o/ m, S, ~* z1 [8 I其中, command可以是fs或者job, genericOptions是一些通用选项, commandOptions是fs或者job附加的命令选项, 看下面两个例子。
3 P1 A9 y. J9 o7 ?# G* H❑在HDFS上创建一个目录/test, 命令如下:, n, \, K, Z$ q8 q6 A
bin/hadoop fs -mkdir /test
1 \% N6 T: ]1 u& K0 l❑显示所有Hadoop上正在运行的作业, 命令如下:
% n$ f& E$ g5 S$ e" Y7 |bin/hadoop job -list
4 w" C: c+ w& o( 2) 作业提交命令jar' v. I) [+ d% F z; I
这个命令的用法是:9 {, P% A$ | ^) r, R, n
hadoop jar <jar> [mainClass] args..; _, g3 ^/ u) R+ n
其中, <jar>表示JAR包名, mainClass表示main class名称, 可以不必输入而由jar命令自动搜索, args是main class输入参数。 举例如
. s" i5 c+ _' N# ?. i下:
4 `" W0 ^* K) y7 E8 W L lbin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar pi 5 10
! ^9 K. Z/ W8 M* @其中pi是hadoop-mapreduce-examples-*.jar 中一个作业名称, 该作业主要功能是采用拟蒙特卡罗法估算圆周率pi( 3.1415926…) 的大
3 ?8 i1 u' F" d3 q' w小, 它有两个整型输入参数: Map Task数目和样本数目。, b# ?3 R+ O% M7 N5 |
其他更多命令, 读者可自行查阅Hadoop官方设计文档。
5 N4 u* b3 D% O3 |[4] 单机环境中, Hadoop有两种工作模式: 本地模式和伪分布式模式。 其中, 本地模式完全运行在本地, 不会加载任何Hadoop服务,0 J+ g9 K" v8 x9 g, k. t k
因而不会涉及Hadoop最核心的代码实现, 伪分布式即为“单点集群”, 在该模式下, 所有的守护进行均会运行在单个节点上, 因而本节
. u& Q; z+ E/ G, r+ L/ B选用该工作模式。
! y: Y; x- a! S3 r! f& Z2 i( j. @. W+ l @6 s5 L: ]. { \0 W
: E5 U3 J. {- ]8 Y% ^; \/ k% W/ P
|
|