将设为首页浏览此站
开启辅助访问 天气与日历 收藏本站联系我们切换到窄版

易陆发现论坛

 找回密码
 开始注册
查看: 34|回复: 1
收起左侧

搭建Hadoop的HA高可用架构

[复制链接]
发表于 2022-11-15 10:00:32 | 显示全部楼层 |阅读模式
购买主题 本主题需向作者支付 2 金钱 才能浏览
 楼主| 发表于 2022-11-15 10:00:33 | 显示全部楼层
一、高可用简介
( ]; U7 X2 N7 V二、集群规划; ]" e( C! \  N! {4 ]7 p
三、前置条件
. m' i$ `! U; k5 O4 |9 _四、集群配置
; D1 N" J# j3 w# y6 z- o9 a五、启动集群' ^7 O' P' g* ?2 Y0 |2 |& c
六、查看集群/ r: e- W" Q/ X$ [
七、集群的二次启动2 _( j3 l0 e$ L/ m7 T
一、高可用简介0 Z0 r5 r. }# s( m  d
Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFS NameNode 对数据存储及其一致性的要求比 YARN ResourceManger 高得多,所以它的实现也更加复杂,故下面先进行讲解:; S' X+ j/ Z0 l4 S! e
. o/ @9 a2 q, s6 y: v
1.1 高可用整体架构# {% y) M2 `$ t
HDFS 高可用架构如下:! J* R8 N3 [1 r. X. g

! j0 X, d' W# W1 c3 C: ]- }
; u5 r' A  z/ n+ |, w图片引用自:https://www.edureka.co/blog/how- ... -high-availability/
' d# a/ e* z/ R& \8 f% B, y5 `! H
HDFS 高可用架构主要由以下组件所构成:( i. q) c0 G6 N- w9 N
6 p  I; N/ P0 y
Active NameNode 和 Standby NameNode:两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode,只有主 NameNode 才能对外提供读写服务。
+ w- r2 _, b8 t, V4 m$ ^2 E7 z9 Q, a  W6 {5 R1 {$ F( [0 l
主备切换控制器 ZKFailoverController:ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,当然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。
5 B' v. g8 i8 \. r( ~' z3 k2 z
; h. ~& G6 B) w9 [/ dZookeeper 集群:为主备切换控制器提供主备选举支持。$ \" c2 x  o! t. J7 R4 w3 P

0 a+ h: M/ Q, C共享存储系统:共享存储系统是实现 NameNode 的高可用最为关键的部分,共享存储系统保存了 NameNode 在运行过程中所产生的 HDFS 的元数据。主 NameNode 和 NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务。2 x+ h- R  P6 x' _. \9 E1 Q2 i- {
7 I$ b) l0 u# w' G  _
DataNode 节点:除了通过共享存储系统共享 HDFS 的元数据信息之外,主 NameNode 和备 NameNode 还需要共享 HDFS 的数据块和 DataNode 之间的映射关系。DataNode 会同时向主 NameNode 和备 NameNode 上报数据块的位置信息。
- o% c3 r% k+ i! U; n
' \9 l, U& p7 s& K9 R' A1.2 基于 QJM 的共享存储系统的数据同步机制分析* V  v: U1 _3 ^) {  [
目前 Hadoop 支持使用 Quorum Journal Manager (QJM) 或 Network File System (NFS) 作为共享的存储系统,这里以 QJM 集群为例进行说明:Active NameNode 首先把 EditLog 提交到 JournalNode 集群,然后 Standby NameNode 再从 JournalNode 集群定时同步 EditLog,当 Active NameNode 宕机后, Standby NameNode 在确认元数据完全同步之后就可以对外提供服务。
8 n( n1 R$ c8 N7 p
$ \# w" V* m  w- V( y, g需要说明的是向 JournalNode 集群写入 EditLog 是遵循 “过半写入则成功” 的策略,所以你至少要有 3 个 JournalNode 节点,当然你也可以继续增加节点数量,但是应该保证节点总数是奇数。同时如果有 2N+1 台 JournalNode,那么根据过半写的原则,最多可以容忍有 N 台 JournalNode 节点挂掉。. i  p" ^* z, X# N, N

9 b) f  b9 f# ?; M+ A  e' T% R- U: `* d! p
1.3 NameNode 主备切换
3 m8 E/ U8 t% z' ?  h7 c3 u5 R! qNameNode 实现主备切换的流程下图所示:9 M  ?( z0 ?& e. B& z
4 s& k9 e, w, K

( j2 ]# P3 q9 W7 Y1. HealthMonitor 初始化完成之后会启动内部的线程来定时调用对应 NameNode 的 HAServiceProtocol RPC 接口的方法,对 NameNode 的健康状态进行检测。 2. HealthMonitor 如果检测到 NameNode 的健康状态发生变化,会回调 ZKFailoverController 注册的相应方法进行处理。 3. 如果 ZKFailoverController 判断需要进行主备切换,会首先使用 ActiveStandbyElector 来进行自动的主备选举。 4. ActiveStandbyElector 与 Zookeeper 进行交互完成自动的主备选举。 5. ActiveStandbyElector 在主备选举完成后,会回调 ZKFailoverController 的相应方法来通知当前的 NameNode 成为主 NameNode 或备 NameNode。 6. ZKFailoverController 调用对应 NameNode 的 HAServiceProtocol RPC 接口的方法将 NameNode 转换为 Active 状态或 Standby 状态。
, C+ i9 f% |1 S  d+ h8 S1.4 YARN高可用
1 `& ~* B  E2 D$ S% M7 o! lYARN ResourceManager 的高可用与 HDFS NameNode 的高可用类似,但是 ResourceManager 不像 NameNode ,没有那么多的元数据信息需要维护,所以它的状态信息可以直接写到 Zookeeper 上,并依赖 Zookeeper 来进行主备选举。
; P  w# n; M: z+ B2 d
9 X8 \# j& r; G) a8 ~, q& S+ p+ n) B. J1 W. w" K# ^7 ?
二、集群规划
) l, M1 e% U/ H) M( w按照高可用的设计目标:需要保证至少有两个 NameNode (一主一备) 和 两个 ResourceManager (一主一备) ,同时为满足“过半写入则成功”的原则,需要至少要有 3 个 JournalNode 节点。这里使用三台主机进行搭建,集群规划如下:
" F- p4 ^7 l) S4 U. ~% J1 x6 K
9 [, U* Y! V& r6 w; L8 f2 h
  ?( K) [8 |! \三、前置条件
1 B( h9 a/ R* t1 U2 c; m3 x所有服务器都安装有 JDK,安装步骤可以参见:Linux 下 JDK 的安装;9 y0 e# ^5 Q' G
搭建好 ZooKeeper 集群,搭建步骤可以参见:Zookeeper 单机环境和集群环境搭建2 a8 {( s7 M$ p
所有服务器之间都配置好 SSH 免密登录。
$ `" D- B2 Q. a4 e6 y" s四、集群配置
& V) ?- X& b  A# V/ E6 y9 R9 H2 P& u4.1 下载并解压! N1 N- u7 A; C6 Q* R0 o
下载 Hadoop。这里我下载的是 CDH 版本 Hadoop,下载地址为:http://archive.cloudera.com/cdh5/cdh/5/# |- M. o  ~# x. q" F6 a/ d; k

3 {: J0 Q( q5 s0 ]: F' U# tar -zvxf hadoop-2.6.0-cdh5.15.2.tar.gz 7 J. T) n) u7 s
4.2 配置环境变量; |9 N  j. b9 q5 n0 L6 }( Z
编辑 profile 文件:1 {; ?" S# K* y
5 ~1 |8 l  ^. |0 e" C6 }
# vim /etc/profile
, I6 |5 {% f0 k$ c) N( u+ q; N- @# Z增加如下配置:
3 m$ z6 x+ W  _! p4 t9 {
. d4 g- P# X" g4 e6 ]export HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2
# A) J" y2 J/ H3 _7 M, dexport  PATH=${HADOOP_HOME}/bin:$PATH; T7 }# C) `' t' j
执行 source 命令,使得配置立即生效:6 }/ {' |, V8 ]) K% K# i

5 ~8 H& B  Y1 x0 ]/ |" I% n6 a* _# N# source /etc/profile
2 Q- f9 k* s* @) Z( k5 E4.3 修改配置3 Y! i( i, ^- a. P) d% `
进入 ${HADOOP_HOME}/etc/hadoop 目录下,修改配置文件。各个配置文件内容如下:. V0 s- m' c9 J! D  a" b$ W# r/ U
; M7 _0 q  B- j7 |* K6 i8 @$ i
1. hadoop-env.sh; ?! Q9 ]9 ?3 M' B
# 指定JDK的安装位置
+ P8 {% ~+ Q( n. t0 jexport JAVA_HOME=/usr/java/jdk1.8.0_201/
" d" u3 L) {" {2. core-site.xml
' w8 E% R( t* H" R' c1 K- B+ o<configuration>
) c4 N7 ?/ _/ k& f; h    <property>
' O- E3 A, K" m% r% v- t        <!-- 指定 namenode 的 hdfs 协议文件系统的通信地址 -->
& h; x' K; |$ B% o$ H" G+ t! [        <name>fs.defaultFS</name>7 T# W# q+ a( E& [( Q2 b0 T2 s3 h$ N$ {
        <value>hdfs://hadoop001:8020</value>6 U* s# ?6 {2 T& X5 s" W& y; z
    </property>
6 e8 K0 F; L3 O) ]) [) X  k* J    <property>% l% \. A& u0 `4 I
        <!-- 指定 hadoop 集群存储临时文件的目录 -->
5 w4 E7 z- U) V  F3 Z        <name>hadoop.tmp.dir</name>
. V; M! v+ m+ c. W% f; x" f        <value>/home/hadoop/tmp</value>
: c, {9 ^4 f5 {9 l- I3 G    </property>
% [) W  G8 _  w% L    <property>" M5 f; }6 J& r# _" U! j8 O- N) W4 g
        <!-- ZooKeeper 集群的地址 -->
: ?2 r4 D: D5 F        <name>ha.zookeeper.quorum</name>
* r& c" w  l# @% c/ C" w        <value>hadoop001:2181,hadoop002:2181,hadoop003:2181</value>! u4 A8 ^8 i1 u0 y0 M: _4 s
    </property>
( P$ U: L( G4 R: T& Q* G- e" a    <property>
0 q' z: h3 a$ Y/ a/ Q! I# F" k% d) G        <!-- ZKFC 连接到 ZooKeeper 超时时长 -->
3 P8 n9 n9 Q5 W! f        <name>ha.zookeeper.session-timeout.ms</name>
) v" [5 a/ K- w: P        <value>10000</value>9 I9 _! l3 L9 v; d
    </property>
9 l0 P6 P) V6 s3 G</configuration>
+ A) R8 S. v0 t! }" k: d6 G3. hdfs-site.xml
- G$ x( Z/ ^# ^<configuration>, S4 x: ^7 t* u' f
    <property>0 d9 \3 O7 f9 H" I. A8 D0 n) v0 _
        <!-- 指定 HDFS 副本的数量 -->
$ i. |/ V9 ?( Y+ N+ k/ A7 y" y        <name>dfs.replication</name>
5 Z: z# o) c' t% J5 A$ d( X; s( s        <value>3</value>* u1 A" Q# G7 Y% v
    </property>
' R; y; C) n, P    <property>
4 ]0 c6 _0 H  \2 E. }/ `        <!-- namenode 节点数据(即元数据)的存放位置,可以指定多个目录实现容错,多个目录用逗号分隔 -->: \( U$ t9 g- T
        <name>dfs.namenode.name.dir</name>( {2 p0 b: Q6 y0 A+ i" ~8 E# U+ ]' d
        <value>/home/hadoop/namenode/data</value>
- C/ L* b; @/ ^( R9 h    </property>. }4 t% U6 M# Q$ o
    <property>% r" O8 J; D  ], p* E; N+ b+ ^/ Z' n
        <!-- datanode 节点数据(即数据块)的存放位置 -->
* Y8 M# K% }5 Z1 W" f% d        <name>dfs.datanode.data.dir</name>$ C- g' }9 o3 w9 n5 b+ u
        <value>/home/hadoop/datanode/data</value>5 U8 l9 W# E0 t8 \  ]  J$ H
    </property>+ L  J2 s3 C8 U8 |0 a+ V6 e8 `. B$ z
    <property>
" [3 J0 J! U( \+ L) v4 T% U' v        <!-- 集群服务的逻辑名称 -->$ v! [9 W  z! r7 X: v
        <name>dfs.nameservices</name>
( w+ R& ~$ f5 d( k        <value>mycluster</value>
4 e) L& R1 P* o    </property>
8 l: ]! _% v0 n# T; l1 d0 z0 j& T    <property>/ K3 o3 f) v/ }  Q5 z
        <!-- NameNode ID 列表-->( z/ j" \6 ~7 o. C
        <name>dfs.ha.namenodes.mycluster</name>2 i( u/ `  V" S- U7 ]) D: H
        <value>nn1,nn2</value>. u5 t5 S) K0 j
    </property>
' _" C# s) `4 C4 r) p2 J* n4 }    <property>
9 C+ m3 b7 d, |( N        <!-- nn1 的 RPC 通信地址 -->
5 i8 C  c. ]+ q% b        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
$ I1 k1 J- B3 P, T% q/ @# w; H# f4 v        <value>hadoop001:8020</value>
  M: N( H- c, t+ r% W3 r$ ~    </property>
7 Q/ s* C+ x+ d5 J! T& o& W# t7 {    <property>6 u8 l+ k. v. ?8 K/ \: Y
        <!-- nn2 的 RPC 通信地址 -->
7 c4 M2 o: Q% h3 K9 T$ g" D: B' d        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
9 W  X4 z' l% w) |        <value>hadoop002:8020</value>
3 Q4 K5 @) E; H6 E9 v    </property>
# ~  P, A$ e7 A" g9 ]$ }! l    <property># d  d3 i5 K" @
        <!-- nn1 的 http 通信地址 -->
9 _! t: @3 l) E2 R; G        <name>dfs.namenode.http-address.mycluster.nn1</name>5 M+ ]& j% S9 j$ e2 v2 G
        <value>hadoop001:50070</value>
, Z7 w2 U( b8 O$ x  o# r    </property>
  V" l/ b: l; L! D; H    <property>
( t% T& z% Q% f4 \6 M, h        <!-- nn2 的 http 通信地址 -->
$ ]5 c8 H3 i" ~$ l. [  B) H        <name>dfs.namenode.http-address.mycluster.nn2</name>
6 P7 }$ E' ^- B% D& @- y7 }+ w        <value>hadoop002:50070</value>" O& n& s3 }# h$ T* @
    </property>5 u+ d7 F- a! j/ z4 ^4 z; Q6 |( ~
    <property>( J8 {. f+ d; M  v# u
        <!-- NameNode 元数据在 JournalNode 上的共享存储目录 -->
" K8 j4 ^4 O# B# }8 A& J0 B        <name>dfs.namenode.shared.edits.dir</name>
* @& I) Y' b* N2 R        <value>qjournal://hadoop001:8485;hadoop002:8485;hadoop003:8485/mycluster</value>
7 E( p. Z+ ^4 t6 b- c    </property>
& m- J8 l7 Q9 x" P    <property># _+ a0 |& u1 r( V; R( _9 L1 J
        <!-- Journal Edit Files 的存储目录 -->' D3 |+ X& U6 Q; i
        <name>dfs.journalnode.edits.dir</name>$ v$ ?6 d: a6 y& w7 U* h& i
        <value>/home/hadoop/journalnode/data</value>
3 P2 b- R$ r* s+ A- j, b. b$ O    </property>* ]& @' s2 C8 a$ |/ e
    <property>& H$ ?3 J: F0 Y- u& l. n
        <!-- 配置隔离机制,确保在任何给定时间只有一个 NameNode 处于活动状态 -->
7 ]3 a% q2 I2 z) `5 G+ _& W        <name>dfs.ha.fencing.methods</name>
+ o, j$ v  k. h& `! u& E, T; j        <value>sshfence</value>8 E7 S/ F7 s& k5 `5 L
    </property>2 O/ R9 D3 L% a) L
    <property>9 N0 _: e" H/ U6 U0 @
        <!-- 使用 sshfence 机制时需要 ssh 免密登录 -->
) s8 ~, A# O+ I- ?        <name>dfs.ha.fencing.ssh.private-key-files</name>5 A! y9 E3 K+ W& L0 a* i8 Y8 O& [
        <value>/root/.ssh/id_rsa</value>! N# k3 h- f2 S+ a5 X: u
    </property>
0 Z& `$ C  q1 R- b0 w1 s! B8 Y: h    <property>0 B1 }- n' v9 a% \4 X) W
        <!-- SSH 超时时间 -->6 z& Q) [+ H* }' T0 S2 R/ a  b$ v
        <name>dfs.ha.fencing.ssh.connect-timeout</name>( W" W* D3 Q, |3 v% K
        <value>30000</value>
2 J# H- t9 L$ [2 F; v    </property>
3 ?  ^% }6 o* n5 B: ]$ C" z6 i, b+ r    <property>
6 l/ }5 F1 W; K  {        <!-- 访问代理类,用于确定当前处于 Active 状态的 NameNode -->
. V5 x1 C) s+ F0 `        <name>dfs.client.failover.proxy.provider.mycluster</name>
) {* d$ w7 M, _( D        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>5 N5 y# L* B7 E7 z
    </property>2 J- ~: B9 Q5 l* }5 @
    <property>
" e# L0 R& m9 n9 C! G$ v! d5 V        <!-- 开启故障自动转移 -->
/ N* g4 W( F3 A        <name>dfs.ha.automatic-failover.enabled</name>
) e' \8 O3 F2 J  `4 n5 X        <value>true</value>
& N9 k7 d) y- i1 ]    </property>
! m$ I3 t; S2 H% @& L</configuration>1 z$ _3 J. I7 s6 V/ X. G8 ]9 T8 }
4. yarn-site.xml
6 |+ n, S: G  j4 g9 l* j<configuration>* K5 q. ?( ^% D2 Z0 s8 [
    <property>6 a) V* U: `- {8 T7 t( W4 B$ a& F
        <!--配置 NodeManager 上运行的附属服务。需要配置成 mapreduce_shuffle 后才可以在 Yarn 上运行 MapReduce 程序。-->
9 L5 K+ r1 m* ?; H8 j- `+ t        <name>yarn.nodemanager.aux-services</name>
& @$ h& m5 c: E+ k  `: Z/ u        <value>mapreduce_shuffle</value>
4 y3 w6 k% |/ `) K    </property>! }. l! A; g5 N
    <property>0 _0 p0 K4 z7 D+ `3 G$ c
        <!-- 是否启用日志聚合 (可选) -->
, C4 e* f* Q0 R6 m        <name>yarn.log-aggregation-enable</name>
0 V# A, M. u  ^6 l* ^7 l6 h* U        <value>true</value>
; A- Z3 e3 q2 A: T    </property>
6 T8 s; ~  _: W7 X    <property>, |0 V: v, x9 r
        <!-- 聚合日志的保存时间 (可选) -->+ ~/ G8 Z6 I, p% q/ J( ]; [
        <name>yarn.log-aggregation.retain-seconds</name>
% W, j6 z: u. N, d        <value>86400</value>
/ n, u8 D5 X, i: S( W    </property>
$ V4 n* O# x/ x5 H( {    <property>
  t% }4 P- l; [3 r; \        <!-- 启用 RM HA -->
! y& n% s" C0 {( `" [) A        <name>yarn.resourcemanager.ha.enabled</name>
& R9 \9 R4 |- r! v8 c3 v9 s, G        <value>true</value># u. _& f* T/ ?4 n% M
    </property>0 r$ U1 r0 N- u6 ^- Q9 b- L8 D
    <property>
: e! t. ~$ r1 ]2 z        <!-- RM 集群标识 -->
8 [0 W8 J2 g' n: ~' T  }, x& u  x' A        <name>yarn.resourcemanager.cluster-id</name>: X) [# u  J  W& T: U
        <value>my-yarn-cluster</value>4 U7 E3 b9 }; o6 R7 B2 e. L' O- a
    </property>9 T( R) Z0 K/ E5 a- O) O( n4 a
    <property>& N/ @" V2 ?, \% S
        <!-- RM 的逻辑 ID 列表 -->4 K; W/ Y5 q' w5 `% d2 }% o
        <name>yarn.resourcemanager.ha.rm-ids</name>( ?2 p1 X& G' L) }$ B2 S
        <value>rm1,rm2</value>
% w1 D& ]! p/ I! y' u; L+ I- v+ j    </property>9 A/ W7 N/ ]. U. _9 J
    <property>
- f! d& y; R, F7 v. M% x6 w        <!-- RM1 的服务地址 -->5 ]* j& s0 X! _+ }2 l+ r  ]; y& V
        <name>yarn.resourcemanager.hostname.rm1</name>$ U. K5 e( @+ I/ h" j9 j" s/ I+ p
        <value>hadoop002</value>5 R4 }) r/ V4 u, t0 K9 y
    </property>
8 L& w- p, z/ f8 v; {0 ]: w$ O    <property>
$ n) ~' a8 c4 ]. \7 N1 {: Z        <!-- RM2 的服务地址 -->
- h7 L8 A5 y$ F        <name>yarn.resourcemanager.hostname.rm2</name>
7 E* V8 J2 I, S7 r  U/ K+ S        <value>hadoop003</value>' B4 u7 Q) K' E% V) o" j
    </property>
. A3 f7 Z0 S% O2 c    <property>" z4 i, Y! |5 {
        <!-- RM1 Web 应用程序的地址 -->
5 a; @- G  c: p        <name>yarn.resourcemanager.webapp.address.rm1</name>
/ n0 ]4 r! \" g* i$ U        <value>hadoop002:8088</value>. k0 r" c* c2 K% p9 x: ~" \
    </property>
4 c4 l# \% O8 [/ e- v    <property>
( b! J" Z% F5 B: }5 P        <!-- RM2 Web 应用程序的地址 -->
4 Z6 }2 w3 w* f' }" ~0 K  W/ S        <name>yarn.resourcemanager.webapp.address.rm2</name>1 [* c1 I: [+ o% G  P* G& j
        <value>hadoop003:8088</value>2 X! g1 z" F& K" I8 k
    </property>
# I% ~$ q7 Z% D' B$ ^( n3 j    <property>4 l, R- I) o' F( w: f
        <!-- ZooKeeper 集群的地址 -->
. v' s3 H% ~7 g8 G% _7 p  N2 e        <name>yarn.resourcemanager.zk-address</name>
1 N& s) m* v) c; j7 w; B2 d        <value>hadoop001:2181,hadoop002:2181,hadoop003:2181</value>- Y  u: X  i) J
    </property>
3 h1 k" o  G" L- T. \5 [" M$ G' D    <property>
5 Z  a6 @, h2 q5 m/ d        <!-- 启用自动恢复 -->
8 r# h2 b9 v/ [( T: l0 E9 R+ O        <name>yarn.resourcemanager.recovery.enabled</name>+ P2 z" \: h6 b5 i7 I% Z) e
        <value>true</value>, ?5 r: o6 x" o) J
    </property>$ V5 F& W. ~5 O3 c3 V
    <property>1 ~0 y; q- ?# n
        <!-- 用于进行持久化存储的类 -->
. U! @+ h  N3 w4 [        <name>yarn.resourcemanager.store.class</name>+ O+ h' _! D' Y- s  k2 C
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>/ F" l4 ]4 l1 R
    </property>
4 Q1 ]; V% [# o# j6 y/ ]</configuration>
7 ^! S: I+ O; {$ T3 t+ C5 [! N5. mapred-site.xml/ {, P* `9 P' L9 o  u7 H; C+ D
<configuration>; I6 Y0 ~) |- ~4 h& o0 Q
    <property>
. U7 j# X* w1 ]/ B4 F        <!--指定 mapreduce 作业运行在 yarn 上-->6 i* V* H4 W/ v( y# j
        <name>mapreduce.framework.name</name>
3 R0 _0 B: H* d/ \& \        <value>yarn</value>
  l" ~$ Y7 r8 B$ C  s- ~3 V0 `    </property>4 m. L( f% c" P" m3 s
</configuration>3 i. J" }# ~; P! E# T3 D9 K1 q
5. slaves
: _/ l# X! d, J. I. d; K配置所有从属节点的主机名或 IP 地址,每行一个。所有从属节点上的 DataNode 服务和 NodeManager 服务都会被启动。
7 B/ q! K8 e4 D% Q+ _
! Z" _2 T6 c' J. t. P$ chadoop0018 f, [; k( @2 `9 t+ _# G1 w
hadoop002
. X9 \& n9 L9 q* E, f7 Yhadoop003
" J9 E. j7 M& {- t  @4.4 分发程序
  |/ z% U3 P) _. l! `% C将 Hadoop 安装包分发到其他两台服务器,分发后建议在这两台服务器上也配置一下 Hadoop 的环境变量。2 P2 k, s& _: z. _; \4 Q0 |$ n

* g' x: I& e, |; G7 f# 将安装包分发到hadoop002
# l) Z+ `" s& r+ G% Wscp -r /usr/app/hadoop-2.6.0-cdh5.15.2/  hadoop002:/usr/app/
" w6 ]. V# ~% _' f) d; m! }# 将安装包分发到hadoop0038 r# L0 g' G; a; I' _; o. ~
scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/  hadoop003:/usr/app/& F; F8 A+ H. Y6 m
五、启动集群
  O0 s$ z0 }, Q1 d+ G1 H( M5.1 启动ZooKeeper6 R' r5 W6 S, a% f5 V  A
分别到三台服务器上启动 ZooKeeper 服务:
0 D' Z- J4 W1 ?- O& J- }1 J. `
. F/ @' p4 h0 A0 {, A zkServer.sh start1 A" H7 H1 i4 j  |* s# Z+ [
5.2 启动Journalnode
! f, w$ z. t% X/ n& V分别到三台服务器的的 ${HADOOP_HOME}/sbin 目录下,启动 journalnode 进程:
7 ~2 U7 I& u6 b0 n/ w7 V: d7 {+ g- P
! q9 A2 _% S! L9 ~7 g0 lhadoop-daemon.sh start journalnode+ E$ u# E; [5 j; ~6 C
5.3 初始化NameNode
3 C# N$ [1 s; H在 hadop001 上执行 NameNode 初始化命令:; ~3 }+ ]! R& E
, H( m& D& f) s* I
hdfs namenode -format9 E& m) L# r/ Q1 S* k
执行初始化命令后,需要将 NameNode 元数据目录的内容,复制到其他未格式化的 NameNode 上。元数据存储目录就是我们在 hdfs-site.xml 中使用 dfs.namenode.name.dir 属性指定的目录。这里我们需要将其复制到 hadoop002 上:7 _* _3 q! l2 A; W& R) j

% m5 J& I2 d  o) j, p$ s7 F% e. A scp -r /home/hadoop/namenode/data hadoop002:/home/hadoop/namenode/4 t! h; N; J7 w  W2 V* ?
5.4 初始化HA状态4 m1 T: V: o0 O) y
在任意一台 NameNode 上使用以下命令来初始化 ZooKeeper 中的 HA 状态:# M) D0 d* U. ~) e

) ^5 R; M7 u" I. y8 {8 thdfs zkfc -formatZK
$ s+ H- q+ I, `2 x2 |5.5 启动HDFS
5 V) R  \4 |1 U  r+ ^) B/ M$ f! }2 o进入到 hadoop001 的 ${HADOOP_HOME}/sbin 目录下,启动 HDFS。此时 hadoop001 和 hadoop002 上的 NameNode 服务,和三台服务器上的 DataNode 服务都会被启动:
3 I6 v& A8 D8 G3 m
: J: h" I3 Q' V' H% T( w) F( Nstart-dfs.sh
% o5 _7 i# g* D% l( i' U' A5.6 启动YARN. K$ T* m1 R/ a- q( g7 H
进入到 hadoop002 的 ${HADOOP_HOME}/sbin 目录下,启动 YARN。此时 hadoop002 上的 ResourceManager 服务,和三台服务器上的 NodeManager 服务都会被启动:/ _5 ]1 A, O5 V! B3 @/ o  e7 Q
6 o& l6 T% I8 z" X. H4 R) A/ S8 j# ?
start-yarn.sh
+ f& i# a2 O$ B( s7 }  P& U5 R4 I需要注意的是,这个时候 hadoop003 上的 ResourceManager 服务通常是没有启动的,需要手动启动:/ q6 q( S. w' F
5 e' O% n2 J1 `6 N+ t5 h
yarn-daemon.sh start resourcemanager2 [/ D8 D8 Y4 V9 i8 Z0 V& r1 w
六、查看集群( z  z: v8 Q! b6 X  ?4 g3 i
6.1 查看进程* q9 c; ^. [7 j
成功启动后,每台服务器上的进程应该如下:
9 R6 T1 \' N" I/ u
9 j$ W1 K) |9 g4 P6 Z* S[root@hadoop001 sbin]# jps
$ m  [* L* Y  @2 A! T- D0 M4512 DFSZKFailoverController3 c6 w: b) H. {
3714 JournalNode; W; C9 b2 C8 E2 j
4114 NameNode
) `+ v* H% C1 i% j% v  j% A- E# i3668 QuorumPeerMain2 H1 A# Z+ W+ H9 T$ j
5012 DataNode
5 O; R. `/ D: z. N5 m% \* J5 f4639 NodeManager
. Q! F0 U4 n1 m! X8 [" ]" O( f9 [% u! r7 [3 Y

5 A% F/ b# A" k7 J. c7 t[root@hadoop002 sbin]# jps0 C/ p: [9 G" {; f  \
4499 ResourceManager
7 k) J& J; \* K! n" h# E: F4595 NodeManager# s" e/ l% \& G! {$ U
3465 QuorumPeerMain- p" q7 c/ i0 c! _7 h0 S4 L. N( [8 m
3705 NameNode
2 _- C4 P5 y4 e5 T: R4 y3915 DFSZKFailoverController
4 V7 M$ A! R& X9 [+ I5211 DataNode
' l5 [; N& o! T7 \3533 JournalNode
' E* x7 i& ?' a& w( E7 a# t4 F/ i1 o; I5 \! B8 m2 A  R& c4 ^

3 V4 l0 |$ Z  w1 H# D* K# J[root@hadoop003 sbin]# jps
) S6 z: b3 _7 f/ ]- i# F3491 JournalNode
2 H3 ?7 A& s1 o1 E* M$ W3942 NodeManager
& A4 r7 b7 o" f- S4102 ResourceManager
: S. r( F# G8 Q: f4201 DataNode# R( H, R' q0 U+ G& \
3435 QuorumPeerMain
7 b) r5 ~; S! A1 ?7 r+ O6.2 查看Web UI
# p5 f) j, M: NHDFS 和 YARN 的端口号分别为 50070 和 8080,界面应该如下:& _5 A% x5 l: M/ X; u, D( P$ @- c0 q& J. b
7 ]$ z8 |# z: q  E
此时 hadoop001 上的 NameNode 处于可用状态:2 D9 N2 K6 k. S. x8 J

$ C1 n# f; `+ L3 G/ A+ w2 c; \- \3 I% ^
而 hadoop002 上的 `NameNode` 则处于备用状态:
  o( j7 G" C8 v& @1 W7 e
5 B& O: E6 @* q( G
/ \. L  _& H6 Y( Jhadoop002 上的 ResourceManager 处于可用状态:
* ], y6 G* T3 ]0 b# X6 G
! v$ ^' e/ Q; S7 ?2 ]0 g6 @  @) D4 J8 O9 o( O0 ~! J6 G
+ M* g7 ?: u2 W1 V% D2 H- b
$ i' p: e4 Y* V
hadoop003 上的 ResourceManager 则处于备用状态:
# S/ B0 J6 H: n* U! U0 @2 H6 v2 I0 m
1 U; x. ]9 m5 l  }- E2 M

$ A& `1 R" F. F: N* }# u5 |% T: a5 F( s, l* l
同时界面上也有 Journal Manager 的相关信息:( @( o) a8 `% H; ~2 _
0 R' N" h, y) ?% U. n

# B% i! N8 q+ @1 t/ q( y1 _" \+ X) I% @( g( r* w, Y
## 七、集群的二次启动
, w. u5 v% U) f7 k! v& g3 Z上面的集群初次启动涉及到一些必要初始化操作,所以过程略显繁琐。但是集群一旦搭建好后,想要再次启用它是比较方便的,步骤如下(首选需要确保 ZooKeeper 集群已经启动):& R3 ?4 g% u' n0 r  N1 z3 c
# r# E3 _1 [3 k  i! k
在 hadoop001 启动 HDFS,此时会启动所有与 HDFS 高可用相关的服务,包括 NameNode,DataNode 和 JournalNode:
! h- }  p0 y7 W- a1 r! c& \3 S2 D7 i# U. n# j! [6 e0 r
start-dfs.sh7 i0 v, Q4 H# A1 r7 [+ `2 b
在 hadoop002 启动 YARN:0 _) ]7 [( P/ L9 d

  B1 P1 p/ b; d# O# Q) @! xstart-yarn.sh0 H+ t5 u( q: b( B# m
这个时候 hadoop003 上的 ResourceManager 服务通常还是没有启动的,需要手动启动:& d$ m% ^' C* Q* O* S$ P$ Z: B
9 ?$ P, I7 n2 d! h
yarn-daemon.sh start resourcemanager6 @: R9 D- q9 c* c, o' s3 u

6 a# o& v0 f! R, \1 o" g9 e
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

如有购买积分卡请联系497906712

QQ|返回首页|Archiver|手机版|小黑屋|易陆发现 点击这里给我发消息

GMT+8, 2022-12-10 11:02 , Processed in 0.049997 second(s), 23 queries .

Powered by LR.LINUX.cloud bbs168x X3.2 Licensed

© 2012-2022 Comsenz Inc.

快速回复 返回顶部 返回列表