建议3台虚拟机,虚拟机是centos7版本,使用完全分布式运行模式。
hadoop下载地址:https://archive.apache.org/dist/hadoop/common/
hadoop的伪分布式和本地运行模式:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html
jdk下载:https://repo.huaweicloud.com/java/jdk/
提示:在你准备虚拟机环境时,有几点你是需要理解的。第一,虚拟机之间需要互相ping通,那么你的网卡和防火墙要配置。集群节点之间互相关闭防火墙,节点组成的集群开启防火墙(防御组)。
每一个节点都需要。
//服务关闭
service iptables stop
//关闭开机自启
chkconfig iptables off
//检查防火墙是否关闭
service iptables status
chkconfig --list iptables
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
使用一般用户来搭建集群,碰到问题会很多,可以帮助你快速成长。这里的创建software和module文件夹是必要的。
//创建一个一般用户rong
useradd rong
//设置密码
password rong
//在/opt目录下创建software和module文件夹,这两个文件夹是用来放后面的软件和其解压包的。这一步是必要的!
mkdir /opt/software /opt/module
//更改文件夹权限
chown rong:rong /opt/software /opt/module
//将用户添加到sudoers管理中,使该用户具有root权限
vi /etc/sudoers
rong ALL=(ALL) NOPASSWD:ALL
:wq! 强制保存下。
每一个节点都需要,集群的节点之间标注位置信息,互相通信。
vim /etc/hosts
//文件后追加
节点1的ip 节点1名字
节点2的ip 节点2名字
节点3的ip 节点3名字
静态IP的作用就是之前的配置在当IP自动分配时,在每一次重启时,会影响之前的配置信息。每一个节点都需要,要和之前的Hosts里面的信息对上。这里面的网卡信息要注意!
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:F5:1D:6A
TYPE=Ethernet
UUID=8f49ebc2-5b1b-4135-863b-6acb0c84453f
ONBOOT=yes
BOOTPROTO=static #设置为静态
IPADDR=192.168.xxx.xxx #修改ip和之前设置的节点ip对上
PREFIX=24
NETMASK=255.255.255.0 #掩码
GATEWAY=192.168.xxx.x #网关
DNS1=192.168.xxx.x #配置网关连接外网
NAME=eth0
//使配置文件生效
source /etc/sysconfig/network-scripts/ifcfg-eth0
//重启
service network restart
每一个节点都需要,和之前的Hosts中的节点信息对上。
vi /etc/sysconfig/network
//修改HOSTNAME字段
HOSTNAME=节点名和之前对上
当然是每个节点都需要配置的,因为hadoop的执行需要java的编译。
//查询自带的jdk版本,没有jdk也没关系
java -version
//查询自带的jdk版本号
rpm -qa | grep jdk
//卸载open jdk
yum -y remove $(rpm -qa | grep jdk)
//或者使用sudo来卸载
sudo rpm -e jdk软件包
//再次查询jdk的版本号
java -version
//查询JDK安装路径
which java
将jdk的安装包放入到指定文件夹下,可以使用Xftp软件。之前要创建software和moudle文件夹,你可以把安装包和解压包放到这两个文件夹下。
//将压缩包解压到/opt/moudle目录下xzvf也有其特殊的意义,欢迎百度
tar xzvf jdk-8u144-linux-x64.tar.gz -C /opt/moudle
//配置java的环境变量,将配置信息添加到profile文件中
vi /etc/profile
//在文件末尾添加jdk的路径
export JAVA_HOME=/usr/java/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
//让配置信息生效
source /etc/profile
//再次查询java版本号,查看配置是否成功
java -version
和jdk安装同理,要将事先下载好的Hadoop压缩包放入到/opt/software文件夹下,之后再解压到moudle文件夹下。
//解压hadoop压缩文件到moudle文件夹下
tar -zxvf hadoop-2.9.2.tar.gz -C /opt/module/
//在hadoop的解压文件夹下可以获取Hadoop安装路径
pwd
//配置hadoop的环境变量,将配置信息添加到profile文件中
vi /etc/profile
//在profile文件末尾添加hadoop路径,bin是可执行文件,sbin是可执行脚本
export HADOOP_HOME=/opt/module/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
//让配置信息生效
source /etc/profile
//查看是否安装成功
hadoop version
总结:到此为止,三个节点上的java和hadoop算是全部安装完成了!
scp命令可在不同的主机之间实现文件的快速传输。有3个节点,那么我们就选择一个作为主节点(master),剩下的作为从节点(slave)。所以每个节点上都要配置好第1、2、3节的信息,jdk和Hadoop的安装包全部解压配置安装好。可以尝试使用scp进行快速传输,rsync命令也用于拷贝,但是性质却不一样,建议百度!当然,你可以写个脚本快速执行以上步骤。拷贝文件时,还有一点需要注意,那就是/etc/profile文件别忘记拷贝和之后需要source一下该文件(使之生效)。
有一个疑问:每一个节点是不是在安装hadoop时就会有了DN和NM?
我们使用穷人版的集群架构,所以3个节点都有DN和NM,节点1有NN,节点2有RM,节点3有2NN。
另外,在/opt/module/hadoop-2.9.2/etc/hadoop目录下有7个文件需要配置,分别是core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml,hadoop-env.sh,mapred-env.sh,yarn-env.sh。其中hadoop-env.sh,mapred-env.sh,yarn-env.sh这三个主要是配置下JAVA_HOME。注意,这些文件你在一个节点上做了修改之后,记得分发给其他的节点。
1.核心配置文件core-site.xml:
在/opt/module/hadoop-2.9.2/etc/hadoop目录下。
vi core-site.xml
//在该文件中编写如下配置
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.9.2/data/tmp</value>
</property>
2.HDFS配置文件hadoop-env.sh和hdfs-site.xml:
//配置hadoop-env.sh
vi hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
//配置hdfs-site.xml
vi hdfs-site.xml
//在该文件中编写如下配置
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hadoop辅助名称节点2NN主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave2:50090</value>
</property>
3.YARN配置文件yarn-env.sh和yarn-site.xml:
//配置yarn-env.sh
vi yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
//配置yarn-site.xml
vi 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>slave1</value>
</property>
4.MapReduce配置文件mapred-env.sh和mapred-site.xml:
//配置mapred-env.sh
vi mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
//配置mapred-site.xml
vi mapred-site.xml
//在该文件中增加如下配置
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
**总结:**以上的配置信息,每一个节点上都要有。所以在一台节点上配置完成之后,分发到其他节点就可以了。
每一个节点都启动了datanode,会有DM服务的。
hdfs namenode -format #注意一定要在配置了namenode的机器上格式化
hadoop-daemon.sh start namenode #启动namenode
hadoop-daemon.sh start datanode #启动datanode
hadoop-daemon.sh start datanode #启动datanode
hadoop-daemon.sh start datanode #启动datanode
hadoop-daemon.sh start secondarynamenode #启动2NN
jps
主要作用是为了群起集群,配置好了ssh协议就可以使用hadoop自带的群起脚本。群起脚本之前需要配置好位于/opt/moudle/hadoop-2.9.2/etc/hadoop文件夹下slave文件,这里面记录了hadoop集群的所有主机,之后要将这个文件分发给每一台主机。
ssh-keygen -t rsa #生成私钥和公钥,一个私钥对应一个公钥。
ssh-copy-id 节点名 #发送公钥到指定的节点
节点之间使用公钥和私钥进行比对来判断,所以3个节点之间需要进行9次公钥交换,这是最安全的一种SSH无密码配置。密钥实现无密码登录的原理就是,生成的公钥和私钥时一一对应的,将公钥发个远端,本地使用私钥来进行匹配,匹配成功即为登录成功。
ssh-keygen -t rsa
,之后再将每个公钥发送给每一个节点(包括自己)ssh-copy-id 节点名
。群起脚本之前需要配置好位于/opt/moudle/hadoop-2.9.2/etc/hadoop文件夹下slave文件,这里面记录了hadoop集群的所有主机,之后要将这个文件分发给每一台主机。
vi /opt/moudle/hadoop-2.9.2/etc/hadoop/slave
删除localhost
master
slave1
slave2
因为之前我们使用穷人版的集群架构,每一个节点上都应有DN和NM服务,所以需要在一个节点上启动一次就可以了。
start-dfs.sh
因为YARN我们主要配置在了slave1节点上,因为我们将ResourceManager配置在了slave1上,所以这个只需要在slave1节点上启动。
start-yarn.sh
群起脚本成功之后,就可以使用jps
命令查看是不是每个节点都应有下面图中的配置。
启动HDFS和YARN之后并运行MapReduce程序查看集群是否启动成功。
配置Yarn历史服务器和日志聚集功能。配置历史服务器主要是查看程序的历史运行情况。日志聚集主要是查看程序运行详情。那么我们在一台节点上配置好这些之后,一定要记得分发给其他节点,让其他节点同步。配置历史服务器之前要将hdfs和yarn关闭。
hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode
yarn-daemon.sh start / stop resourcemanager / nodemanager
start-dfs.sh / stop-dfs.sh
start-yarn.sh / stop-yarn.sh
该文件位于这个/opt/moudle/hadoop-2.9.2/etc/hadoop文件夹下
vi mapred-site.xml
//在该文件里面增加如下配置
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>slave2:10020</value> #选择节点2作为历史服务器
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>slave2:19888</value>
</property>
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
同理,这个文件位于/opt/moudle/hadoop-2.9.2/etc/hadoop文件夹下
vi yarn-site.xml
//在该文件里面增加如下配置。
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value> #7天的秒数
</property>
sbin/yarn-daemon.sh stop resourcemanager
sbin/yarn-daemon.sh stop nodemanager
sbin/mr-jobhistory-daemon.sh stop historyserver
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
sbin/mr-jobhistory-daemon.sh start historyserver
start-dfs.sh
,在slave1上开启yarn的脚本start-yarn.sh
,在slave2上开启历史服务mr-jobhistory-daemon.sh start historyserver
。因为我们之前将slave2节点作为历史服务器节点。bin/hdfs dfs -rm -R /user/root/output
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/root/input /user/root/output
客户端http://slave2:19888/jobhistory
集群时间同步的作用就是让集群的节点之间的时间取得一直。选择一个节点作为时间同步服务器。hbase对时间的同步要求是很高的。
那我们选择将master作为一个ntp服务器。
rpm -qa|grep ntp
ntp-4.2.6p5-10.el6.centos.x86_64
fontpackages-filesystem-1.41-1.1.el6.noarch
ntpdate-4.2.6p5-10.el6.centos.x86_64
service ntpd status #正在运行的状态必须关闭
service ntpd stop #将三台服务全部停掉
chkconfing ntpd off
chkconfing --list ntpd #查看是否关闭
vi /etc/ntp.conf
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
为
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
b)修改2(集群在局域网中,不使用其他互联网上的时间)
//将下面4行注释掉 server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst 为 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst
c)添加3(当该master节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0 fudge 127.127.1.0 stratum 10
4. 修改/etc/sysconfig/ntpd文件
vi /etc/sysconfig/ntpd
//增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
service ntpd status
ntpd 已停
service ntpd start
正在启动 ntpd: [确定]
chkconfig ntpd on
在另外的slave1和slave2节点上配置。
crontab -e
编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate master
date -s "2020-9-11 11:11:11"
date