使用Centos7来进行完全分布式的集群搭建,一般我们用伪分布式的集群就可以了,不需要配置完全分布式的集群
和我们搭建伪分布式集群一样,我们首先要现在好安装包,以及我们需要配置配置JDK,SSH免秘钥登陆,以及Zookeeper分布式的搭建等,下面就开始我们的搭建过程

一、配置Linux虚拟机

1.配置主机名以及主机映射

我们配置集群环境的时候,设置固定的主机名和主机映射能够方便的让我我们使用

修改主机名

修改主机名的时候,Centos6和Centos7完全不一样。下面是Centos7为例来修改我们的主机名

vim /etc/hostname

删除原来的主机名,修改为我们自己的要配置的,在这里我修改的主机名为zj01,zj02,zj03,一般我们都是设置的master,slave1,slave2。按照个人喜好修改主机名

注意:修改主机名后我们需要重启虚拟机才会生效,使用reboot命令重启虚拟机

reboot

补充:Centos6修改主机名

vim /etc/sysconfig/network

将里面原来信息修改为如下信息:

NETWORKING=yes
HOSTNAME=zj01

修改完成后重启虚拟机

配置主机映射

修改配置文件hosts

vim /etc/hosts

根据自己的ip信息,添加如下信息:

#127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.8.130   zj01
192.168.8.131   zj02
192.168.8.132   zj03

再修改我们的主机映射的时候,我们可以通过ifconfig来查看我们自己的ip信息,进行配置

ifconfig

linux hdfs分布式集群 hadoop集群完全分布式搭建_linux hdfs分布式集群


主机映射配置完毕

2.关闭防火墙

Centos7系统默认防火墙不是iptables,而是firewall,那就得使用以下方式关闭防火墙了。

systemctl stop firewalld.service            #停止firewall
systemctl disable firewalld.service        #禁止firewall开机启动

此时Centos7的防火墙就关闭了。

补充:Centos6关闭防火墙

service iptables status				#查看防火墙状态
service iptables stop				#关闭防火墙,但是重启后会恢复原来状态
chkconfig iptables --list			#查看系统中防火墙的自动
chkconfig iptables off				#关闭防火墙自启动
chkconfig iptables --list			#再次查看防火墙自启动的情况,所有启动状态都变成额off

常时间没有用过Centos6了,应该是–list,如果不是直接关闭就行了,不用纠结这个命令

二、SSH免秘钥的配置

执行以下命令来生成相应得秘钥

ssh-keygen -t rsa

一路回车,生成私有秘钥

cd /root/.ssh
ls

linux hdfs分布式集群 hadoop集群完全分布式搭建_完全分布式_02


一般在第一次执行的时候,只有id_rsa、id_rsa.pub这两个文件,但是id_rsa.pub文件存的是私有秘钥,要想让其他节点来连接本台机器我们需要生成公钥,执行ssh-copy-id可以将秘钥转成公钥,在三台节点上执行以下命令:

ssh-copy-id zj01
ssh-copy-id zj02
ssh-copy-id zj03

执行过次语句后,每台节点上都会生成以下两个文件authorized_keys,known_hosts,查看两个文件的内容,执行此语句的时候需要我们先输入yes统一连接,再输入要连接节点的密码就可以了。

cat authorized_keys

linux hdfs分布式集群 hadoop集群完全分布式搭建_分布式_03


此文件里面存储的是三台节点的秘钥。

查看known_hosts文件

cat known_hosts

linux hdfs分布式集群 hadoop集群完全分布式搭建_完全分布式_04


此文件主要记录的是我们使用ssh连接过的主机名。

相对而言authorized_keys文件是最重要的,有了这个文件我们再使用ssh连接的时候直接就连接了,不用我们再输入密码。

linux hdfs分布式集群 hadoop集群完全分布式搭建_linux hdfs分布式集群_05


自此SSH免秘钥设置完毕。我们可以继续下面组件的安装配置。

三、JDK的安装部署

创建一个目录,用来存放所有的安装目录。在这里我创建的是目录是/apps/,我们可以将所有的安装包上传到这个文件中,解压后再将安装包删除。

注意:jdk三台都需要配置

1.卸载系统自带的jdk

rpm -qa | grep java

使用rpm进行卸载

rpm -e java-xxx
rpm -e --nodeps java-xxx   #强制卸载

2.下载jdk安装包并上传到虚拟机中

在官网上进行下载jdk的安装包

官网路径:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

linux hdfs分布式集群 hadoop集群完全分布式搭建_hadoop_06


我这里面使用的XShell连接的虚拟机,在XShell连接的时候,执行以下语句就可以实验windows和虚拟机之间的文件传输

yum install lrzsz -y

执行完成后就可以将文拖到虚拟机终端里面进行文件的上传。
注意:这只是其中的一种解决方案,我们还可以下载winscp来实现文件的上传下载。

3.安装jdk

解压并重新命令

tar -zxvf jdk-8u162-linux-x64.tar.gz ./
mv jdk-1.8.0_162 jdk
rm -rf  jdk-8u162-linux-x64.tar.gz

修改环境变量(三个节点都配置)

vim /etc/profile

配置如下:

#JDK 1.8
export JAVA_HOME=/apps/jdk
export PATH=$PATH:$JAVA_HOME/bin

刷新环境变量

source /etc/profile

验证jdk是否安装成功

java -version

输出如下:

linux hdfs分布式集群 hadoop集群完全分布式搭建_集群搭建_07


我们可以通过以下命令将jdk文件上传到其余的节点中

scp -r /apps/jdk zj02:/apps/
scp -r /apps/jdk zj03:/apps/

这样我们就可以在02,03节点上/apps/目录下查看我们上传的jdk文件,需要我们配置环境变量就可以了。

四、Zookeeper的安装部署

要配置完全分布式的Hadoop集群,Zookeeper的主要作用就是协调集群的运行,在Hadoop生态圈中zookeeper的作用是至关重要的。

下载zookeeper的安装包

首先我们要先下载zookeeper的安装包,在管网上下载安装包就可以了

管网路径:https://archive.apache.org/dist/zookeeper/

这里面有好多版本,我们可以选择自己版本进行下载。

linux hdfs分布式集群 hadoop集群完全分布式搭建_集群搭建_08


将下载后的安装包,上传到zj01的/apps目录下。

安装zookeeper

解压zookeeper的安装包并重名为zookeeper

tar -zxvf zookeeper-3.4.12.tar.gz 
mv zookeeper-3.4.12 zookeeper
rm -rf zookeeper-3.4.12.tar.gz

修改环境变量(三个节点都配置)

vim /etc/profile

在文件末尾添加一下信息

#zookeeper
export ZOOKEEPER_HOME=/apps/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

配置到文件后我们要刷新一下环境变量,让我们的配置信息生效

source /etc/profile

配置zookeeper

进入zookeeper的conf目录下,将zoo_example.cfg复制出来一个为zoo.cfg

cp zoo_example.cfg zoo.cfg

修改zoo.cfg文件

vim zoo.cfg

配置信息如下

linux hdfs分布式集群 hadoop集群完全分布式搭建_集群搭建_09

server.0=zj01:2888:3888
server.1=zj02:2888:3888
server.2=zj03:2888:3888

其中0、1、2分别代表的是zj01、zj02、zj03的标识符。
创建标识符
进入dataDir设置的目录/apps/zookeeper/tmp,在此目录下创建一个myid文件,用来存放我们设置的标识符

cd /apps/zookeeper/tmp
echo 1 > myid

查看标识符

linux hdfs分布式集群 hadoop集群完全分布式搭建_linux hdfs分布式集群_10


分发文件到其余的两个节点

scp -r /apps/zookeeper slave2:/apps/zookeeper
scp -r /apps/zookeeper slave3:/apps/zookeeper

记得修改zj02,zj03的标识符为1和2

linux hdfs分布式集群 hadoop集群完全分布式搭建_完全分布式_11

linux hdfs分布式集群 hadoop集群完全分布式搭建_hadoop_12


启动zookeeper

zkServer.sh stat

查看每台zookeeper的状态,会出现一个leader,两个flower。此时zookeeper的集群搭建完毕

五、Hadoop的安装部署

下载安装包

我们可以在官网上进行下载安装包
官网:https://archive.apache.org/dist/hadoop/common/
进入官网选择自己想要下载的安装包进行下载,切记下载64位的tar.gz安装包
将下载好的安装包上传到zj01的/apps/目录下。

安装hadoop

解压并重命名为hadoop

tar -zxvf hadoop-2.7.5.tar.gz 
mv hadoop-2.7.5 hadoop
rm -rf hadoop-2.7.5.tar.gz

修改环境变量(三个节点都配置)

vim /etc/profile

在文件末尾添加一下信息

#hadoop
export HADOOP_HOME=/apps/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

配置到文件后我们要刷新一下环境变量,让我们的配置信息生效

source /etc/profile

修改配置文件

进入hadoop配置文件所在目录

cd /apps/hadoop/etc/hadoop

我们在此目录下需要修改5个配置文件

修改hadoop-env.sh

需要我们指定jdk的版本信息

export JAVA_HOME=/apps/jdk

修改core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
	<!--指定文件系统的主节点-->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://bigdata</value>
    </property>
	<!--hadoop的日志路径-->
	<property>
        <name>hadoop.tmp.dir</name>
        <value>/apps/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
	
	<!--指定可以在任何 IP 访问-->
	<property>
		<name>hadoop.proxyuser.hduser.hosts</name>
		<value>*</value>
	</property>
	
	<!--指定所有用户可以访问-->
	<property>
		<name>hadoop.proxyuser.hduser.groups</name>
		<value>*</value>
	</property>
	
	<!--这里是 ZooKeeper 集群的地址和端口。注意,数量一定是奇数,且不少于三个节点-->
	<property>
	<name>ha.zookeeper.quorum</name>
	<value>zj01:2181,zj02:2181,zj03:2181</value>
	</property>
</configuration>

修改hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>	
	<!--指定 hdfs 的集群名为 bigdata -->
	<property>
		<name>dfs.nameservices</name>
		<value>bigdata</value>
	</property>
	
	<!-- ns1 下面有两个 NameNode,分别是 nn1,nn2 -->
	<property>
		<name>dfs.ha.namenodes.bigdata</name>
		<value>nn1, nn2</value>
	</property>
	
	<!-- nn1 的 RPC 通信地址 -->
	<property>
		<name>dfs.namenode.rpc-address.bigdata.nn1</name>
		<value>zj01:9000</value>
	</property>
	
	<!-- nn2 的 RPC 通信地址 -->
	<property>
		<name>dfs.namenode.rpc-address.bigdata.nn2</name>
		<value>zj02:9000</value>
	</property>
	
	<!-- nn1 的 http 通信地址 -->
	<property>
		<name>dfs.namenode.http-address.bigdata.nn1</name>
		<value>zj01:50070</value>
	</property>
	
	<!-- nn2 的 http 通信地址 -->
	<property>
	<name>dfs.namenode.http-address.bigdata.nn2</name>
	<value>zj02:50070</value>
	</property>
	
	<!--指定 JournalNode 集群在对 NameNode 的目录进行共享时,自己存储数据的磁盘路径-->
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/home/hadoop/hadoop/journaldata</value>
	</property>
	
	<!-- 指定 cluster1 的两个 NameNode 共享 edits 文件目录时,使用的JournalNode 集群信息-->
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
		<value>qjournal://zj01:8485;zj02:8485;zj03:8485/bigdata</value>
	</property>
	
	<!-- qj 方式共享 edits。使用此方式-->
	<property>
		<name>dfs.namenode.edits.journal-plugin.qjournal </name>
		<value>org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager</value>
	</property>
	
	<!--开启 NameNode 失败自动切换-->
	<property>
		<name>dfs.ha.automatic-failover.enabled</name>
		<value>true</value>
	</property>
	
	<!--设置为 true,允许 NN 尝试恢复之前失败的 dfs.namenode.name.dir 目录。在创建 checkpoint 是做此尝试。如果设置多个磁盘,建议允许-->
	<property>
		<name>dfs.namenode.name.dir.restore</name>
		<value>true</value>
	</property>
	
	<!--指定出故障时,哪个实现类负责执行故障切换-->
	<property>
		<name>dfs.client.failover.proxy.provider.bigdata</name>
		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
	
	<!--一旦需要 NameNode 切换,使用 ssh 方式进行操作-->
	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>
				sshfence
				shell(/bin/true)
		</value>
    </property>

	
	<!--如果使用 ssh 进行故障切换,使用 ssh 通信时用的密钥存储的位置-->
	<property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<value>/root/.ssh/id_rsa</value>
	</property>
	
	<!--指定 namenode 名称空间的存储地址, 可以是按逗号分隔的目录列表-->
	<property>
	<name>dfs.namenode.name.dir</name>
	<value>file:///apps/hadoop/dfsdata/name</value>
	</property>
	
	<property>
		<name>dfs.blocksize</name>
		<value>67108864</value>
	</property>
	
	<!--指定 datanode 数据存储地址, 可以是按逗号分隔的目录列表-->
	<property>
		<name>dfs.datanode.data.dir</name>
		<value>file:///apps/hadoop/dfsdata/data</value>
	</property>
	
	<!--指定数据冗余份数,不超过机器数即可-->
	<property>
		<name>dfs.replication</name>
		<value>3</value>
	</property>
	
	<!--指定可以通过 web 访问 hdfs 目录-->
	<property>
		<name>dfs.webhdfs.enabled</name>
		<value>true</value>
	</property>
</configuration>

修改mapred-site.xml

复制mapred-site.xml.template为mapred-site.xml

cp mapred-site.xml.template mapred-site.xml

具体配置信息如下:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
	<!--指定运行 mapreduce 的环境是 yarn -->
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
</configuration>

修改yarn-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
	<!--rm 失联后重新链接的时间-->
	<property>
		<name>yarn.resourcemanager.connect.retry-interval.ms</name>
		<value>2000</value>
	</property>
	
	<!--开启 resource manager HA,默认为 false-->
	<property>
		<name>yarn.resourcemanager.ha.enabled</name>
		<value>true</value>
	</property>
	
	<!--配置 resource manager 命名-->
	<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>zj01</value>
	</property>

	<property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>zj02</value>
	</property>
	
	<!--开启 resourcemanager 故障自动切换,指定机器-->
	<property>
		<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
		<value>true</value>
	</property>

	<!--在 zj01 上配置 rm1,在 zj02 上配置 rm2,注意:一般都喜欢把配置好的文件远程复制到其它机器上,但这个在 YARN 的另一个机器上一定要修改,其他机器上不配置此项-->
	<property>
		<name>yarn.resourcemanager.ha.id</name>
		<value>rm1</value>
	</property>
	
	<!--开启 resourcemanager 自动恢复功能-->
	<property>
		<name>yarn.resourcemanager.recovery.enabled</name>
		<value>true</value>
	</property>
	
	<!--用于持久存储的类。尝试开启-->
	<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>zj01:2181,zj02:2181,zj03:2181</value>
	</property>
	
	<!--失联等待连接时间-->
	<property>
		<name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
		<value>5000</value>
	</property>
	
	<!-- 集群的 Id,使用该值确保 RM 不会做为其它集群的 active -->
	<property>
		<name>yarn.resourcemanager.cluster-id</name>
		<value>bigdata</value>
	</property>
	
	<!--配置 rm1-->
	<property>
		<name>yarn.resourcemanager.address.rm1</name>
		<value>zj01:8132</value>
	</property>
	
	<property>
		<name>yarn.resourcemanager.scheduler.address.rm1</name>
		<value>zj01:8130</value>
	</property>
	
	<!-- RM 的网页接口地址:端口-->
	<property>
		<name>yarn.resourcemanager.webapp.address.rm1</name>
		<value>zj01:8088</value>
	</property>
	
	<property>
		<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
		<value>zj01:8131</value>
	</property>
	
	<!-- RM 管理接口地址:端口-->
	<property>
		<name>yarn.resourcemanager.admin.address.rm1</name>
		<value>zj01:8033</value>
	</property>
	
	<property>
		<name>yarn.resourcemanager.ha.admin.address.rm1</name>
		<value>zj01:23142</value>
	</property>
	
	<!--配置 rm2-->
	<property>
		<name>yarn.resourcemanager.address.rm2</name>
		<value>zj02:8132</value>
	</property>
	
	<property>
		<name>yarn.resourcemanager.scheduler.address.rm2</name>
		<value>zj02:8130</value>
	</property>
	
	<!-- RM 的网页接口地址:端口-->
	<property>
		<name>yarn.resourcemanager.webapp.address.rm2</name>
		<value>zj02:8088</value>
	</property>
	
	<property>
		<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
		<value>zj02:8131</value>
	</property>
	
	<!-- RM 管理接口地址:端口-->
	<property>
		<name>yarn.resourcemanager.admin.address.rm2</name>
		<value>zj02:8033</value>
	</property>
	
	<property>
		<name>yarn.resourcemanager.ha.admin.address.rm2</name>
		<value>zj02:23142</value>
	</property>
	
	<!--请配置为:mapreduce_shuffle,在 Yarn 上开启 MR 的必须项-->
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
	
	<property>
		<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
		<value>org.apache.hadoop.mapred.ShuffleHandler</value>
	</property>
	
	<!-- nodemanager 本地文件存储目录-->
	<property>
		<name>yarn.nodemanager.local-dirs</name>
		<value>/apps/hadoop/dfsdata/yarn/local</value>
	</property>
	<!--存储 container 日志的地方-->
	<property>
		<name>yarn.nodemanager.log-dirs</name>
		<value>/apps/hadoop/dfsdata/logs</value>
	</property>
	
	<property>
		<name>yarn.nodemanager.resource.memory-mb</name>
		<value>1024</value>
		<discription>每个节点可用内存,单位 MB</discription>
	</property>
	
	<property>
		<name>yarn.scheduler.minimum-allocation-mb</name>
		<value>258</value>
		<discription>单个任务可申请最少内存,默认 1024MB</discription>
	</property>
	
	<property>
		<name>yarn.scheduler.maximum-allocation-mb</name>
		<value>512</value>
		<discription>单个任务可申请最大内存,默认 8192MB</discription>
	</property>
	
	<property>
		<name>yarn.nodemanager.webapp.address</name>
		<value>0.0.0.0:8042</value>
	</property>
</configuration>

修改slaves文件

zj01
zj02
zj03

分发hadoop文件到其他节点

scp -r /apps/hadoop slave2:/apps/
scp -r /apps/hadoop slave3:/apps/

初始化hadoop

在执行格式化的时候开启一个进程:

hadoop-daemon.sh start journalnode

格式化之后将name文件拷贝到zj02中,按理说应该是自动生成的,我的没有自动生成,是自己拷贝进去的

hadoop namennode -format

启动hadoop集群

#先启动zookeeper,再启动hadoop集群
start-all.sh

启动情况如下:

linux hdfs分布式集群 hadoop集群完全分布式搭建_分布式_13


查看虚拟机的各个进程:

linux hdfs分布式集群 hadoop集群完全分布式搭建_linux hdfs分布式集群_14


访问zj01:50070端口和zj02:50070端口

http://zj01:50070 http://zj02:50070

linux hdfs分布式集群 hadoop集群完全分布式搭建_完全分布式_15


linux hdfs分布式集群 hadoop集群完全分布式搭建_分布式_16


访问zj01:8088端口

http://zj01:8088

linux hdfs分布式集群 hadoop集群完全分布式搭建_linux hdfs分布式集群_17


hadoop集安装成功,如果安装有什么问题,可以随时提哟,希望能帮助您。