一步步教你搭建Hadoop集群
一、准备工作
假设现在有4台机器,分别是:192.168.1.101,192.168.1.102,192.168.1.103,192.168.1.104。
这里以Centos7系统为例 (不同版本的Linux系统在做某些操作时命令不一样,可自行百度) 四个节点都有登录账户hadoop。
我们计划这么配置:
先关闭防火墙
-
systemctl stop firewalld.service
-
systemctl stop iptables.service
然后再检查各机器的22端口是否开放
这里我们把ip映射成主机名,执行如下命令:
-
vi /etc/hosts
在hosts文件中,编辑以下内容
-
192.168.1.101 node1
-
192.168.1.102 node2
-
192.168.1.103 node3
-
192.168.1.104 node4
保存退出
检查node1的3306端口是否开放
然后将hosts文件发送到其它节点上
-
scp /etc/hosts hadoop@node2:/etc/
-
scp /etc/hosts hadoop@node3:/etc/
-
scp /etc/hosts hadoop@node4:/etc/
在发送的过程中需要输入hadoop用户的密码
二、配置免密码登录
然后在家目录下执行 ssh-keygen-t rsa
命令,不用管提示,一路回车,直到命令执行完成
再去其他节点执行相同的操作
例如: ssh node2 (跳转到node2节点)
此时每个节点的家目录下都有一个.ssh目录,里面有idrsa(私钥)和idrsa.pub(公钥)两个文件,将node2,node3,node4三个节点的id_rsa.pub复制一份发送到node1的家目录下
-
scp .ssh/id_rsa.pub hadoop@node1:~/pub2
-
scp .ssh/id_rsa.pub hadoop@node1:~/pub3
-
scp .ssh/id_rsa.pub hadoop@node1:~/pub4
把node1的公钥文件也复制一份到家目录下
-
cp .ssh/id_rsa.pub pub1
在node1的家目录下新建一个文件
-
touch authorized_keys
将4个节点的公钥文件内容全部输入到authorized_keys中
-
cat pub1 >> authorized_keys
-
cat pub2 >> authorized_keys
-
cat pub3 >> authorized_keys
-
cat pub4 >> authorized_keys
然后将authorized_keys文件发送到每个节点的.ssh文件夹下
-
cp authorized_keys .ssh/
-
scp authorized_keys hadoop@node2:~/
-
scp authorized_keys hadoop@node3:~/
-
scp authorized_keys hadoop@node4:~/
将下面这段话复制到每个节点的/etc/ssh/ssh_config文件中
-
Host *
-
StrictHostKeyChecking no
-
UserKnownHostsFile=/dev/null
至此,各节点之间切换就不需要输入密码了
三、安装JDK
下载jdk1.8
下载完后上传到node1的家目录上,输入以下命令解压
-
tar -zxvf jdk-8u131-linux-x64.tar.gz
解压完后删除压缩包,然后将解压后的文件夹改名为jdk
-
mv jdk1.8.0_131 jdk
配置环境变量:
-
vi .bashrc
在文件中编写以下内容
-
export JAVA_HOME=/home/hadoop/jdk
-
export PATH=$PATH:$JAVA_HOME/bin
保存退出
执行以下命令重新编译.bashrc文件,使之生效
-
source .bashrc
将jdk文件夹和.bashrc文件发送到其它节点,并source其它节点的.bashrc文件
-
scp –r jdk/ hadoop@node2:~/
四、安装zookeeper
下载zookeeper之后上传到node1的家目录上,输入以下命令解压
-
tar -zxvf zookeeper-3.4.8.tar.gz
解压完后删除压缩包,并修改文件夹名称
-
mv zookeeper-3.4.8 zookeeper
配置环境变量,在.bashrc文件中,export PATH这一句上面加一句
-
export ZOOKEEPER=/home/hadoop/zookeeper
然后在export PATH这一句的末尾追加 :
-
:$ZOOKEEPER_HOME/bin
保存退出,再 source.bashrc
一下
进入zookeeper配置文件目录
-
cd zookeeper/conf
修改配置文件名称
-
mv zoo_sample.cfg zoo.cfg
编辑配置文件
-
vi zoo.cfg
将下面这段话写进配置文件
-
server.1=node1:2888:3888
-
server.2=node2:2888:3888
-
server.3=node3:2888:3888
然后找到dataDir并修改其值
-
dataDir=/home/hadoop/tmp/zookeeper
保存退出
刚才配置的/home/hadoop/tmp/zookeeper这个文件夹如果不存在,要手动创建一下
然后在目录下创建myid文件,myid中写上对应的数字,数字要和zoo.cfg文件里配置的数字对应上,如node1的myid文件里写1,其他节点以此类推,最后保存退出。
将.bashrc和zookeeper文件夹发送到node2和node3节点的hadoop家目录下并source 一下.bashrc文件
在node1,node2,node3三个节点分别执行 zkServer.sh start
提示启动成功
三个节点都启动成功后,在其中某个节点执行 zkServer.sh status
如果有提示follower或者leader,则表示zookeeper安装成功
五、安装Hadoop
下面这个地址下载hadoop2.7.3版本 http://apache.fayea.com/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz
然后上传到node1的家目录上,输入以下命令解压
-
tar -zxvf hadoop-2.7.3.tar.gz
解压完后删除压缩包,并修改文件夹名称
-
mv hadoop-2.7.3 hadoop
配置环境变量,在.bashrc文件中,export PATH这一句上面加一句
-
export HADOOP_HOME=/home/hadoop/hadoop
然后在export PATH这一句的末尾追加 :
-
:$ HADOOP_HOME /bin:$ HADOOP_HOME /sbin
保存退出,再 source.bashrc
一下
进入hadoop的配置文件目录,修改以下配置文件
1. vi hadoop-env.sh
-
export JAVA_HOME=/home/hadoop/jdk
2. vi hdfs-site.xml
-
<configuration>
-
<!--block块存放副本的个数 -->
-
<property>
-
<name>dfs.replication</name>
-
<value>3</value>
-
</property>
-
<!--nameNode集群的名称 -->
-
<property>
-
<name>dfs.nameservices</name>
-
<value>hwua</value>
-
</property>
-
<!--nameNode集群对应有几个namenode在这里可以填很多个 -->
-
<property>
-
<name>dfs.ha.namenodes.hwua </name>
-
<value>nn1,nn2</value>
-
</property>
-
<!--nameNode程序rpc的通信 -->
-
<property>
-
<name>dfs.namenode.rpc-address.hwua.nn1</name>
-
<value>node1:8020</value>
-
</property>
-
<!--nameNode程序rpc的通信 -->
-
<property>
-
<name>dfs.namenode.rpc-address.hwua.nn2</name>
-
<value>node2:8020</value>
-
</property>
-
<!--nameNode程序http的通信 -->
-
<property>
-
<name>dfs.namenode.http-address.hwua.nn1</name>
-
<value>node1:50070</value>
-
</property>
-
<!--nameNode程序http的通信 -->
-
<property>
-
<name>dfs.namenode.http-address.hwua.nn2</name>
-
<value>node2:50070</value>
-
</property>
-
<!--这里那几台机器启动了journalNode服务 -->
-
<property>
-
<name>dfs.namenode.shared.edits.dir</name>
-
<value>qjournal://node2:8485;node3:8485;node4:8485/hwua</value>
-
</property>
-
<!--nameNode的active和standby在切换时候,提供的一个API -->
-
<property>
-
<name>dfs.client.failover.proxy.provider.hwua</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
-
</property>
-
<!--当一个namenode挂了,那么standby状态的接管,会在要断没断时将通过ssh到active上将其进程杀死 ,自己接管即:当NN2failover接管时,将通过ssh到namenode里面去,kill process(namenode),防止脑裂-->
-
<property>
-
<name>dfs.ha.fencing.methods</name>
-
<value>sshfence</value>
-
</property>
-
<!--通过钥匙去登录别的服务器,开启其它的服务,如DataNode -->
-
<property>
-
<name>dfs.ha.fencing.ssh.private-key-files</name>
-
<value>/home/hadoop/.ssh/id_rsa</value>
-
</property>
-
<!--journal存放edits文件的地方 -->
-
<property>
-
<name>dfs.journalnode.edits.dir</name>
-
<value>/usr/hadoopsoft/journal</value>
-
</property>
-
<!--当一台nameNode挂了,可以自动的切换 -->
-
<property>
-
<name>dfs.ha.automatic-failover.enabled</name>
-
<value>true</value>
-
</property>
-
</configuration>
3. vi core-site.xml
-
<configuration>
-
<!-- 指定hdfs的nameservice为namenode -->
-
<property>
-
<name>fs.defaultFS</name>
-
<value>hdfs://hwua</value>
-
</property>
-
<!-- 指定hadoop临时目录,如果没有请手动创建 -->
-
<property>
-
<name>hadoop.tmp.dir</name>
-
<value>/home/hadoop/tmp/hadoop</value>
-
</property>
-
<!-- 指定zookeeper所在的机器 -->
-
<property>
-
<name>ha.zookeeper.quorum</name>
-
<value>node1:2181,node2:2181,node3:2181</value>
-
</property>
-
</configuration>
4. mv mapred-site.xml.template mapred-site.xml
然后 vi mapred-site.xml
-
<property>
-
<name>mapreduce.framework.name</name>
-
<value>yarn</value>
-
</property>
5. vi yarn-site.xml
-
<property>
-
<name>yarn.nodemanager.aux-services</name>
-
<value>mapreduce_shuffle</value>
-
</property>
-
<property>
-
<name>yarn.resourcemanager.hostname</name>
-
<value>node1</value>
-
</property>
6. vi slaves
-
node2
-
node3
-
node4
填的是dataNode所在的节点:node2 node3 node4
而在完全分布式中设置的masters给删除掉,因为完全分布式中设置的secondaryNameNode节点ip,而这里有了高可用,不用secondaryNameNode,而被nn2替换掉了
7. 将hadoop的所有目录都拷贝到其它节点
-
scp -r /usr/hadoopsoft/hadoop-2.5.1 node2:/usr/hadoopsoft/
-
scp -r /usr/hadoopsoft/hadoop-2.5.1 node3:/usr/hadoopsoft/
-
scp -r /usr/hadoopsoft/hadoop-2.5.1 node4:/usr/hadoopsoft/
修改完所有文件后,先启动journalnode
-
Hadoop-deamonsh start journalnode
在其中一个namenode上格式化:hdfs namenode -format
把刚刚格式化之后的元数据拷贝到另一个namenode上
启动刚刚格式化的namenode
在没有格式化的namenode上执行:hdfs namenode –bootstrapStandby
启动第二个namenode
在其中一个namenode上初始化zkfc: hdfs zkfc –formatZK
停止上面的节点:stop-dfs.sh
最后,全面启动Hadoop: start-all.sh