目录
搭了几次集群后,从什么都不懂到懂了点皮毛,有了些心得体会,写在前面,不一定对但我是这么理解的:
- master = Namenode + SecondaryNamenode
- slave = Datanode
- 每个slave节点都要保证能与master相互免密SSH连接,但slave节点之间无所谓
- 其实不管是master节点还是slave节点,它们的配置都可以是一样的,只是后期确定一个master,让所有的slave都能与其互通,然后格式化namenode,这样它逻辑上就是master了。所以只需要配置一台虚拟机当master,之后需要几个slave就克隆几台就行了,只不过需要改一些配置。(不想克隆的话把配置好了的hadoop文件夹远程复制到slave上,再配一下环境变量和hosts)
- 我有两台云服务器,原来幻想着建一个虚拟机当master,把那两台服务器当slave,后来发现太天真了,slave和master之间必须能够相互访问、传数据,而云服务器连本地主机IP都ping不通,怎么集群?所以应该是不能把云服务器和虚拟机混用的。
- 需要配置的地方:/etc/sysconfig/network-scripts/ifcfg-ens33(配IP)、jdk、hadoop/etc/hadoop、hadoop/tmp(自建)、/etc/profile、/etc/hosts、~/.ssh(免密登录)、防火墙
- 本次集群环境:
VMware Workstation Pro 14、CentOS 7、jdk1.8.0_161、hadoop-2.10.0
下面记录一下配置搭建过程,首先配master,打开Vmware14,装一台全新的CentOS 7,我推荐装最简版,之后需要什么功能才下载,不然太臃肿了。安装过程省略,用root登录
配置IP
用以下命令查看和配置本机IP,保证和主机互ping通
ip addr
vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=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=795a782a-9240-4230-95fc-bcc33bdbbd97
DEVICE=ens33
ONBOOT=yes (这里)
(下面按自己情况)
IPADDR=192.168.117.101
NETMASK=255.255.255.0
GATEWAY=192.168.117.2
DNS1=114.114.114.114
ZONE=public
重启服务:
systemctl restart network.service
改主机名,配置hosts文件
其实主机名改不改无所谓,hosts改了就行了,但为了便于区分,每台节点的主机名还是改一下吧。
改主机名:
hostnamectl set-hostname master
执行完之后发现并没有变,其实已经改了
重启一下或者重连一下SSH就会变了
配置hosts:
vi /etc/hosts
自己需要几个节点就配几个,之后如果还加节点的话,那master上的hosts也要更新
关闭防火墙
这一步很重要,不关的话会出现很多问题
systemctl stop firewalld.service
systemctl disable firewalld.service
安装JDK
把网上下载的jdk-8u161-linux-x64.tar.gz文件传到/usr/local/java
目录下,这个目录随意。进到目录后,解压即可:
tar -zxvf jdk-8u161-linux-x64.tar.gz
环境变量之后和Hadoop一起配。
安装Hadoop
与JDK类似,把网上下载的hadoop-2.10.0.tar.gz文件传到/usr/local
目录下,进目录之后解压:
tar -zxvf hadoop-2.10.0.tar.gz
改名:(为了方便)
mv hadoop-2.10.0 hadoop
配置环境变量
执行以下命令:
vi /etc/profile
在文件的最后加上以下配置:(根据自己路径)(这个配置可能有些不优美但绝对没错)
export JAVA_HOME=/usr/local/java/jdk1.8.0_161
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/usr/local/hadoop/
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
更新环境变量:
source /etc/profile
验证:
java -version
配置Hadoop文件
进入Hadoop的配置目录
cd /usr/local/hadoop/etc/hadoop
可以看到有许多配置文件,一个一个配置
- hadoop-env.sh
将文件靠前面的
export JAVA_HOME=${JAVA_HOME}
中的${JAVA_HOME}改成自己的Java路径
- yarn-env.sh
将文件靠前面的
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
前的 # 去掉,然后改成自己的Java路径
- core-site.xml
用下面的代码替换<configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> </property> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> </configuration>
- hdfs-site.xml
用下面的代码替换<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>
- yarn-site.xml
用下面的代码替换
这里端口号不是死板的。<configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>master:18040</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:18030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:18025</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:18141</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:18088</value> </property> </configuration>
- mapred-site.xml
一开始是没有这个文件的,需要从它给的模板复制一个:
cp mapred-site.xml.template mapred-site.xml
用下面的代码替换<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
- slaves
打开后,有几个从节点就写几个,名字必须和hosts里的一致,我这里的是slave和slave2,slaves文件只对master节点有用,如果新增从节点的话,这个文件也要改。
新建Hadoop数据目录
添加 hdfs-site.xml 文件里配置的并不存在的数据目录:
目录结构是这样的:
/usr/local/hadoop/tmp
/usr/local/hadoop/tmp/dfs
/usr/local/hadoop/tmp/dfs/data
/usr/local/hadoop/tmp/dfs/name
高亮的是新建的目录。
至此,一台master节点的全部配置就完成了,接下来slave想克隆几台就克隆几台,我这里克隆了两台,距离分布式集群完全完成还差:配克隆后IP、配免密登录
克隆虚拟机
关闭master
右键master虚拟机 --> 管理 --> 克隆
根据克隆向导一路继续,注意,一定要选 创建完整克隆!
配置克隆后的IP
这里跟前面配IP的方法一样,就不赘述,但是一定要保证每一台slave的主机名和IP与master节点里hosts文件里的主机名和IP 保持一致。
配置SSH免密登录
这一步也很重要,不配的话每次都要输密码,过于麻烦也不现实。
配置免密登录基本原理就是,把自己的公钥(一串字符串)复制到别人的authorized_keys文件里,当一个主机要SSH连接另一个主机时,如果本机的authorized_keys文件存有那个主机的公钥,那么就不需要输密码,否则,就连主机SSH自己都要输密码。所以,我们的目的就是:
- 让master节点自己对自己、自己对所有slave免密
- 让每一台slave节点都自己对自己、自己对master免密
首先进入master,以root登录。
密钥和authorized_keys的所在目录是~/.ssh
下面,但初次配置会发现没有这个目录,这时我们只需随意SSH登录一个节点,再退出来就会出现这个目录了。
进入cd ~/.ssh
执行ssh-keygen -t rsa
生成密钥(连按3次回车),
对自身免密ssh-copy-id master
对所有从节点免密ssh-copy-id slave
,依次执行对slave2、slave3等等,这个命令其实就是自动把公钥复制到指定主机的authorized_keys文件中去。
然后分别进入几个从节点,进行类似的操作。
这时候从节点已经有~/.ssh
目录了,进入后执行ssh-keygen -t -rsa
命令,
用ssh-copy-id
命令分别对自己、对master进行免密。
可以验证,如果免密成功,SSH另一个主机是不需要密码就能登录的。
启动Hadoop集群
至此,完全分布式集群的所有配置就大功告成了,满怀着激动的心情启动吧!
这时所有的节点必须开机!
首先要在master节点上进行格式化:
hdfs namenode -format
看到这句话就说明格式化成功了(当然这句话有时候并不能说明什么~_ ~)
启动Hadoop!
start-all.sh
启动好了之后,分别在所有节点执行jps命令以验证成功与否:
当master节点为:
slave节点都为:
就说明运行成功了。
进一步验证
在宿主机浏览器上输入:
(master的IP地址):50070
看到:
将50070改为18088:
就大功告成了!
关闭集群:
stop-all.sh
特别注意
- 如果集群启动后,jps命令给出的结果与正确的不符,比如少了一个或多了一个,那么大多就需要重新格式化,重新格式化不是再执行一遍
hdfs namenode -format
那么简单,需要把所有节点下的/usr/local/hadoop/tmp
目录的结构按照上面说到的方式重新建立,即把之前的都删了,重新建文件夹。(重建之前记得关闭集群)
之后再格式化、启动。 - 如果启动后,在宿主机上无法访问虚拟机IP及端口,可能是虚拟机防火墙没关,也可能是宿主机的防火墙规则设置问题。