搭建集群的模式有三种

1.伪分布式:在一台服务器上,启动多个线程分别代表多个角色(因为角色在集群中使用进程表现的)
	2.完全分布式:在多台服务器上,每台服务器启动不同角色的进程,多台服务器构成集群
	3.高可用的完全分布式

这篇文章是对完全分布式集群的搭建,采用的是centOS6.5版本的系统

我使用了四台虚拟机,暂且称为node1,node2,node3,node4;

1.首先需要修改静态IP

1.因为我们一般是用远程连接来操作每台虚拟机,而不设置静态IP会导致你连接中途,因为IP动态获取,导致IP地址更换,从而导致远程连接
	断开
	2.操作:
		 修改:/etc/sysconfig/network-scripts/ifcfg-eth0
		vim /etc/sysconfig/network-scripts/ifcfg-eth0

hadoop 分布式集群 重启 hadoop集群完全分布式搭建_hdfs


.

2.修改主机名以及IP地址与主机名的映射

1.Linux系统安装好后,都会有默认的主机名,我们可以根据自己的需要更改为自己想要的名字。
	2.当在hosts文件中完成映射以后,不必输入IP直接输入映射的名字,此时映射的名字等价于IP,在这里需要在每台虚拟机
	中的hosts文件中声明所有的映射.

设置完需要重启生效

vim /etc/sysconfig/network
	HOSTNAME=XXX	
vim /etc/hosts

hadoop 分布式集群 重启 hadoop集群完全分布式搭建_hadoop_02


.

3.ssh无密码登陆

1.我们假设node01为namenode节点,那么他需要通过SSH(Secure Shell)来启动和停止各个节点上的各种守护
	进程的,这就需要在节点之间执行指令的时候是不需要输入密码的方式,故我们需要配置SSH使用无
	密码公钥认证的方式
    2.在所有的虚拟机上利用rsa算法生成各自的公钥和私钥
	3.我们要实现namenode无需密码即可登陆其他三台虚拟机,所以需要将node01的公钥存储在其余三台机器的cd ~/.ssh/authorized_keys中

以下操作完成免密登陆:

所有节点上运行
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
node1(namenode节点上运行)
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node01
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node02
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node03
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node04

.

4.jdk的安装

每台虚拟机都需要安装jdk的运行环境:

yum remove *openjdk*
tar -zxvf jdk-8u151-linux-x64.tar.gz(这里用你自己的)
vim /etc/profile
	export JAVA_HOME=/opt/software/jdk1.8.0_151
	export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
java -version

.

5.集群的时间同步

1.由于Linux服务器运行时间久了,会造成时间的误差,需要配置时间同步。
2.网络时间协议(Network Time Protocol, NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟、GPS等等)做
同步化
3.若各个虚拟机时间不同步。差别太大,可能会判断某个命令无效

每台虚拟机上运行:

yum install ntp
ntpdate ntp1.aliyun.com

.

6.hadoop配置的修改

6.1修改hdfs-site.xml配置文件

<!-- 指定HDFS副本的数量 -->
<property>
        <name>dfs.replication</name>
        <value>3</value>
</property>
<property>   
  <!-- 指定secondaryNameNode -->
 <name>dfs.namenode.secondary.http-address</name>
     <value>node02:50090</value>
</property>

6.2修改core-site.xml配置文件

<property>
 <!-- 指定HADOOP所使用的文件系统schema(URI),HDFS的老大(NameNode)的地址 -->
        <name>fs.defaultFS</name>
        <value>hdfs://node01:9000</value>
</property>
 <!-- 指定hadoop运行时产生临时文件的存储目录 -->
<property>
        <name>hadoop.tmp.dir</name>
        <value>/var/abc/hadoop/local</value>
</property>

6.3修改slaves配置文件

<!-- 这是告诉hadoop进程哪些机器是从节点,必须竖着写,不能有空格,否则会无法识别 -->
node02
node03
node04

6.4hadoop-env.sh的Java_home修改

sudo vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh


# 修改JAVA_HOME的环境配置为如下所示:

export JAVA_HOME=/opt/software/jdk1.8.0_151

.

7.hadoop环境变量的修改

只需要修改namenode上的即可

cd ~
vim .bashrc
	export HADOOP_HOME=/opt/software/hadoop-2.6.5
	export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source .bashrc

将配置好的hadoop包发送至每个虚拟机

cd /opt/software
scp -r hadoop-2.6.5 node02:`pwd`

.

8.启动

1.关闭所有HDFS相关进程
	2.格式化namenode
	3.启动hdfs
stop-dfs.sh
hdfs namenode -format
start-dfs.sh

成功启动后可用jps命令查看当前虚拟机的进程从而得知他属于什么角色

可以用网页来查看当前hdfs的详情,若想用物理机来访问此页面,需要将上述几个虚拟机的防火墙关闭

chkconfig iptables off 关闭防火墙(重启后永久生效)

service ipables status 查看防火墙状态

service ipables status 停止防火墙(不永久生效)

hadoop 分布式集群 重启 hadoop集群完全分布式搭建_hdfs_03


.

9.总结遇到的问题

1.在格式化之前必须停止所有HDFS相关的进程 stop-dfs.sh
	2.启动集群后出现问题纠错后必须严格按照以下步骤重新启动:
			--.停止所有节点(关闭他们的进程)
			--.删除节点生成的cluster文件
			--.格式化namenode
			--.开启hdfs
	3.关闭所有节点的防火墙
	4.配置好静态IP
			--不设置时,远程连接中途,若动态IP改变,则会导致连接中断。
	5.配置好主机名映射关系(hosts文件),hosts文件内容不要随便删除
			--hosts文件内容被删除会造成启动hdfs后存活节点为0的情况
			--主机名与IP映射不对时,会造成运行hdfs时无法打开对应节点(因为找不到)
	6.配置好jdk,因为centOS6.5有默认的jdk1.6和1.7,删除后安装自己的