Hadoop完全分布式搭建


zookeeper-3.4.8压缩包
链接:https://pan.baidu.com/s/1r6hQHVwa1VJCMZl3gCfOHw
提取码:3gau

hadoop-2.7.1压缩包
链接:https://pan.baidu.com/s/1782T4QWw5imR-lHBl_szwg
提取码:bm3d

一、Hadoop完全分布式

hadoop01hadoop02hadoop03
DataNodeDataNodeDataNode
NodeManagerNodeManagerNodeManager
QuorumPeerMainQuorumPeerMainQuorumPeerMain
JournalNodeJournalNodeJournalNode
DFSZKFailoverControllerDFSZKFailoverController
NameNodeNameNode-
ResourceManager-ResourceManager

NameNode:两个节点,一个是active主节点,另一个是standby备用节点
当其中一个节点出了故障,使用zookeeper来切换

hadoop在zookeeper上注册一个进程,ZKFC FailoverController崩溃恢复控制器

JournalNode:负责做节点之间实时备份通讯的。
为了让等待状态的节点保持和活动节点的状态同步,两个节点都需要通过一组的守护程序来通讯,这个守护程序称为journalNodes(JNs-日志节点)。

二、CentOS7安装

网易开源镜像站 清华大学镜像开源站

三、网络配置

进入网络文件配置的目录:
cd /etc/sysconfig/network-scripts/

编辑网络配置文件:
vim ifcfg-ens33

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" #修改为static
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="5aw33311-4290-43af-a31a-11w53a0fedsf"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.8.101" #CentOS的ip 自己设置
GATEWAY="192.168.8.1" #网关
DNS1="8.8.8.8" 

重启服务
systemctl restart network

四、修改主机名

hostnamectl set-hostname hadoop01

五、克隆hadoop01

克隆hadoop01虚拟机为hadoop02、hadoop03
修改网络配置文件的IPADDR的值为192.168.8.102、192.168.8.103
修改主机名hadoop02、hadoop03

六、集群分发脚本

创建文件xsync 修改xsync文件的权限:chmod 777 xsync
需要配置环境变量或者放入已配置环境变量的文件夹(echo $PATH查看 例:/root/bin)

#!/bin/bash
if [ $# -lt 1 ]
	then 	
		echo Not Enough Arguement!
		exit;
fi
for host in hadoop01 hadoop02 hadoop03
do 
	echo ===============  $host   ================
	for file in $@
	do
		if [ -e $file ]
			then
				pdir=$(cd -P $(dirname $file);pwd)
				fname=$(basename $file)
				ssh $host "mkdir -p $pdir"
				rsync -av $pdir/$fname $host:$pdir
			else
				echo $file does not exists!
		fi
	done
done

七、ip映射配置

配置/etc/hosts文件,将需要搭建集群的主机全部配置到hosts文件中
192.168.8.101 hadoop01
192.168.8.102 hadoop02
192.168.8.103 hadoop03
使用分发脚本xsync分发到其他节点 命令:xsync /etc/hosts

八、免密登录

命令:ssh-keygen -t rsa
生成的公私钥将自动存放在/root/.ssh目录下,把生成的公钥拷贝到其他节点上:
ssh-copy-id root@hadoop01
ssh-copy-id root@hadoop02
ssh-copy-id root@hadoop03
其他节点重复此步骤

九、安装JDK

mkdir /usr/local/java
上传压缩包到上面的文件夹并解压
tar -zxvf ./jdk-8u311-linux-x64.tar.gz

十、安装Zookeeper

mkdir /usr/local/zookeeper
上传压缩包到上面的文件夹并解压
tar -zxvf ./zookeeper-3.4.8.tar.gz
进入zookeeper的conf目录
拷贝 zoo_sample.cfg文件为zoo.cfg
cp zoo_sample.cfg zoo.cfg
修改zoo.cfg

...
...
# 修改dataDir的路径
dataDir=/usr/local/zookeeper/zookeeper-3.4.8/tmp
...
...
...
# 添加
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888

在/usr/local/zookeeper/zookeeper-3.4.8/tmp(配置文件zoo.cfg中dataDir的路径)目录下创建或修改myid文件 将文件内容修改为 1

分发zookeeper到hadoop02、hadoop03
修改hadoop02的tmp/myid文件中的内容为2
修改hadoop03的tmp/myid文件中的内容为3

zookeeper集群启动脚本 创建文件vim /root/bin/zk.sh 修改权限chmod 777 /root/bin/zk.sh

#!/bin/bash
case $1 in 
"start"){
	for i in hadoop01 hadoop02 hadoop03
	do
		echo ------------- zookeeper $i 启动 ----------------------
		ssh $i "source /etc/profile; /usr/local/zookeeper/zookeeper-3.4.8/bin/zkServer.sh start"
	done
}
;;
"stop"){
	for i in hadoop01 hadoop02 hadoop03
	do
		echo ------------- zookeeper $i 停止 ----------------------
		ssh $i "source /etc/profile; /usr/local/zookeeper/zookeeper-3.4.8/bin/zkServer.sh stop"
	done
}
;;
"status"){
	for i in hadoop01 hadoop02 hadoop03
	do
		echo ------------- zookeeper $i 状态 ----------------------
		ssh $i "source /etc/profile; /usr/local/zookeeper/zookeeper-3.4.8/bin/zkServer.sh status"
	done
}
;;
esac

十一、安装Hadoop

mkdir /usr/local/hadoop
上传压缩包到上面的文件夹并解压
tar -zxvf /usr/local/hadoop/hadoop-2.7.1_64bit.tar.gz

十二、修改hadoop配置文件

cd /usr/local/hadoop/hadoop-2.7.1/etc/hadoop

  • hadoop-env.sh
    修改JAVA_HOME的路径,修改成具体的路径
export JAVA_HOME=/usr/local/java/jdk1.8.0_311

修改HADOOP_CONF_DIR的路径,修改为具体的路径

export HADOOP_CONF_DIR=/usr/local/hadoop/hadoop-2.7.1/etc/hadoop
  • core-site.xml
<configuration>
	<!--指定hdfs的nameservice,为整个集群起一个别名-->
	<property>
		<name>fs.defaultFS</name>                
		<value>hdfs://ns</value><!--利用zk进行管理,在zk上注册该节点,名字叫ns-->
	</property>
	<!--指定Hadoop数据临时存放目录-->
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/usr/local/hadoop/hadoop-2.7.1/tmp</value>
	</property> 
	<!--指定zookeeper的存放地址,指定zk在哪些主机上-->
	<property>
		<name>ha.zookeeper.quorum</name>
		<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
	</property> 
</configuration>
  • hdfs-site.xml
<configuration>
	<!--执行hdfs的nameservice为ns,注意要和core-site.xml中的名称保持一致-->
	<property>
		<name>dfs.nameservices</name>
		<value>ns</value>
	</property>
	<!--ns集群下有两个namenode,分别为nn1, nn2-->
	<property>
		<name>dfs.ha.namenodes.ns</name>
		<value>nn1,nn2</value>
	</property>
	<!--nn1的RPC通信-->
	<property>
		<name>dfs.namenode.rpc-address.ns.nn1</name>
		<value>hadoop01:9000</value>
	</property>
	<!--nn1的http通信-->
	<property>
		<name>dfs.namenode.http-address.ns.nn1</name>
		<value>hadoop01:50070</value>
	</property>
	<!-- nn2的RPC通信地址 -->
	<property>
		<name>dfs.namenode.rpc-address.ns.nn2</name>
		<value>hadoop02:9000</value>
	</property>
	<!-- nn2的http通信地址 -->
	<property>
		<name>dfs.namenode.http-address.ns.nn2</name>
		<value>hadoop02:50070</value>
	</property>
	<!--指定namenode的元数据在JournalNode上存放的位置,这样,namenode2可以从journalnode集群里的指定位置上获取信息,达到热备效果-->
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
		<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/ns</value>
	</property>
	<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/usr/local/hadoop/hadoop-2.7.1/tmp/journal</value>
	</property>
	<!-- 开启NameNode故障时自动切换 ha高可用high availability-->
	<property>
		<name>dfs.ha.automatic-failover.enabled</name>
		<value>true</value>
	</property>
	<!-- 配置失败自动切换实现方式 -->
	<property>
		<name>dfs.client.failover.proxy.provider.ns</name>
		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
	<!-- 配置隔离机制 -->
	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>sshfence</value>
	</property>
	<!-- 使用隔离机制时需要ssh免登陆 -->
	<property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<value>/root/.ssh/id_rsa</value>
	</property>
	<!--配置namenode存放元数据的目录,可以不配置,如果不配置则默认放到hadoop.tmp.dir下-->
	<property>    
		<name>dfs.namenode.name.dir</name>    
		<value>file:///usr/local/hadoop/hadoop-2.7.1/tmp/hdfs/name</value>    
	</property>    
	<!--配置datanode存放元数据的目录,可以不配置,如果不配置则默认放到hadoop.tmp.dir下-->
	<property>    
		<name>dfs.datanode.data.dir</name>    
		<value>file:///usr/local/hadoop/hadoop-2.7.1/tmp/hdfs/data</value>    
	</property>
	<!--配置副本数量-->    
	<property>    
		<name>dfs.replication</name>    
		<value>3</value>    
	</property>   
	<!--设置用户的HDFS操作权限,false表示关闭权限验证,任何用户都可以操作-->                                                                    
	<property>    
		<name>dfs.permissions</name>    
		<value>false</value>    
	</property>
</configuration>

  • mapred-site.xml

拷贝mapred-site.xml.template为mapred-site.xml
编辑mapred-site.xml

<configuation>
	<property>    
		<name>mapreduce.framework.name</name>    
		<value>yarn</value>    
	</property>
</configuation>
  • yarn-site.xml
<configuration>
	<!--配置yarn的高可用-->
	<property>
		<name>yarn.resourcemanager.ha.enabled</name>
		<value>true</value>
	</property>
	<!--指定两个resourcemaneger的名称-->
	<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
	</property>
	<!--配置rm1的主机-->
	<property>
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>hadoop01</value>
	</property>
	<!--配置rm2的主机-->
	<property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>hadoop03</value>
	</property>
	<!--开启yarn恢复机制-->
	<property>
		<name>yarn.resourcemanager.recovery.enabled</name>
		<value>true</value>
	</property>
	<!--执行rm恢复机制实现类-->
	<property>
		<name>yarn.resourcemanager.store.class</name>
		<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
		</value>
	</property>
	<!--配置zookeeper的地址-->
	<property>
		<name>yarn.resourcemanager.zk-address</name>
		<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
	</property>
	<!--执行yarn集群的别名-->
	<property>
		<name>yarn.resourcemanager.cluster-id</name>
		<value>ns-yarn</value>
	</property>
	<!-- 指定nodemanager启动时加载server的方式为shuffle server -->
	<property>    
		<name>yarn.nodemanager.aux-services</name>    
		<value>mapreduce_shuffle</value>    
	</property>  
	<!-- 指定resourcemanager地址 -->
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>hadoop03</value>
	</property>
</configuration>
  • slaves

表示从节点,DataNode是哪些节点

hadoop01
hadoop02
hadoop03

十三、hadoop集群分发

将hadoop分发到其他节点
xsync /usr/local/hadoop

十四、环境变量配置

编辑profile文件:vim /etc/profile
添加Java、Hadoop的环境变量:

export JAVA_HOME=/usr/local/java/jdk1.8.0_311
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

保存退出,重新生效:source /etc/profile

十五、启动

  • 启动zookeeper:
    zk.sh start (zookeeper集群启动脚本)

  • 让zookeeper管理整个集群,在hadoop01上注册 格式化zookeeper:
    hdfs zkfc -formatZK(sh zkCli.sh,进行查看,其中多了一个hadoop.ha节点)

  • 分别在每台节点上,启动JournalNode:
    hadoop-daemon.sh start journalnode(jps可以看到进程JournalNode)

  • 在hadoop01上格式化NameNode:hadoop namenode -format

  • 在hadoop01上启动NameNode:
    hadoop-daemon.sh start namenode(jps可以看到进程NameNode)

  • 在hadoop02上格式化NameNode:
    hdfs namenode -bootstrapStandby(需要在hadoop01上启动NameNode成功,才可以做hadoop02格式化操作)

  • 在hadoop02上启动NameNode:
    hadoop-daemon.sh start namenode(jps可以看到进程NameNode)

  • 分别在三台节点上启动DataNode:
    hadoop-daemon.sh start datanode (jps可以看到进程DataNode)

  • 在hadoop01和hadoop02上启动zkfc(FailoverController两个NameNode之间的切换管理进程):hadoop-daemon.sh start zkfc

  • 在hadoop01上启动Yarn:start-yarn.sh

  • 在hadoop03上启动ResourceManager:yarn-daemon.sh start resourcemanager

以上的配置和启动流程,只是第一次需要这样顺序,后期关闭和启动,可直接使用:
stop-all.sh start-all.sh
hadoop01七个进程、hadoop02六个进程、hadoop03五个进程,缺失进程在该节点上再次启动start-all.sh

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值