一、基础准备工作

1、准备好5台Linux系统虚拟服务器或物理服务器

  我这里演示采用虚拟服务器搭建Hadoop-HA集群,各自功能分配如下:

  NameNode节点:vt-serv、vt-serv4 

  DataNode节点:vt-serv1、vt-serv2、vt-serv3 

  Journalnode节点:vt-serv1、vt-serv2、vt-serv3 

  Zookeeper服务器:vt-serv1、vt-serv2、vt-serv3

  mysql数据库:vt-serv  

  Hive数据仓库:vt-serv4

   注:这5台服务器已经配置好了JDK1.8、Zookeeper、mysql-5.6等必备工具及基本环境,这些基础配置以及Hive在这里不作介绍!

2、在每台服务器上创建共同的账号:hadoop ;以及工作组:bigdata

1

2

#添加工作组

$ groupadd bigdata

1

2

#添加用户到指定工作组

useradd -g bigdata hadoop

3、配置hadoop账户在服务器之间进行免密登录

① 在各服务器上生成密钥

1

2

#在hadoop用户下生成密钥

ssh-keygen -t rsa

② 将每一台服务器生成的密钥整合到同一台服务器(每一台服务器上执行)

1

2

#整合密钥

ssh-copy-id vt-serv

③ 将整合成功的密钥分发到其它几台服务器

1

2

3

4

5

#分发密钥

scp ~/.ssh/authorized_keys vt-serv1:~/.ssh/

scp ~/.ssh/authorized_keys vt-serv2:~/.ssh/

scp ~/.ssh/authorized_keys vt-serv3:~/.ssh/

scp ~/.ssh/authorized_keys vt-serv4:~/.ssh/

④ 修改authorized_keys权限(只允许自己可以读写,权限过大系统会拒绝远程登录;同样每一台服务器都执行)

1

2

#修改权限

chmod 500 ~/.ssh/authorized_keys

⑤ 测试远程登录(任意服务器之间进行登录操作验证,如果能直接登录到对方服务器就表示配置OK!)

1

2

#vt-serv上验证免密登录

ssh vt-serv4

二、HA高可用集群搭建

1、准备好hadoop安装包

我这是用的是hadoop-2.7.6.tar.gz 官网提供

2、创建hadoop工作目录

1

2

3

#创建目录

mkdir -p /opt/bigdata/HA

mkdir -p /opt/data/HA/

3、解压安装包

1

2

#解压包到工作目录

tar -zxf hadoop-2.7.6.tar.gz /opt/bigdata/

4、配置core-site.xml文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

####core-site.xml begin#####

<configuration>

    <!-- 指定hadoop运行时临时目录位置 -->

    <property>

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

        <value>/opt/bigdata/HA/tmp</value>

    </property>

    <!-- 把两个NameNode)的地址组装成一个集群mycluster,需要和hdfs-site.xml一致 -->

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://mycluster</value>

    </property>

    <!-- Zookeeper集群 -->

    <property>

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

        <value>vt-serv1:2181,vt-serv2:2181,vt-serv3:2181</value>

    </property>

</configuration>

####core-site.xml end#####

5、配置hdfs-site.xml文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

####hdfs-site.xml begin#####

<configuration>

    <!-- 完全分布式集群名称 -->

    <property>

        <name>dfs.nameservices</name>

        <value>mycluster</value>

    </property>

    <!-- 集群中NameNode节点都有哪些 -->

    <property>

        <name>dfs.ha.namenodes.mycluster</name>

        <value>nn1,nn2</value>

    </property>

    <!-- nn1的RPC通信地址 -->

    <property>

        <name>dfs.namenode.rpc-address.mycluster.nn1</name>

        <value>vt-serv:9000</value>

    </property>

    <!-- nn2的RPC通信地址 -->

    <property>

        <name>dfs.namenode.rpc-address.mycluster.nn2</name>

        <value>vt-serv4:9000</value>

    </property>

    <!-- nn1的http通信地址 -->

    <property>

        <name>dfs.namenode.http-address.mycluster.nn1</name>

        <value>vt-serv:50070</value>

    </property>

    <!-- nn2的http通信地址 -->

    <property>

        <name>dfs.namenode.http-address.mycluster.nn2</name>

        <value>vt-serv4:50070</value>

    </property>

    <!-- 指定NameNode元数据在JournalNode上的存放位置(单数) -->

    <property>

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

        <value>qjournal://vt-serv1:8485;vt-serv2:8485;vt-serv3:8485/mycluster</value>

    </property>  

    <!-- 声明journalnode服务器存储目录-->

    <property>

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

        <value>/opt/data/HA/journal</value>

    </property>

    <!-- namenode文件路径 -->

    <property>

        <name>dfs.namenode.name.dir</name>

        <value>/opt/data/HA/name</value>

    </property>

    <!-- datanode文件路径 -->

    <property>

        <name>dfs.datanode.data.dir</name>

        <value>/opt/data/HA/data</value>

    </property>

    <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->

    <property>

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

        <value>

            sshfence

            shell(/bin/true)

        </value>

    </property>

    <!-- 使用隔离机制时需要ssh无秘钥登录-->

    <property>

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

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

    </property><br>    <!-- 关闭权限检查-->

    <property>

        <name>dfs.permissions.enable</name>

        <value>false</value>

    </property>

    <!-- 开启故障自动转移 -->

    <property>

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

        <value>true</value>

    </property><br>    <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->

    <property>

        <name>dfs.client.failover.proxy.provider.mycluster</name>

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

    </property>

</configuration>

####hdfs-site.xml end#####

6、编辑slaves 加入数据节点服务器名

1

2

3

4

5

6

#编辑slaves文件

vi /opt/bigdata/HA/hadoop-2.7.6/etc/hadoop/slaves

#加入我的数据节点服务器名称

   vt-serv1

   vt-serv2

   vt-serv3

7、将配置好的hadoop分发到各台服务器相同目录

1

2

#文件分发

scp -r /opt/bigdata/HA/hadoop-2.7.6/  vm-serv2:/opt/bigdata/HA/

8、启动JournalNode(我的JournalNode配置的分别是vt-serv1 、vt-serv2、vt-serv3三台服务器,分别去启动)

1

$ hadoop-daemon.sh start journalnode

9、在nn1格式化namenode

1

2

#格式化namenode这是关键的一步

$ hdfs namenode -format

10、在nn1启动namenode

1

$ hadoop-daemon.sh start namenode

11、在nn2同步namenode

1

$ hdfs namenode -bootstrapStandby

12、格式zookeeper zkfc数据(需要先保证Zookeeper是正常启动)

1

$ hdfs zkfc -formatZK

13、启动HDFS HA集群(在哪台namenode启动,则作为active)

1

$ start-dfs.sh

14、验证(停止 actived 那台服务器的 namenode)

1

$ hadoop-daemon.sh stop namenode

 正常情况下集群会把另一台namenode的standby状态自动切换为active状态 至此Hadoop-HA高可用集群配置完毕!

15、配置本地虚拟域名(路径:C:\Windows\System32\drivers\etc\hosts)加入自己的虚拟域名

1

2

3

#加入我的namenode服务器的虚拟域名

192.168.56.10  vt-serv

192.168.56.14  vt-serv4

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐