一、参考文章:

1、配置时我觉得唯一好的参考文章:

二、安装配置:

centos7.5minimal下载地址:https://mirrors.tuna.tsinghua.edu.cn/centos/7.5.1804/isos/x86_64/1、centos7.5minimal系统中的配置:(系统安装省略,默认你的centos7.5minimal装好了)

  1. 安装好centos7.5minimal位操作系统以后要改其中的网络配置: a、指令:
`cd /etc/sysconfig/network-scripts/`

然后找到ifcfg-..文件(这里一般是ifcfg-ens33文件,但是在centos6中文件名不一样,具体操作我没有详细的研究)
vi ifcfg-ens33将其中的自动连接网络设置打开,既修改“ONBOOT”选项设置为“yes”。
b、重启network即可完成网络自动连接:

	`service network restart`

(2)获取本机ip地址: 有两种方式可以获得: a、指令 ip addr 一般会弹出来3个ip,看你的是连接的wifi还是网线,wifi是看ens33(就i是上边修改的那个文件的后缀名)里面的ip既主机ip,网线应改一样。 b、一般是用ifconfig指令查看,但是centos7.5minimal系统自己没有装这个指令,所以要自己下载指令工具 指令:

`yum install net-tools`   (一路确认即可)

然后用ifconfig查看(同a的查看方法)

(3)关闭防火墙: a、临时关闭防火墙:systemctl stop firewalld.service b、开机禁止自动开启防火墙:systemctl disable firewalld.service C、补充介绍: (1)(2)两个步骤的原因我就不解释,但是这里可能一些人不明白我为什么关防火墙,原因是hadoop在通信方面会被防火墙拦截。

(4)更改主机名:hostnamectl set-hostname HOSTNAME (”HOSTNAME“是你想改成的主机名) 然后重新连接(或者重启reboot)才能看到主机名修改

注释:
修改hostname是为了后面方便多台主机在连接通信的时候不用繁琐的输入ip,直接将其ip跟主机名写在/etc/hosts这个文件里然后在hadoop配置连接里就可以之际引用主机名。

(5)添加一个指令:yum install psmisc 没有该指令的在初始化ZKFC的时候会出现一个错误,这个是centos7minimal系统的缺陷,没有全套的指令,无关大雅,但是必须添加。

######################################################################################### (1)正式开始部署HA hadoop集群之前我要做一下步骤说明: 1、搭建zookeeper集群(用来管理hadoop集群和同步namenode数据) 2、搭建hadoop集群(这里又主要分为两个步骤): (1)hdfs框架的搭建 存储数据,切分、分片、多位置存储、提供云存储 (2)yarn框架的搭建 处理数据,主要是用于各种运算框架任务的控制,这里只是配置了mapreduce的普通框架,还有spark、storm等实时运算处理的框架 (2)再来介绍一下我的集群配置: 1、7台主机的ip地址: 192.168.43.69 hadoop0 192.168.43.218 hadoop1 192.168.43.190 hadoop2 192.168.43.36 hadoop3 192.168.43.211 hadoop4  192.168.43.161 hadoop5 192.168.43.248 hadoop6 把这个ip地址添加到/etc/hosts里边去 2、七台机器的任务分配: hadoop0 / hadoop1 / hadoop2: 主要分配zookeeper集群任务,datanode任务,nodemanager任务 hadoop3 / hadoop4: 主要分配namenode任务及其监视器 hadoop5 / hadoop6 主要分配resourcenamager任务 hadoop3.1.1下载地址:(下载地址我全部都是给的国内镜像地址,也是官网推荐地址,有更好的下载链接就用自己的下载链接,也麻烦留言)http:///apache/hadoop/common/ #########################################################################################
  1. hadoop集群配置: (1)安装java: 该步骤省略,百度一下就能找到结果。 主机中的hadoop及java环境配置:
export JAVA_HOME=/**(PATH)**/jdk1.8.0_181
		export HADOOP_HOME=/**(PATH)**/hadoop-3.1.1
		我的就是:
			export HADOOP_HOME=/usr/hadoop/hadoop3.1.1
			export JAVA_HOME=/usr/java/jdk1.8.0_181
		export PATH=$JAVA_HOME/bin:$JAVA_HOME/jar/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
(2)首先安装zookeeper集群:
	简介:zookeeper是hadoop HA机制的核心组件,其是用来监控namenode,resourcemanager数据同步及active,standby的一个中要组件,其是用类似人类选举的方式来确定谁是active状态的,所以一般设置奇数点个zookeeper,以便半数以上机器存活是集群cluster还可以工作
	zookeeper这个框架只要保证有一半以上的zookeeper集群机器存活就能保证其cluster存活,其自身用有很强的实时性,及在集群上如果一个客户端从一台机器上传数据到zookeeper集群上后其他机器可以立刻查看数据更改情况,所以很适合作为hadoop集群里面Edites.log的实时同步控件
	下载:zookeeper下载网站:http:///apache/zookeeper/
	从中找一个你觉得合适的版本下载安装,我用的是zookeeper3.4.13版
	2.(2).1、解压:
		`tar -zxvf zookeeper-3.4.13.tar.gz -C PATH`  (PATH是你想解压到的路径)
	2.(2).2、修改配置:
		切到解压好的文件夹下,再进入conf/目录下
		`
		cp zoo_sample.cfg zoo.cfg
		vi zoo.cfg
		修改:dataDir=/usr/tmp/  把路径改成你自己项要存放的位置这是记录zookeeper集群运行的一些数据一般修改为dataDir=/**(PATH)**(你解压好的路径)/zookeeper-3.4.13/tmp(这个文件自己还是要创建)
		末尾添加选项:
		server.1=hadoop0:2888:3888
		server.2=hadoop1:2888:3888
		server.3=hadoop2:2888:3888
		就是你配置的三台zookeeper的ip既端口
		
		在你写hadoopXXX的时候确保你的/etc/hosts文件有这些主机的ip
		
			再次提示:我的集群是按七台机器配置的,ip是:
			192.168.43.69	hadoop0 
			192.168.43.218	hadoop1 
			192.168.43.190	hadoop2 
			192.168.43.36	hadoop3 
			192.168.43.211	hadoop4	
			192.168.43.161	hadoop5 
			192.168.43.248	hadoop6
			这里的配置是配置集群的几台机器,端口号一般默认,只是修改机器的名称。
			我的zookeeper集群放在了hadoop0 hadoop1 hadoop2上
			namenode放在了hadoop3 hadoop4上
			datanode放在了hadoop0 hadoop1 hadoop2上
			resourcemanager放在了hadoop5 hadoop6上
			nodemanager放在了hadoop0 hadoop1 hadoop2上
			journalnode放在了hadoop0 hadoop1 hadoop2上
		`
		保存退出
		退出到解压目录
		 `mkdir tmp/` 创建一个空文件夹用来完整上述配置路径
		切到tmp/文件夹下
		`
		cd tmp/
		touch myid
		echo XX > myid
		执行重定向命令前确认你的现在所在的主机是第几个server!!!
		新建一个文件myid,将配置的server.XX数字写进去,这里用hadoop0作为示例就应该是echo 1 > myid
		`
		配好一台以后直接将解压的文件夹通过ssh连接复制过去,
		`
		scp -r -P /**(PATH)**/(一般按步骤来的切到解压后的上层目录的地址可直接写成:zookeeper-3.4.13/) hadoop1:/***(PATH)***/(最好是跟你的hadoop0的zookeeper解压路径一致)
		scp -r -P /**(PATH)**/(一般按步骤来的切到解压后的上层目录的地址可直接写成:zookeeper-3.4.13/) hadoop2:/***(PATH)***/(最好是跟你的hadoop0的zookeeper解压路径一致)
		自己修改中文名称及path路径,我的主机上是这两条指令:
		scp -r -P /usr/hadoop/zookeeper-3.14.3 hadoop1:/usr/hadoop
		scp -r -P /usr/hadoop/zookeeper-3.14.3 hadoop2:/usr/hadoop
		`
		拷贝完后:
		hadoop1机器下:
			`echo 2 > /**(PATH)**/zookeeper-3.4.13/tmp/myid`
		hadoop2机器下:
			`echo 3 > /**(PATH)**/zookeeper-3.4.13/tmp/myid`
		至此zookeeper集群搭建完成

(3)hadoop配置项:

cd /hadoop-3.1.1/etc/hadoop
在/hadoop-3.1.1/etc/hadoop这个文件夹下修改这么几项:
1、:
			export JAVA_HOME=/usr/java/jdk1.8.0_181/  java安装位置
			
			export HDFS_NAMENODE_USER=root
			export HDFS_DATANODE_USER=root
			export HDFS_JOURNALNODE_USER=root
			export HDFS_ZKFC_USER=root
			export YARN_RESOURCEMANAGER_USER=root
			export YARN_NODEMANAGER_USER=root    设置yarn,hdfs的运行用户为root,不设置hadoop3.1.1会提示报错,然后再添加也行
			
		2、core-site.xml:
			<property>
				<name>fs.defaultFS</name>
				<value>hdfs://ns1/</value>
			</property>
            <property>
                <name>hadoop.tmp.dir</name>
                <value>/usr/local/hadoop/hadoop-3.1.1/tmp</value>
            </property>
            <property>
                <name>ha.zookeeper.quorum</name>
                <value>hadoop0:2181,hadoop1:2181,hadoop2:2181</value>
            </property>
		
		3、hdfs-site.xml:
			<property>
				<name>dfs.nameservices</name>
				<value>ns1</value>
			</property>
			<property>
				<name>dfs.ha.namenodes.ns1</name>
				<value>nn1,nn2</value>
			</property>
			<property>
				<name>dfs.namenode.rpc-address.ns1.nn1</name>
				<value>hadoop4:9000</value>
			</property>
			<property>
				<name>dfs.namenode.http-address.ns1.nn1</name>
				<value>hadoop4:9870</value>
			</property>
			<property>
				<name>dfs.namenode.rpc-address.ns1.nn2</name>
				<value>hadoop3:9000</value>
			</property>
			<property>
				<name>dfs.namenode.http-address.ns1.nn2</name>
				<value>hadoop3:9870</value>
			</property>
			<property>
				<name>dfs.namenode.shared.edits.dir</name>
				<value>qjournal://hadoop0:8485;hadoop1:8485;hadoop2:8485/ns1</value>
			</property>
			<property>
				<name>dfs.journalnode.edits.dir</name>
				<value>/usr/local/hadoop/hadoop-3.1.1/journaldata</value>
			</property>
			<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>
			<property>
				<name>dfs.ha.fencing.ssh.private-key-files</name>
				<value>/root/.ssh/id_rsa</value>
			</property>
			<property>
				<name>dfs.ha.fencing.ssh.connect-timeout</name>
				<value>30000</value>
			</property>
		
		4、mapred-site.xml:
			 <property>
				<name>mapreduce.framework.name</name>
				<value>yarn</value>
			</property>
			<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>
		
		5、yarn-site.xml:
			<property>
                <name>yarn.scheduler.fair.sizebasedweight</name>
                <value>false</value>
			</property>
			<property>
			   <name>yarn.resourcemanager.ha.enabled</name>
			   <value>true</value>
			</property>
			<property>
			   <name>yarn.resourcemanager.cluster-id</name>
			   <value>yrc</value>
			</property>
			<property>
			   <name>yarn.resourcemanager.ha.rm-ids</name>
			   <value>rm1,rm2</value>
			</property>
			<property>
			   <name>yarn.resourcemanager.hostname.rm1</name>
			   <value>hadoop5</value>
			</property>
			<property>
			   <name>yarn.resourcemanager.hostname.rm2</name>
			   <value>hadoop6</value>
			</property>
			<property>
			   <name>yarn.resourcemanager.zk-address</name>
			   <value>hadoop0:2181,hadoop1:2181,hadoop2:2181</value>
			</property>
			<property>
			   <name>yarn.nodemanager.aux-services</name>
			   <value>mapreduce_shuffle</value>
			</property>
			<property>
				<name>yarn.resourcemanager.address.rm1</name>
				<value>hadoop5:8032</value>
			</property>
			<property>
				<name>yarn.resourcemanager.scheduler.address.rm1</name>
				<value>hadoop5:8030</value>
			</property>
			<property>
				<name>yarn.resourcemanager.webapp.address.rm1</name>
				<value>hadoop5:8088</value>
			</property>
			<property>
				<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
				<value>hadoop5:8031</value>
			</property>
			<property>
				<name>yarn.resourcemanager.admin.address.rm1</name>
				<value>hadoop5:8033</value>
			</property>
			<property>
				<name>yarn.resourcemanager.ha.admin.address.rm1</name>
				<value>hadoop5:23142</value>
			</property>
			<property>
				<name>yarn.resourcemanager.address.rm2</name>
				<value>hadoop6:8032</value>
			</property>
			<property>
				<name>yarn.resourcemanager.scheduler.address.rm2</name>
				<value>hadoop6:8030</value>
			</property>
			<property>
				<name>yarn.resourcemanager.webapp.address.rm2</name>
				<value>hadoop6:8088</value>
			</property>
			<property>
				<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
				<value>hadoop6:8031</value>
			</property>
			<property>
				<name>yarn.resourcemanager.admin.address.rm2</name>
				<value>hadoop6:8033</value>
			</property>
			<property>
				<name>yarn.resourcemanager.ha.admin.address.rm2</name>
				<value>hadoop6:23142</value>
			</property>
			<property>
				<name>yarn.nodemanager.vmem-pmem-ratio</name>
				<value>4</value>
			</property>
			
		6、workers(hadoop2.XX叫做slaves):
			以我配置的为例就是:
			DELET(删除) localhost
			hadoop0
			hadoop1
			hadoop2
			这里配置你需要的datanode和nodemanager工作节点
此处完后只是配完了一台机器的hadoop,还要把他通过ssh协议传到全部集群上去
		`ssh -r -P 22 /**(PATH)**/hadoop-3.1.1/ COMPUTER_IP:/**(PATH)**/   (两个未写出来的path应该保持一致)
		我的指令就是
		ssh -r -P 22 /usr/hadoop/hadoop-3.1.1/ hadoop1:/usr/hadoop/
		…………`
	
(4)似乎到这里hadoop都配置完了,但是还有很重要的一步就是配ssh免密登录,我配的hadoop集群是基于ssh协议上的通信,所以在没有免密登录之前hadoop是没办法操作其他机器的,就连自己对自己的控制也没法进行。
ssh-keygen -t rsa(生成公钥和私钥,一路回车就行,不用设密码)
		ssh-copy-id root@hadoopXX(一路确认,输入密码即可免密登录)   这种是把自己的公钥复制给别的机器,既本机可以登录别的机器
这里如果你不想了解hadoop之间是如何通信的可以直接设置全集群之间可以相互通信,既所有的机器都能免密登录任何集群上的机器(包括本机,ssh协议自己登录自己也要密码的)
	但是如果你要想了解我配的这七台机器如何通信请阅读下面内容:
*********************************************************************************************************************
		此部分为可选看区:
		首先介绍为什么要建立ssh免密登录协议:
			主机与主机之间不可能通过直接ssh连接的方式实现相互控制,只有当登录用户输入密码并且确认正确后才可以对被登陆主机操作,而ssh协议有一种免密登录的设置,既把自己的公钥复制给别的主机就可以登录别的主机,而在hadoop集群通信时,不可能让人手动输入密码进行通信(效率低、不够自动化、还麻烦),所以才需要建立免密登录来实现机器自动控制集群通信
		想要知道集群之间的机器如何通信就要搞清楚那几台机器需要通过ssh登录控制另外几台机器:
			1、namenode节点:
				(1)该节点需要管控datanode上的数据和启动datanode节点、另一台namenode节点,所以在所有配置了namenode节点上应该能ssh免密登录datanode节点,以实现数据在远程存储和管理。
				(2)由于该系统配置的是一个HA机制(高可用机制)的集群,所以在本机上由于有zkfc的控制作用,使得一台namenode主机down掉以后另一台可以通过zkfc框架(DFSZKFailoverController服务)来实现standby和active状态的切换,故namenode本机与namenode本机上应该能用ssh协议免密登录
				(3)由于namenode主机是通过zookeeper里面的一个进程journalnode来保持其内部的Edit.log一致,这样就导致我们的namenode与zookeeper集群又要建立ssh免密登陆机制。
				到这里我们可以看看自己的集群namenode应该能免密登录那几个节点,如以我的机器为例就是:
					hadoop3 <----> hadoop4
					hadoop3/hadoop4 --> hadoop0 hadoop1 hadoop2
			2、resourcemanager节点:
				(1)resourcemanager控制yarn框架里面的nodemanager任务管理,所以他要能启动远程的nodemanager,既需要ssh免密登陆nodemanager机器
				(2)resourcemanager需要自启动,所以需要ssh免密登录自己/似乎hadoop2.XX版是不能远程启动第二台resourcemanager的,所以在hadoop2.XX中不是通过ssh协议启动resourcemanager,具体情况未研究,此处仅以3.1.1版为例
				既ssh免密登录协议只需要:
					hadoop5 <----> hadoop6
					hadoop5/hadoop6 --> hadoop0 hadoop1 hadoop2
		*********************************************************************************************************************

三、初始化hadoop集群:

到此为止centos7minimal系统上的hadoop集群配置完成,下面就是初始化,然后完成了。hadoop初始化有顺序要求的,必须严格按照下面的顺序来初始化。
	1、启动zookeeper集群(开始初始化hadoop集群之前必须启动zookeeper集群):
		`/**(PATH)**/zookeeper-3.4.5/bin/ start   三台都启动`
		启动完后查看三个的状态:
			`/**(PATH)**/zookeeper-3.4.5/bin/ status   必须出现两个follower和一个leader才正确。` 
		启动journalnode服务:
			`hdfs --daemon start jornalnode  或者  /**(PATH)**/hadoop-3.1.1/sbin/ start journalnode`
	2、初始化hdfs:
		在namenode的任意一台主机上执行,按我配的来就是hadoop3 / hadoop4都行:
			`hdfs namenode -format`
		然后成功就会在/**(PATH)**/hadoop-3.1.1/下会生成一个tmp/目录,这时候需要保持两台namenode节点的fsimage一致,所以应该在另一台namenode机器(hadoop4 / hadoop3)上执行:
			`hdfs namenode -bootstrapStandby `
		还有一种方式也可以保持一致性,但是在大集群里不推荐使用:
			在已经初始化的namenode节点上用ssh的scp复制一份过去:
				`
				scp -r tmp/ NEXT_NAMENODE_IP:/**()PATH**/hadoop-3.1.1/
				我的指令就是
				scp -r tmp/ hadoop4:/usr/hadoop/hadoop-3.1.1/
				`
	3、初始化ZKFC:
		`hdfs zkfc -formatZK`
到此hadoop初始化完成。

4、启动hadoop集群:

1、启动zookeeper集群:(3中有方法,此处略)
2、启动hdfs:
	``
3、启动yarn:
	``
建议按照上述步骤启动,虽然在hdfs的启动里会包含启动journalnode服务,但是如果启动hdfs之前没有启动journalnode会产生一些问题,这个读者可以自行试试
错误大概就是你的namenode启动后没有active状态的或者更惨的就是直接两台namenode启动了两秒以后直接挂掉。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ hadoop集群至此已经全部部署好了,也就是可以跑了但是即使我把全部的东西写出来你自己区配的时候也会出现各式 各样的错误,此时应该怎么办?这就要靠各人去查看自己 hadoop-3.1.1/目录下的logs/文件夹下的各各启动项或者运行 项的log日志了(由于是全分布式集群,那么对enode节点莫名奇妙死了(无论是几个): 可以用命令 hdfs --daemon start namenode 启动,但是要注意是到配置namenode节点上的位置启动 2、namenode节点都是standby状态: 可以用指令 hdfs haadmin -transitionToActive --forceactive nn1/nn2 末尾参数是你想改变为active状态的namenode,只允许带一个。 3、终端直接调用 hdfs haadmin -getAllServerState 查看每个namenode节点状态。 4、单独启动一个zkfc进程: hdfs --daemon start zkfc 注意是在你需要zkfc进程的那台机器上启动 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

最后我想说一点,作为初学者最好别装hadoop3.1.1,因为后面有个内容是hbase对hadoop的兼容性很差,据我查看的文档显示是目前hadoop2.7以下的版本才有对hbase的支持,往上走都没人试过,也没文章寻觅,所以在最后我建议大家换个低版本大的,2.6左右就差不多了