虚拟机准备
- 安装Linux(我使用的是CentOS7,7之前的版本可能些许命令有差异)
** 因为后续一些Hadoop中的服务需要配置防火墙,所以安装完第一件事,关闭Linux的防火墙 **
虽然我们也可以配置防火墙的过滤表,但是我这里偷懒了,直接关掉。
systemctl status firewalld.service 先查看防火墙是否开启
systemctl stop firewalld.service 若开启则停止防火墙
systemctl disable firewalld.service 禁止防火墙自启 - 配置Linux的静态ip
/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="758ce58a-54f6-4c95-91df-c80d2a911a54"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.102.54
NETMASK=255.255.255.0
GATEWAY=192.168.102.1
将bootproto由dhcp改为static,并加上最后三行的配置,具体地址跟真实主机的ip配置在同一网段且ip不冲突即可。
虽然可以不这样配置静态ip,但后续我们是通过ssh协议远程连接Linux。如果是dhcp方式自动分配ip的话,那么可能多台Linux启动的时候,ip就会每次都不是固定的;设置了静态ip就不用这么麻烦了,我们启动Linux后,直接远程连接就行了。
- 配置Linux的hosts文件
/etc/hosts
192.168.102.52 realhost
192.168.102.53 hp100
192.168.102.54 hp101
192.168.102.55 hp102
192.168.102.56 hp103
我们搭建的是一个三台Linux服务器的简易集群,所以只需要配置hp101~hp103的地址就好了,另外配置的真实主机跟hp100是我安装完Linux测试用的。
-
克隆虚拟机
我们现在只有一台Linux服务器,还需要两台来搭建一个集群,再安装两次Linux太费时间了,克隆会更加省时。以vm为例:
右击我们已经安装好的Linux,选择 管理 => 克隆,一直下一步,克隆方式选择 完整克隆 ,然后选择克隆的虚拟机的存储位置即可完成虚拟机的克隆。
-
克隆Linux配置
我们完成克隆后,需要对克隆的两台Linux服务器,配置ip、主机名。
修改克隆Linux服务器的UUID、ip地址即可,它们三台服务器的这些地址都不能冲突。
修改主机名命令,hostnamectl set-hostname 要修改的主机名
或者可以修改/etc/hostname文件 (这种方法需要重启后生效)
完成后,我们可以直接使用hostname查看当前主机名
最后将三台Linux服务器reboot 重启,使它们的这些配置重新加载生效。
** 注意!!!三台Linux服务器的主机名都不可以有下划线等一些符号出现,如果后续启动hdfs等服务报错时,去日志查看即可,所以主机名命名更加严格!!! ** -
创建用户
useradd [-g] 用户名 -g为指定创建用户的组
passwd 用户名 为用户指定密码
同时我们还将给这个用户一些权限,修改/etc/sudoers文件
用vim编辑器打开,一般模式下在root用户那一行按yy复制,然后按p粘贴。修改复制的那一行的root为我们创建的用户即可完成对我们新创建用户的权限修改。
配置jdk
前置工作:
>卸载系统自带jdk
1>查看是否存在
rpm -qa | grep java
2>卸载jdk
rpm -e 软件包名 [ --nodeps ]
可选属性说明:忽略依赖删除包
>验证是否删除干净
使用命令 which java 查看
若提示找不到java则可以进行安装的工作
- 使用文件传输软件或者在远程连接时使用rz命令,在弹出的对话框中选择要上传的gz压缩包
需要注意的是,使用rz命令传输后的文件就处于当前路径下,所以想对系统文件整理规范,在使用命令前需要先切到专门存储软件安装包的路径下。 - 解压gz压缩包
使用命令 tar -zxvf gz压缩包名 [ -C 要解压到的路径]
进行gz压缩包的解压
** 这里我们将解压后的文件夹所有者跟所属组都改成我们创建的用户,我这里创建的用户是min,所以命令是 chown min:min jdk1.8.0_144,后面的Hadoop也是如此** - 配置环境变量
首先我们进入解压后的目录,使用pwd命令复制当前绝对路径
例如:
[min@hp101 jdk1.8.0_144]$ pwd
/opt/software/jdk1.8.0_144
修改/etc/profile文件
一般模式下按大写G直接跳到文档末尾
追加如下配置,将前面复制的jdk的路径粘贴,尽量不要手打,容易出错
然后按esc键切到命令模式,输入 :wq 保存并退出
但是这样子系统不会立即加载我们刚刚做的配置
我们可以使用命令source /etc/profile让Linux重新加载配置
然后试着使用命令 java -version 验证jdk是否配置成功
或者reboot重启 重启太麻烦了,我们一般使用第一种方法
# JAVA_HOME
JAVA_HOME=/opt/software/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
配置Hadoop
Hadoop的配置与jdk步骤基本一致
为了后续启动服务的方便,我们这里也将Hadoop的sbin目录也一起配置了
命令模式下 :wq 保存并退出,使用命令source /etc/profile 加载配置
使用 hadoop version 查看Hadoop是否配置成功
ps:
1.hadoop version中Hadoop的大小写问题
2.我个人学习的Hadoop版本为2.7.2
#HADOOP_HOME
HADOOP_HOME=/opt/software/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
集群配置
- 集群规划部署
** 注意!!!!!!!!!namenode与secondarynamenode尽量不要配置在一个服务器上,因为假设当前服务器namenode可使用64G,那么配置了secondarynamenode以后,namenode仅可使用32G,secondarynamenode要分走一半内存。** - 配置集群
** 配置文件基本都在安装路径下的etc/hadoop下 **
1>核心配置文件
** core-site.xml **
<!-- 指定HDFS中Name Node地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hp101:9000</value>
</property>
<!-- Hadoop运行时产生的临时文件存储地址 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/software/hadoop-2.7.2/data/temp</value>
</property>
2>HDFS配置文件
hadoop-env.sh 配置Hadoop的JAVA_HOME
# The java implementation to use.
export JAVA_HOME=/opt/software/jdk1.8.0_144
hdfs-site.xml
<!-- 配置集群的副本数量,虽然默认就是3(官网可查) -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 配置集群的辅助名称结点 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hp103:50090</value>
</property>
3>Yarn配置文件
yarn-env.sh 配置JAVA_HOME
# some Java parameters
export JAVA_HOME=/opt/software/jdk1.8.0_144
yarn-site.xml
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 配置yarn的ResourceManager -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hp102</value>
</property>
4>配置MapReduce
mapred-env.sh 配置JAVA_HOME
export JAVA_HOME=/opt/software/jdk1.8.0_144
配置mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
在mapred-site.xml中写配置
<!-- 指定MR运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
做完这些配置后,将集群的另外两台服务器也需要做相同配置,可以通过替换等方式实现,也可以
用脚本,我将它们放在文末。
-
ssh无密登录配置
前置工作:我们需要使用ssh命令连接一下其他服务器家目录下才会有.ssh这个文件夹,例如在 hp101上 ssh hp102 后,hp101的家目录下就会有.ssh这个文件夹,用 ls -al命令可查看。 快速回到家目录使用cd命令,直接回车。进入.ssh文件夹,使用ssh-keygen -t rsa命令然后连 按三次回车(加上输完命令后的那个回车是连按四个),生成公钥和私钥。然后我们将公钥拷贝到要 无密登录的服务器上。 ssh-copy-id hp101 ssh-copy-id hp102 ssh-copy-id hp103 我们是在101这台服务器上生成的公钥,但是我们也要给它自己拷贝一份,否则使用ssh连接的 时候,也是会提示我们需要输入密码,所以也需要给101它自己拷贝一份自己的公钥。 注意: 我们需要切换到101的root用户,按上述的步骤配置无密登录到101、102、103 同时也需要在102上,对三台服务器做无密登录配置 说明: 因为集群服务器多了以后,我们总不至于一台一台手动启动,这样很不现实。所以我们要 一键式启动集群,第一步就是要做这个无密登录。 然后这个无密登录的原理,就是非对称加密类似的思想。
-
群起集群
1>配置slaves
hp101
hp102
hp103
需要对101、102、103都做该配置
该配置文件不能有多余的空行,文件尾也不能有空格,配置的名称也不允许出现空格!!!
2>启动集群
如果是第一次启动集群,需要格式化NameNode,使用jps命令查看当前启动服务。若只有jps服务,
则可以进行下一步,否则需要停止这些服务,并检查安装路径下是否有data文件夹跟logs文件夹,如果存
在,则需要删除。
rm -rf data/ logs/
在一切就绪以后,在101上初始化NameNode,
bin/hdfs namenode -format
启动HDFS
sbin/start-dfs.sh
使用jps命令查看各个机器是否符合我们集群规划部署那张图
启动yarn
sbin/start-yarn.sh
注意:yarn的启动应该在ResourceManager配置的服务器上启动,我们当前给它配置在了102,所
以我们需要在102上启动yarn。
此时集群启动完成。
我们可以在浏览器中输入hp103:50090查看SecondayNameNode信息
hp101:50070查看NameNode信息
-
集群基本测试
1>上传文件 hdfs dfs -mkdir -p /user/min/input 这里创建的多级文件夹可自己命名 hdfs dfs -put hello.java /user/min/input -put后跟的就是要传到hdfs服务的文件 然后在http://hp101:50070/explorer.html就能看到hdfs我们上传的内容,点击上传的文件 我们在最后的Availabity应该是可以看到有hp101~hp103三个服务器的主机名的 如若不能,尝试关闭三台服务器的防火墙后,把当前服务都关掉重启集群 2>hdfs在本机存储的位置 安装路径下的data文件夹下,这个由我们在上面的配置文件决定 3>下载 bin/hadoop fs -get 要从hdfs上下载的文件 指定下载到本机的位置
-
集群启动/停止方式
前提:配置了ssh 1>hdfs群起/停止 start-dfs.sh / stop-dfs.sh 2>yarn群起/停止 start-yarn.sh / stop-yarn.sh
写在文末
文中有些许之处可能不是很合理,比如101在配置完ip、hosts文件、jkd环境跟Hadoop环境后再进行虚拟机的克隆会更加合理一点,不然就要进行多次安装配置。然后其中三台服务器写配置时,没有脚本进行同步配置,也是不合理的。
同步集群配置脚本:
在101上cd回到家目录
mkdir bin
cd bin/
vim xsync编写同步脚本如下
要想这个脚本实现效果,我们在命名主机名的时候就要有些许相似点,比如我的命名是
hp101、hp102、hp103
然后修改脚本的权限
chmod 777 xsync
xsync /home/min/bin 将该脚本同步给另外两个服务器测试是否成功
#!/bin/bash
#1 get the paraments, if not have , exit
pcount=$#
if((pcount==0))
then
echo "no args"
exit
fi
#2 get the file name
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 get the absolute path of parent
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 get the current user
user=`whoami`
#5 loop
for((host=102;host<104;host++))
do
echo -------- hp$host --------
rsync -rvl $pdir/$fname $user@hp$host:$pdir
done
最后,文中若还有哪些不足之处,还望路过的大佬积极指出。plz.