赞
踩
总的来说,配置集群的步骤为:配置模板机 -> 克隆虚拟机 -> 配置完全分布式运行模式
其中:
配置模板机:新建虚拟机并配置root用户和主机名 -> 配置IP地址、设置hosts文件 -> 安装epel-release -> 测试网络 -> 关闭防火墙及其自启动 -> 安装jdk和hadoop
克隆虚拟机:克隆虚拟机 -> 更改主机名和IP地址
配置完全分布式运行模式:配置ssh免密登录 -> 编写集群分发脚本xsync -> 集群配置 -> 群起集群 -> 测试集群 -> 配置历史服务器 -> 配置日志的聚集 -> 编写群起集群脚本myhadoop.sh和查看所有节点jps脚本jpsall
以上内容是配置集群的大致步骤,接下来是详细的配置过程。
学习hadoop之前我们应该具备了一定的Linux基础,创建虚拟机其实可以沿用之前的配置。所以这部分没啥好说的,只需注意别安装最小系统版的Linux,选择一个图形化界面即可。然后在创建的过程中设置好root用户的密码,不用创建别的用户了,因为我们将全程使用root用户,这将为以后避免许多不必要的麻烦。同时配置好主机名,我将这台模板机命名为hadoop102,102将设置成这台虚拟机ip地址的尾号,这样我们可以做到看见机器名字就能知道它的ip地址是什么,将为我们带来很大的便利。
配置IP地址:
使用命令vim /etc/sysconfig/network-scripts/ifcfg-ens33
,将其中的BOOTPROTO
改为static
,如果不这样设置则会出现ifcfg-ens33文件中的ip地址与使用ifconfig
命令查看的ip地址不一样的情况。
然后在最下面添加以下内容:
#IP地址
IPADDR=192.168.17.102
#网关
GATEWAY=192.168.17.2
#域名解析器
DNS1=192.168.17.2
然后保存退出即可。
**配置hosts文件:**模板机和本地机器都要配置hosts文件,这样就可以直接使用主机名来访问别的节点了,不再需要敲冗长且容易记错的IP地址。而本地机器也需要配置hosts的原因是,配置好后我们就可以在使用xshell、xftp以及浏览器时可以直接输入主机名代替输入ip地址,更便利且不易出错。
模板机:
使用命令vim /etc/hosts
打开hosts文件后,添加以下内容:
192.168.17.100 hadoop100
192.168.17.101 hadoop101
192.168.17.102 hadoop102
192.168.17.103 hadoop103
192.168.17.104 hadoop104
然后保存退出。
我打算用hadoop102、hadoop103和hadoop104这三台虚拟机搭建集群,所以hosts文件只写到了hadoop104,以后若是有别的机器加入那么只需要再添加对于的IP地址和主机名即可。
本地机器:
Windows11系统的hosts文件的路径为:C:\Windows\System32\drivers\etc\hosts
,找到后直接复制到桌面上,然后重命名在后面加上".txt"后缀方便我们用打开并修改其中的内容。用文本编辑器打开后再最下面加上与模板机相同的内容,保存退出。再将后缀删去,复制到原地址中,选择"替换目标中的文件"即可。
在联网的情况下输入命令yum install -y epel-release
就能安装好了。
注:Extra Packages for Enterprise Linux是为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux。相当于是一个软件仓库,大多数rpm包在官方 repository 中是找不到的。
我们需要测试虚拟机能否连接外网和本地机器。
我们需要使用伟大的命令:ping
外网:输入ping www.baidu.com
看看能不能ping通。
本地机器:在自己电脑的命令行上输入ipconfig
查看ip地址,然后在模板机上ping一下,看看能不能ping通。
如果都能ping通那就没问题,否则需要上网寻找相关方法来解决这个问题。
为了我们能正常访问集群配置好后的各种web页面,我们需要先将防火墙关闭。
关闭防火墙:systemctl stop firewalld
关闭防火墙自启动:systemctl disable firewalld.service
注:在企业开发时,通常单个服务器的防火墙是关闭的,公司整体对外会设置非常安全的防火墙。
在安装jdk和hadoop前,我们需要先将虚拟机自带的jdk删除干净,然后再安装自己的jdk和hadoop。最后我们需要配置环境变量,以便我们在任何情况下都能直接使用java和hadoop命令。
卸载虚拟机自带的jdk:
使用命令rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
。
其中各项参数为:
rpm -qa:查询所安装的所有rpm软件包
grep -i:忽略大小写
xargs -n1:表示每次只传递一个参数
rpm -e –nodeps:强制卸载软件
注:卸载完后记得使用reboot
命令重启虚拟机。
安装jdk和hadoop:
先在/opt目录下创建module和software目录,其中software用来存放jdk和hadoop的压缩包,module用来存放jdk和hadoop。
先进入software目录,然后使用xftp连接模板机并将jdk和hadoop的压缩包传输给模板机。接着使用命令tar -zxvf jdk-8u371-linux-x64.tar.gz -C /opt/module/
将jdk解压至module目录,再使用命令tar -zxvf hadoop-3.3.6.tar.gz -C /opt/module/
将jdk解压至module目录。
配置环境变量:
首先新建my_env.sh文件vim /etc/profile.d/my_env.sh
然后添加以下内容:
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_371
export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.3.6
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
保存退出后用命令source /etc/profile
,让新的环境变量PATH生效。
接着回到主目录分别使用java -version
和hadoop -version
测试环境变量是否配置成功,有结果、能看见他们的信息就是配置成功了,且配置成功后输入开头的几个字母可以按tab键自动补全。
此外,可以通过运行本地运行模式(官方WordCount)来检测是否成功安装jdk和hadoop:
在hadoop-3.3.6下创建文件夹input,再在里面创建word.txt文本文件并输入几个单词,然后退回hadoop-3.3.6目录,使用命令:hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount input/ output
。
运行成功的情况下可以看见多了output目录,进入后发现里面有两个文件:part-r-00000和_SUCCESS,part-r-00000就是对word.txt进行单词数统计得出的结果。
将模板机关机后(注意一定要先关机!)克隆出剩下的虚拟机。我打算用三台虚拟机搭建集群,所以我克隆了另外两台。
分别对每一台克隆出来的虚拟机进行更改对应的主机名和ip地址的操作。
更改主机名:vim /etc/sysconfig/network-scripts/ifcfg-ens33
,只需要将inet这一行的ip地址修改就行了,其余不用动。
更改ip地址:vim /etc/hostname
操作完后直接reboot
重启。
配置ssh免密登录是后面所有脚本运行的基础(指方便快捷,因为不再需要输一堆密码),所以我们一上来就先将其配置好。
免密登录的原理:
总而言之,我将我的公钥发给别人后就代表:我要免密登录你了。所以我们接下来需要生成公钥和私钥,再拷贝给其他的所有节点。
生成公钥和私钥:
按cd
回到主目录然后cd .ssh
进入.ssh目录,再输入ssh-keygen -t rsa
后连续按三次回车,就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)。
将公钥拷贝到要免密登录的目标机器上:
使用命令ssh-copy-id 主机名
将公钥发给每一个节点,**包括自己!!!**对我来说就是ssh-copy-id hadoop102
、ssh-copy-id hadoop103
、ssh-copy-id hadoop104
各输一遍,然后挨个输入密码。
然后对剩余的每一个节点都这么操作(此时就是拼手速的时候了)。
千万千万别落下了自己!!!这很重要!!
注:.ssh目录中的 known_hosts 记录ssh访问过计算机的公钥(public key),id_rsa 是生成的私钥, id_rsa.pub 是生成的公钥,authorized_keys 存放授权过的无密登录服务器公钥。
在编写xsync脚本前我们需要先学习两个命令:scp和rsync。
scp(secure copy)安全拷贝:
定义:scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)
基本语法:scp -r p d i r / pdir/ pdir/fname u s e r @ user@ user@host: p d i r / pdir/ pdir/fname
命令 递归 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
例:scp -r /opt/module/jdk1.8.0_371 root@hadoop103:/opt/module
可以将本节点上的jdk拷贝给登录root用户的hadoop103的/opt/module。
rsync远程同步工具:
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
基本语法:rsync -av p d i r / pdir/ pdir/fname u s e r @ user@ user@host: p d i r / pdir/ pdir/fname
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
选项参数说明:
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新,scp是把所有文件都复制过去。
注意:rsync是同步!!什么是同步,若我的机器有别的机器没有的,那么rsync给它后他也就有了一份一模一样的,连文件路径都一样。即如果我rsync对方没有的文件,就相当于scp,即拷贝。若我rsync对面有的文件且进行了修改,那么只会更新对方的该文件至和我相同,此时是更新!!若完全一样那就不进行任何操作。所以假如我删了某个目录中的某些文件,再rsync这一整个目录,不会让对方的目录的目录减少相同的文件。即更新只会令文件数量增多或保持不变,不可能让文件数量变少。
xsync集群分发脚本:
xsync相当于对其他所有节点依次使用rsync命令。因为rsync即具备scp的复制文件作用,又具备更新相关文件的作用,所以我们没有必要使用scp命令了,它的功能已经完全被rsync所代替。故我们使用xsync就能将本节点的某些文件直接同步至其余所有节点(无论对方是有还是没有),且由于我们前面配置好了ssh免密登录,故分发文件只需要使用xsync这一个命令即可,非常的好用,非常的便捷。
此外我们希望随时随地都能使用这个命令,所以应该将脚本放在声明了全局环境变量的路径。
我们使用echo $PATH
就能看见所有声明了全局环境变量的路径:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/module/jdk1.8.0_371/bin:/opt/module/hadoop-3.3.6/bin:/opt/module/hadoop-3.3.6/sbin:/home/sunhao/bin:/root/bin。可以发现路径/root/bin是其中之一,故我们决定将脚本放在这个路径。
在主目录中用mkdir bin
新建bin目录,然后进去,再vim xsync
新建xysnc文件,输入以下内容:
#!/bin/bash #1. 判断参数个数 if [ $# -lt 1 ] then echo Not Enough Arguement! exit; fi #2. 遍历集群所有机器 for host in hadoop102 hadoop103 hadoop104 do echo ==================== $host ==================== #3. 遍历所有目录,挨个发送 for file in $@ do #4. 判断文件是否存在 if [ -e $file ] then #5. 获取父目录 pdir=$(cd -P $(dirname $file); pwd) #6. 获取当前文件的名称 fname=$(basename $file) ssh $host "mkdir -p $pdir" rsync -av $pdir/$fname $host:$pdir else echo $file does not exists! fi done done
注意:要先按 i 进入编辑模式再粘贴,不能直接粘贴!在普通模式下粘贴会出错!
保存退出后,使用chmod 777 xsync
修改脚本权限,再分发脚本xsync xsync
。
集群部署规划:
NameNode和SecondaryNameNode很消耗内存,不要安装在同一台服务器上。
ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。
配置文件:
我们需要先配置存放在$HADOOP_HOME/etc/hadoop这个路径上的core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、workers五个配置文件。
core-site.xml:
cd /opt/module/hadoop-3.3.6/etc/hadoop/
进入hadoop目录后,vim core-site.xml
进入core-site.xml,在<configuration>
和</configuration>
之间插入以下内容:
<!-- 指定NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop102:8020</value> </property> <!-- 指定hadoop数据的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-3.3.6/data</value> </property> <!-- 配置HDFS网页登录使用的静态用户为root --> <property> <name>hadoop.http.staticuser.user</name> <value>root</value> </property>
hdfs-site.xml:
vim hdfs-site.xml
进入hdfs-site.xml,在<configuration>
和</configuration>
之间插入以下内容:
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
yarn-site.xml:
vim yarn-site.xml
进入yarn-site.xml,在<configuration>
和</configuration>
之间插入以下内容:
<!-- 指定MR走shuffle --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定ResourceManager的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop103</value> </property> <!-- 环境变量的继承 --> <property> <name>yarn.nodemanager.env-whitelist</name> <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value> </property>
mapred-site.xml:
vim mapred-site.xml
进入mapred-site.xml,在<configuration>
和</configuration>
之间插入以下内容:
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
workers:
vim workers
进入workers,删除原本的那一行话,再添加以下内容:
hadoop102
hadoop103
hadoop104
注意:这里是将每一行都当做主机名了,所以名字的后面不能留有空格,最后一行不能有单独的空行,否则会将这个空行当做主机名称,从而出现错误。
五个文件全都配置好后,在集群上分发hadoop配置文件:cd ..
回退至上一级目录etc,然后xsync hadoop
。
如果是第一次启动集群,那么需要先在hadoop102节点格式化NameNode,然后再启动hdfs和yarn。之后则不需要进行初始化操作。
初始化:
使用命令:hdfs namenode -format
正常情况下会多出data和logs这连个目录,若缺少其中任何一个则说明有问题,此时需要检查core-site.xml文件有没有复制错。
注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的data和logs目录,然后再进行格式化。
启动集群:
首先,我们使用root用户不能直接调用start-dfs.sh
,会报错。因为这是hdfs的保护机制,root的权力太大了,用root启动集群可能造成某些不可挽回的问题,所以hdfs默认禁止使用root用户启动集群。
此时我们需要修改hadoop安装目录下的 etc/hadoop下的 hadoop-env.sh文件,直接在开头添加以下内容:
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
export HDFS_SECONDARYNAMENODE_USER=root
保存退出再分发:xsync hadoop-env.sh
然后就可以在hadoop102使用命令:start-dfs.sh
。正常情况下,在hadoop102使用jps会出现jps、datanode和namenode,在hadoop103使用jps会出现datanode和jps,在hadoop104使用jps会出现secondarynamenode、datanode和jps。
接着在hadoop103使用命令:start-yarn.sh
。正常情况下,在每个节点使用jps都会出现四个进程,其中有三个是一样的:jps、datanode和nodemanager。然后剩下的一个,hadoop102为namenode,hadoop103为resourcemanager,hadoop104为secondarynamenode。
至此,集群启动成功。
注意:千万要记住,dfs是在hadoop102上启停的,yarn是在hadoop103上启停的!!!不然会报错!
首先打开浏览器在地址栏分别尝试进入:hadoop102:9870、hadoop103:8088。其中hadoop102:9870为Namenode information,hadoo103:8088为All Applications。
接着在集群创建文件夹:hadoop fs -mkdir /input
上传小文件:hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input
上传大文件:hadoop fs -put /opt/software/jdk-8u371-linux-x64.tar.gz /
由于yarn是管理资源的分配和调度的,所以需要计算时才会显示任务。
我们可以采用官方的wordcount案例来切身体会一下:
使用命令:hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /input /output
,在计算过程中我们切换至hadoo103:8088页面,可以发现多了一个任务,而这个任务正是wordcount。
HDFS文件的存储路径为:/opt/module/hadoop-3.3.6/data/dfs/data/current/BP-697859437-192.168.17.102-1688800644759/current/finalized/subdir0/subdir0
且一共有三个备份,每个节点都存放着相同的文件。
查看的文件内容:cat blk_...
可以使用t查看没有后缀的文件。
拼接文件:cat blk_... >> temp.tar.gz
可以将多个文件追加进同一个压缩包中,解压后就能看见存放的是什么了。
为了查看程序的历史运行情况,所以需要配置一下历史服务器。
配置mapred-site.xml:
vim mapred-site.xml
打开mapred-site.xml文件后,在<configuration>
和</configuration>
之间插入以下内容:
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
之后分发配置:xsync mapred-site.xml
启动历史服务器:
在hadoop102上使用命令:mapred --daemon start historyserver
之后用jps查看是否成功启动,若成功启动则会增加一个进程:JobHistoryServer。
我们也可以在网页上进行查看:在浏览器进入hadoop102:19888,即JobHistory。之后的所有任务都会在历史服务器上保存,只要开启了。
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
配置yarn-site.xml:
vim yarn-site.xml
打开yarn-site.xml文件后,在<configuration>
和</configuration>
之间插入以下内容:
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
之后分发配置:xsync yarn-site.xml
关闭NodeManager 、ResourceManager和HistoryServer:
在hadoop103上调用:stop-yarn.sh
在hadoop102上调用: mapred --daemon stop historyserver
启动NodeManager 、ResourceManager和HistoryServer:
在hadoop103上调用:start-yarn.sh
在hadoop102上调用: mapred --daemon starthistoryserver
测试:
此时我们再次执行wordcount:hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output2
运行完毕后就能在hadoop102:19888上查看历史任务,然后点击logs查看日志。
我们可以采用整体启动/停止hdfs和yarn,也可以单独启动/停止hdfs和yarn的组件(hdfs的组件是namenode、datanode和secondarynamenode,yarn的组件是resourcemanager和nodemanager)。
整体启动/停止HDFS:start-dfs.sh/stop-dfs.sh
整体启动/停止:start-yarn.sh/stop-yarn.sh
单独启动/停止HDFS组件:hdfs --daemon start/stop namenode/datanode/secondarynamenode
单独启动/停止YARN组件:yarn --daemon start/stop resourcemanager/nodemanager
我们在启动集群时需要在不同的节点上使用不同的命令,这样就很麻烦。我们更希望在某一台机器上使用一个命令就能将集群启动起来,所以我们来编写集群脚本myhadoop.sh。
我们将脚本放在主目录下的bin目录中,cd /root/bin
然后vim myhadoop.sh
新建myhadoop.sh文件,输入以下内容:
#!/bin/bash if [ $# -lt 1 ] then echo "No Args Input..." exit ; fi case $1 in "start") echo " =================== 启动 hadoop集群 ===================" echo " --------------- 启动 hdfs ---------------" ssh hadoop102 "/opt/module/hadoop-3.3.6/sbin/start-dfs.sh" echo " --------------- 启动 yarn ---------------" ssh hadoop103 "/opt/module/hadoop-3.3.6/sbin/start-yarn.sh" echo " --------------- 启动 historyserver ---------------" ssh hadoop102 "/opt/module/hadoop-3.3.6/bin/mapred --daemon start historyserver" ;; "stop") echo " =================== 关闭 hadoop集群 ===================" echo " --------------- 关闭 historyserver ---------------" ssh hadoop102 "/opt/module/hadoop-3.3.6/bin/mapred --daemon stop historyserver" echo " --------------- 关闭 yarn ---------------" ssh hadoop103 "/opt/module/hadoop-3.3.6/sbin/stop-yarn.sh" echo " --------------- 关闭 hdfs ---------------" ssh hadoop102 "/opt/module/hadoop-3.3.6/sbin/stop-dfs.sh" ;; *) echo "Input Args Error..." ;; esac
保存退出后,给予脚本权限:chmod 777 myhadoop.sh
之后分发脚本:xsync myhadoop.sh
然后分别使用myhadoop.sh stop
和 myhadoop.sh start
看看能否正常停止和启动集群。
我们查看jps时需要切换到每一个节点上挨个调用jps,这样就很麻烦,我们希望能在任意一个节点上调用一个命令就能查看所有节点的jps,所以我们来编写查看所有节点jps脚本jpsall。
同样在/root/bin目录中创建jpsall文件,然后输入以下内容:
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
保存退出后,给予脚本权限:chmod 777 jpsall
之后分发脚本:xsync jpsall
之后再每个节点上各调用一次看看有没有问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。