Hadoop3.2.1在CentOs7搭建分布式集群
因为我这段时间刚刚接触Hadoop的学习,所以我就写一篇关于如何搭建分布式集群的文章来记录一下。(分布式集群为三台虚拟机构成,并且满足HA架构)
1,提前准备
(1)利用VMware建立三台操作系统是CentOs7的虚拟机。
(2)下载好hadoop–3.2.1.tar.gz。
(3)下载好zookeeper-3.4.14.tar.gz
(4)SecureCRT:终端服务,方便操作集群。
2, 三台虚拟机ip设置
(1),首先要确认虚拟机vmNET8网关(192.168.105.1)
(2)在每台虚拟机中分别对IP进行设置,必须保证网关一样,而每台的IP地址可以根据你的习惯来设置。
(3)利用Ping命令检查一下是否配置成功。
(4)修改每一台虚拟机的主机名,利用hostnamectl命令
[root@localhost ~]# hostnamectl set-hostname cone2
(5)每一台虚拟机都对/etc/hosts编辑,添加自己另外两台的IP地址与主机名。
3,JDK配置
因为Centos7会自带有相应的低版本JDK,所以我自己安装的JDK8不会起作用。会导致安装好的集群无法使用的情况。(JDK版本太高,hadoop3.2.1版本也可能会出问题)
(1)查看虚拟机是否带有自带的JDK
[root@cone2 ~]# rpm -qa | grep java
如果查询出来的有下面这种的形式就要需要删除:
java-1.7.0-openjdk-headless-1.7.0.111-2.6.7.8.el7.x86_64
java-1.7.0-openjdk-1.7.0.111-2.6.7.8.el7.x86_64
删除命令为:
[root@cone2 ~]# rpm -e --nodeps java-1.7.0-openjdk-1.7.0.111-2.6.7.8.el7.x86_64
(2)给自己下载好的JDK安装包解压
[root@cone2 ~]# tar -zxvf jdk-8u231-linux-x64.tar.gz -C app/
(3)配置JDK的路径
修改/etc/profile
[root@cone2 ~]# vi /etc/profile
添加JDK的bin文件夹的路径信息:
exportJAVA_HOME=/home/hadoop/app/jdk1.8.0_231
exportPATH= P A T H : PATH: PATH:JAVA_HOME/bin
(4)配置好以后,进行刷新以后才能生效。
[root@cone2 ~]# source /etc/profile
4,SSH免密登录
一定要记得这三台的虚拟机中的用户名要保持一致,我就是因为没有保持一致,导致SSH免密登录一直不成功。
(1)创建公钥
ssh-keygen -t rsa 每台虚拟机执行此命令然后一路回车
(2)然后分别用ssh命令登录另外的虚拟机,第一次登陆会让你记住密钥,yes即可。
ssh 另外的虚拟机
用户名保持一致避免了你需要修改其它权限的工作,至于为什么我也不是很清楚,希望大神能够解答一下。
5,zookeeper安装
(1)将每台虚拟机中解压好的zookeeper里面的conf文件下的zoo_sample.cfg改为zoo.cfg
(2)将zoo.cfg里面的dataDir路径改掉你自己创建的data临时文件的位置,然后再在zoo.cfg中添加三台虚拟机的IP配置信息。
dataDir=/home/hadoop/app/zookeeper-3.4.14/data
server.12=192.168.105.17:2888:3888
server.22=192.168.105.15:2888:3888
server.32=192.168.105.16:2888:3888
(3)在自己创建的data文件夹中创建一个myid文本文件,myid文本文件中输入一个对该台虚拟机的编号,可以随便输入,但是这三台虚拟机中不能重复。
注意:一定要保证这三台虚拟机的myid文本文件都赋予了不同的编号!
(4)每台虚拟机测试是否能启动zookeeper
./zkServer.sh start 这个命令必须在zookeeper的bin文件夹下才能使用,或者你已经配置好了zookeeper路径。
6,hadoop配置
hadoop 的配置也和zookeeper配置一样,每台虚拟机都需要进行相同的配置。
(1)配置hadoop路径
最好配置一下hadoop的路径,这样就可以每次都要到特定的文件夹中使用某些命令,不会的可以百度,这个和JDK配置路径大同小异。
(2)配置hadoop-env.sh
exportJAVA_HOME=/home/hadoop/app/jdk1.8.0_231
(3)配置hdfs-site.xml
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致-->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!--ns1下面有两个NameNode,分别是nn1,nn2-->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>g1:9000</value>
</property>
<!-- nn1的http的通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>g1:9870</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>g2:9000</value>
</property>
<!-- nn2的http的通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>g2:9870</value>
</property>
```<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://g1:8485;g2:8485;g3:8485/ns1</value>
</property>
<!--指定journalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/group1/app/hadoop-3.2.1/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登录 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/group1/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
(4)配置core-site.xml
<!-- 指定hdfs的nameservice为ns1-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1/</value>
</property>
<!-- 只当hadoop临时目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/group1/app/hadoop-3.2.1/tmp</value>
</property>
<!--指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>g1:2181,g2:2181,g3:2181</value>
</property>
(6)配置mapred-site.xml
<!--指定mr框架为yarn方式-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
//解决yarn类路径出错的问题
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
(7)配置yarn-site.xml
<!--开启RM高可用-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!--指定RM的名字-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!--分别指定RM的地址-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>g1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>g2</value>
</property>
<!--指定zk集群地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>g1:2181,g2:2181,g3:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
//解决三台机器搭建的HA 框架的mapreduce不能工作的额外配置
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>cone2:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>cone2:8030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>cone2:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>cone2:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm1</name>
<value>cone2:8033</value>
</property>
<property>
<name>yarn.resourcemanager.ha.admin.address.rm1</name>
<value>cone2:23142</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>ctwo:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>ctwo:8030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>ctwo:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>ctwo:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm2</name>
<value>ctwo:8033</value>
</property>
<property>
<name>yarn.resourcemanager.ha.admin.address.rm2</name>
<value>ctwo:23142</value>
</property>
上面的几个配置文件都是在hadoop-3.2.1/etc/hadoop中。
7,启动zookeeper
./zkServer.sh start
8,启动journalnode
./hadoop-daemon.sh start journalnode - -在hadoop的sbin下进行手动启动
7,hadoop格式化
再三台虚拟机的随便一台执行格式化操作,格式化只能进行一次,多次格式化会导致集群启动失败。
hadoop namenode -format --hadoop格式化命令
9,格式化ZKFC(在zookeeper实现状态管理)
在hadoop下的bin文件下输入:
./hdfs zkfc -formatZK
查看初始化成功:在zookeeper下的bin文件输入 ./zkCli.sh :查看是否有创建的数据节点
10,hadoop启动
start-dfs.sh --启动hadoop中的hdfs来检查集群是否创建成功
9,启动成功
(1)第一台虚拟机
(2)第二台虚拟机
(3)第三台虚拟机
上面是我学习搭建hadoop的分布式集群的搭建流程,希望能为像我这样的新手提供到一些方便。