hadoop搭建

5.Hadoop搭建

5.1 hadoop单机版搭建

1.修改主机

查看主机:Hostname-f

修改主机:vim/etc/sysconfig/network

 

修改主机为hadoop01

 

修改映射关系

vim /etc/hosts

 

127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4

::1        localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.0.2 hadoop01

 

2.配置hadoop

2.1修改hadoop-env.sh

 

export JAVA_HOME=/user/src/java/jdk1.7.0_79

 

2.2 修改core-site.xml

<configuration>

<property>

       <name>fs.defaultFS</name>

       <value>hdfs://hadoop01:9000</value>

</property>

<property>

       <name>fs.default.name</name>

       <value>hdfs://hadoop01:9000</value>

</property>

<property>

       <name>hadoop.tmp.dir</name>

       <value>/opt/hadoop-2.4.1/tmp</value>

</property>

</configuration>

 

2.3修改hdfs-site.xml

<!--hadoop集群副本数-->

<configuration>

<property>

       <name>dfs.replication</name>

       <value>1</value>

</property>

</configuration>

2.4修改mapred-site.xml

 

<configuration>

       <property>

              <name>mapreduce.framework.name</name>

              <value>yarn</value>

       </property>

</configuration>

 

2.5修改yarn-site.xml

<configuration>

       <property>

              <name>yarn.resourcemanager</name>

              <value>hadoop01</value>

       </property>

       <property>

              <name>yarn.nodemanager.aux-services</name>

              <value>mapreduce_shuffle</value>

       </property>

 

</configuration>

 

3.将hadoop添加到环境变量

 

#set java

JAVA_HOME=/user/src/java/jdk1.7.0_79

export PATH=${JAVA_HOME}/bin:$PATH

 

#set hadoop

export HADOOP_HOME=/opt/hadoop-2.4.1

exportPATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

 

4.格式化namenode

Hdfs namenode -format 或者 hadoop namenode -format

 

5.启动hadoop

start-all.sh

 

6.配置ssh免密码登录

cd ~/.ssh/

 

ssh-keygen -t rsa 回车 回车...

 

ssh-copy-id localhost

输入本机密码

 

 

5.2 hadoopHA测试环境搭建

非HA弊端HDFS集群的分布式存储是靠namenode节点(namenode负责响应客户端请求)来实现。在非HA集群中一旦namenode宕机,虽然元数据不会丢失,但整个集群将无法对外提供服务,导致HDFS服务的可靠性不高,这在实际应用场景中显然是不可行的。HA机制

已知导致服务可靠性不高的原因是namenode节点宕机,那么怎么才能避免这个namenode节点宕机呢?一个容易想到的解决方案是部署两台namenode节点,形成主备模式(active/standby模式),这样一旦active节点宕机,standby节点立即切换到active模式。事实上HA机制就是采取的这种方案。要想实现该机制,需要解决以下问题:

1.为什么选择主备模式,而不是主主模式(active/active模式),也即让两个namenode节点都响应客户端的请求

       一个显然的前提是,两台namenode节点需要保存一致的元数据。

        我们知道namenode节点是用来管理这些元数据的,响应客户端请求时(上传)需要增加元数据信息,如果使用主主模式,那么两个节点都将对元数据进行写操作,怎么同步是个很困难的问题。因此,只能有一台机器响应请求,也即处在active状态的节点(可称为主节点),而另一台namenode在主节点正常工作情况下仅用来同步active节点的元数据信息,这个namenode称为备用节点(处在standby状态),可见,要解决的问题主要是怎么同步active节点的元数据信息。

2.怎么同步两个namenode节点的元数据

      响应客户端请求的是active节点,因此只有active节点保存了最新的元数据。元数据分为两部分,一部分是刚写入新的元数据(edits),另一部分是合并后的较旧的(fsimage)。HA机制解决同步问题的方法是将active节点新写入的edits元数据放在zookeeper集群上(zookeeper集群主要功能是实现少量数据的分布式同步管理),standby节点在active节点正常情况下只需要将zookeeper集群上edits文件同步到自己的fsimage中就可以。

Hadoop框架为这个集群专门写了个分布式应用qjournal(依赖zookeeper实现),实现qjournal的节点称为journalnode。

3.怎么感知active节点是否宕机,并将standby节点快速切换到active状态?

        解决方案是专门在namenode节点上启动一个监控进程,时刻监控namenode的状态。对于处在active状态的namenode,如果发现不正常就向zookeeper集群中写入一些数据。对于处在standby状态的namenode,监控进程从zookeeper集群中读数据,从而感知到active节点是否正常。如果发现异常,监控进程负责将standby状态切换到active状态。这个监控进程在hadoop中叫做zkfc(依赖zookeeper实现)。

4.如何在状态切换时避免brain split(脑裂)?

        脑裂:active namenode工作不正常后,zkfc在zookeeper中写入一些数据,表明异常,这时standby namenode中的zkfc读到异常信息,并将standby节点置为active。但是,如果之前的active namenode并没有真的死掉,出现了假死(死了一会儿后又正常了,哈哈,是不是很搞笑),这样,就有两台namenode同时工作了。这种现象称为脑裂。

       解决方案:standby namenode感知到主用节点出现异常后并不会立即切换状态,zkfc会首先通过ssh远程杀死active节点的 namenode进程(kill -9 进程号)。但是(这样还不行,惊讶),如果kill指令没有执行成功咋办??如果在一段时间内没有收到执行成功的回执,standby节点会执行一个自定义脚本,尽量保证不会出现脑裂问题!这个机制在hadoop中称为fencing(包括ssh发送kill指令,执行自定义脚本两道保障)

 

解决上诉问题以后,基本上就实现了hadoop HA

HA实现

1.HA集群规划

主机名

软件

进程

sempplsl-02

jdk,hadoop,zookeeper

QuorumPeerMain(zookeeper),journalnode,datanode,nodemanager

sempplsl-03

jdk,hadoop,zookeeper

QuorumPeerMain(zookeeper),journalnode,datanode,nodemanager

sempplsl-04

jdk,hadoop,zookeeper

QuorumPeerMain(zookeeper),journalnode,datanode,nodemanager

sempplsl-05

jdk,hadoop

namenode,zkfc(active

sempplsl-06

jdk,hadoop

namenode,zkfc

sempplsl-07

jdk,hadoop

resourcemanager

sempplsl-08

jdk,hadoop

resourcemanager

(注:datanode,nodemanager一般放到一起。journalnode依赖zookeeper来实现,因此QuorumPeerMain(zookeeper),journalnode必须放一起!)

 

2.hadoopHA集群配置

core-site.xml  ---->

[html] view plain copy

1. <property>  

2. <!-- 指定hdfsnameservicens1 -->  

3. <name>fs.defaultFS</name>  

4. <value>hdfs://ns1/</value>  

5. </property>  

6. <!-- 指定hadoop临时目录 -->   

7. <property>  

8. <name>hadoop.tmp.dir</name>  

9. <value>/home/hadoop/app/hadoop-2.4.1/tmp</value>  

10. </property>  

11. <!-- 指定zookeeper地址 -->                  

12. <property>  

13. <name>ha.zookeeper.quorum</name>  

14. <value>sempplsl-02:2181,sempplsl-03:2181,sempplsl-04:2181</value>  

15. </property>  

 

hdfs-site.xml --->

[html] view plain copy

1. <!--指定hdfsnameservicens1,需要和core-site.xml中的保持一致 -->  

2. <property>  

3. <name>dfs.nameservices</name>  

4. <value>ns1</value>  

5. </property>  

6. <!-- ns1下面有两个NameNode,分别是nn1nn2 -->  

7. <property>  

8. <name>dfs.ha.namenodes.ns1</name>  

9. <value>nn1,nn2</value>  

10. </property>  

11. <!-- nn1RPC通信地址 -->  

12. <property>  

13. <name>dfs.namenode.rpc-address.ns1.nn1</name>  

14. <value>sempplsl-05:9000</value>  

15. </property>  

16. <!-- nn1http通信地址 -->  

17. <property>  

18. <name>dfs.namenode.http-address.ns1.nn1</name>  

19. <value>sempplsl-05:50070</value>  

20. </property>  

21. <!-- nn2RPC通信地址 -->  

22. <property>  

23. <name>dfs.namenode.rpc-address.ns1.nn2</name>  

24. <value>sempplsl-06:9000</value>  

25. </property>  

26. <!-- nn2http通信地址 -->  

27. <property>  

28. <name>dfs.namenode.http-address.ns1.nn2</name>  

29. <value>sempplsl-06:50070</value>  

30. </property>  

31. <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->  

32. <property>  

33. <name>dfs.namenode.shared.edits.dir</name>  

34. <value>qjournal://sempplsl-02:8485;sempplsl-03:8485;sempplsl-04:8485/ns1</value>  

35. </property>  

36. <!-- 指定JournalNode在本地磁盘存放数据的位置 -->  

37. <property>  

38. <name>dfs.journalnode.edits.dir</name>  

39. <value>/home/hadoop/app/hadoop-2.4.1/journaldata</value>  

40. </property>  

41. <!-- 开启NameNode失败自动切换 -->  

42. <property>  

43. <name>dfs.ha.automatic-failover.enabled</name>  

44. <value>true</value>  

45. </property>  

46. <!-- 配置失败自动切换实现方式 -->  

47. <property>  

48. <name>dfs.client.failover.proxy.provider.ns1</name>  

49. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  

50. </property>  

51. <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->  

52. <property>  

53. <name>dfs.ha.fencing.methods</name>  

54. <value>  

55. sshfence  

56. shell(/bin/true)  

57. </value>  

58. </property>  

59. <!-- 使用sshfence隔离机制时需要ssh免登陆 -->  

60. <property>  

61. <name>dfs.ha.fencing.ssh.private-key-files</name>  

62. <value>/home/hadoop/.ssh/id_rsa</value>  

63. </property>  

64. <!-- 配置sshfence隔离机制超时时间 -->  

65. <property>  

66. <name>dfs.ha.fencing.ssh.connect-timeout</name>  

67. <value>30000</value>  

68. </property>  

 

yarn-site.xml --->

[html] view plain copy

1. <!-- 开启RM高可用 -->  

2. <property>  

3. <name>yarn.resourcemanager.ha.enabled</name>  

4. <value>true</value>  

5. </property>  

6. <!-- 指定RMcluster id -->  

7. <property>  

8. <name>yarn.resourcemanager.cluster-id</name>  

9. <value>yrc</value>  

10. </property>  

11. <!-- 指定RM的名字 -->  

12. <property>  

13. <name>yarn.resourcemanager.ha.rm-ids</name>  

14. <value>rm1,rm2</value>  

15. </property>  

16. <!-- 分别指定RM的地址 -->  

17. <property>  

18. <name>yarn.resourcemanager.hostname.rm1</name>  

19. <value>sempplsl-07</value>  

20. </property>  

21. <property>  

22. <name>yarn.resourcemanager.hostname.rm2</name>  

23. <value>sempplsl-08</value>  

24. </property>  

25. <!-- 指定zk集群地址 -->  

26. <property>  

27. <name>yarn.resourcemanager.zk-address</name>  

28. <value>sempplsl-02:2181,sempplsl-03:2181,sempplsl-04:2181</value>  

29. </property>  

30. <property>  

31. <name>yarn.nodemanager.aux-services</name>  

32. <value>mapreduce_shuffle</value>  

33. </property>  

 

marped-site.xml--->

[html] view plain copy

1. <!-- 指定mr框架为yarn方式 -->  

2. <property>  

3. <name>mapreduce.framework.name</name>  

4. <value>yarn</value>  

5. </property>  

 

3.HA集群启动

3.1. 修改slaves文件

    slaves文件保存子节点的位置,要在sempplsl-05上启动hdfs,按照集群配置,需要指定datanode在sempplsl-02,sempplsl-03,sempplsl-04上,方法是进入sempplsl-05机器中的hadoop-2.4.1/etc/hadoop安装文件夹。

    此外,在sempplsl-07上启动yarn,按照集群配置,需要指定nodemanager在sempplsl-02,sempplsl-03,sempplsl-04上,方法同上。

3.2.配置无密钥登陆

    配置sempplsl-05到sempplsl-02,sempplsl-03,sempplsl-04,sempplsl-06的无密钥登陆;(ssh-keygen -t rsa,ssh-copy-id 目标主机)

    配置sempplsl-07到sempplsl-02,sempplsl-03,sempplsl-04,sempplsl-08的无密钥登陆;

3.3.将配置好的hadoop copy到集群其它节点

    scp -r

3.4.启动zookeeper集群

    分别在sempplsl-02,sempplsl-03,sempplsl-04机器上执行启动指令:./zkServer.sh start 

    查看zookeeper状态:./zkServer.sh status, 正确的状态是一个leader,两个follower。

3.5.启动journalnode

    分别在sempplsl-02,sempplsl-03,sempplsl-04机器上执行启动指令:sbin/hadoop-daemon.sh start journalnode。

    启动成功后会多出一个JournalNode进程。

3.6. 格式化HDFS

    在sempplsl-05上执行格式化指令:hadoop namenode -format(第一次选择Y,重启集群选择N。不要改变集群节点)

将namenode01的tmp拷贝到namenode02

3.7.格式化zkfc

    在sempplsl-05上执行格式化指令: hdfs zkfc -formatZK (重启不用管)

    格式化成功后会在zookeeper集群建立新的文件路径(该路径下存放zkfc监控namenode节点的信息)

3.8.启动HDFS

    在sempplsl-05上执行:start-dfs.sh。

3.9.启动yarn

   在sempplsl-07上执行sbin/start-yarn.sh

   在sempplsl-08上执行./yarn-daemon.sh start resourcemanager

至此,HA集群启动成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值