以下配置基于CentOS-7-x86_64-Minimal-1611.iso系统配置
确保在虚拟机中成功安装Linux(CentOS7)系统后再进行下面的操作,下面教程中红色字体部分为Linux命令
模板机配置
1、创建用户useradd+用户名
2、设置密码passwd+用户名
3、配置所创建的用户具有root权限,方便后期加sudo执行root权限的命令vim /etc/sudoers
修改/etc/sudoers文件,在%wheel这行下面添加一行
用户名 ALL=(ALL) NOPASSWD:ALL
如图:
注意:zq配置这一行不要直接放到root行下面,因为所有用户都属于wheel组,你先配置了zq具有免密功能,但是程序执行到%wheel行时,该功能又被覆盖回需要密码。所以zq要放到%wheel这行下面。
如果用root用户改后wq保存报错E45: 'readonly' option is set (add ! to override),并且在etc文件下ll查看其权限如下(只读)
加入写权限chmod +w sudoers
再编辑保存后再去掉写权限chmod -w sudoers即可
4、配置静态网络vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet #网络类型(也可能是Ethemet)
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static #必改项IP的配置方法[none|static|bootp|dhcp](引导时不使用协议|静态分配IP|BOOTP协议|DHCP协议)
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=520340a4-895c-4654-84bb-2ca653fc9b01
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.89.106
GATEWAY=192.168.89.2
DNS1=192.168.89.2
DNS2=8.8.8.8 #可不用配置
5、重启网络systemctl restart network,失败用reboot
6、配置国内镜像curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
7、清空以前的缓存
sudo yum clean all
sudo yum makecache
8、安装epel-releaseyum install -y epel-release
注:Extra Packages for Enterprise Linux是为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux。相当于是一个软件仓库,大多数rpm包在官方 repository 中是找不到的)
注意:如果Linux安装的是最小系统版,还需要安装如下工具;如果安装的是Linux桌面标准版,不需要执行如下9、10、11
9、安装网络工具yum install net-tools(安装完可用ifconfig或ip addr查看IP),确保IP和所配置的一样
10、安装vim编辑工具yum -y install vim*(没有安装可用vi)
11、安装远程同步命令yum install -y rsync
12、修改主机名vim /etc/hostname(非root用户用sudo赋权)
13、配置主机名映射vim /etc/hosts然后重启reboot
注:为了搭建集群所用的,需要克隆,可以将要用到的IP和主机名一起配置进去,配置单机伪分布可以就只配当前即可
14、修改windows的主机映射文件(hosts文件)
(1)如果操作系统是window7,可以直接修改
(a)进入C:\Windows\System32\drivers\etc路径
(b)打开hosts文件并添加如下内容,然后保存
(2)如果操作系统是window10,先拷贝出来,修改保存以后,再覆盖即可
(a)进入C:\Windows\System32\drivers\etc路径
(b)拷贝hosts文件到桌面
(c)打开桌面hosts文件并添加如下内容
(d)将桌面hosts文件覆盖C:\Windows\System32\drivers\etc路径hosts文件
15、在/opt目录下创建module、software文件夹(/opt文件夹通常为用户的安装路径,而/etc/usr/local通常为系统安装路径),我们创建两个文件夹用于安装软件和存放软件包
mkdir /opt/module
mkdir /opt/software
16、修改module、software文件夹的所有者和所属组均为zq(你需要用到的用户)用户
chown zq:zq /opt/module
chown zq:zq /opt/software
前一个zq为所属用户,后一个zq为所属组
未修改前:
修改后:
17、关闭防火墙,关闭防火墙开机自启
systemctl stop firewalld
systemctl disable firewalld.service
注意:在企业开发时,通常单个服务器的防火墙是关闭的。公司整体对外会设置非常安全的防火墙
18、卸载虚拟机自带的JDK
注意:如果你的虚拟机是最小化安装不需要执行这一步。
rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
之后重启reboot
------------------------------------------------------至此模板机配置完成---------------------------------------------
克隆虚拟机(所有配置此处以hadoop107为例)
1、利用模板机hadoop106,克隆三台虚拟机:hadoop107 hadoop108 hadoop109
注意:克隆时,要先关闭hadoop106
2、修改克隆机IP,三台都需要修改,参照模板机配置第四步(由于是克隆的,只需要改IP即可)
3、修改全部克隆机主机名vim /etc/hostname
4、重启全部克隆机reboot
5、修改windows的主机映射文件(hosts文件),参考配置模板机第十四步
安装JDK
1、用XShell或者FinalShell(此处用的是FinalShell)等传输工具将JDK导入到opt目录下面的software文件夹下面
FinalShell左下角
找到相应目录
在自己电脑找到相应软件包直接拖到空白处即可
2、解压JDK到/opt/module目录下(cd到software目录下)
tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
3、配置JDK环境变量
新建/etc/profile.d/my_env.sh文件sudo vim /etc/profile.d/my_env.sh添加如下内容
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
source一下/etc/profile文件,让新的环境变量PATH生效source /etc/profile
4、测试JDK是否安装成功java -version(如果没有出结果,重启试试reboot)
安装Hadoop
1、用FinalShell将Hadoop软件包(此处用的版本是hadoop-3.1.3.tar.gz,其它版本到官网下载)导入到opt目录下面的software文件夹下面
2、解压安装文件到/opt/module下面(cd到其目录下)
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
3、将Hadoop添加到环境变量
打开/etc/profile.d/my_env.sh文件sudo vim /etc/profile.d/my_env.sh在my_env.sh文件末尾添加如下内容:
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
让修改后的文件生效source /etc/profile
4、测试是否安装成功(如果没有出结果,重启试试reboot)
hadoop version
5、Hadoop重要目录
(1)bin目录:存放对Hadoop相关服务(hdfs,yarn,mapred)进行操作的脚本
(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
(4)sbin目录:存放启动或停止Hadoop相关服务的脚本
(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例
注:三台克隆机都必须完成上面的克隆之后的配置操作,方便后面集群的搭建,此处只演示hadoop107的,其它两台同样的操作
Hadoop运行模式
本地模式(用例官方WordCount):单机运行,只是用来演示一下官方案例,生产环境不用。(用hadoop106演示)
1、在hadoop-3.1.3文件夹下面创建一个wcinput文件夹mkdir wcinput
2、在wcinput文件下创建一个word.txt文件touch word.txt
3、编辑word.txt文件vim word.txt并加入下列内容(可自己找英文内容)
Life is too short to spend time with people who suck the happiness out of you. If someone wants you in their life, they’ll make room for you. You shouldn’t have to fight for a spot. Never, ever insist yourself to someone who continuously overlooks your worth. And remember, it’s not the people that stand by your side when you’re at your best, but the ones who stand beside you when you’re at your worst that are your true friends.
4、回到Hadoop目录cd /opt/module/hadoop-3.1.3执行程序hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput wcoutput
5、查看结果cat wcoutput/part-r-00000
伪分布式模式:也是单机运行,但是具备Hadoop集群的所有功能,一台服务器模拟一个分布式的环境。个别缺钱的公司用来测试,生产环境不用。(此处用模板机Hadoop106演示,因为前面的配置和模板机配置一致)
1、配置ssh免密登录(普通用户操作即可)
配置ssh密钥
在root用户下生成ssh密钥ssh-keygen -t rsa一直回车即可
2、进入~目录下的.ssh文件夹cd ~/.ssh将公钥导入authorized_keys
cat id_rsa.pub >> authorized_keys
如果以后使用的不是root用户,需要更改文件权限命令为:
chmod 600 authorized_keys
3、ssh hostname登陆主机 例如:ssh hadoop106
4、安装装JDK(参照上面安装JDK的步骤即可)
5、安装Hadoop
注:在Linux系统中,环境变量可以通过多种方式设置,其中两种常见的方式是在/etc/profile.d/my_env.sh和/etc/profile中添加。这两个文件的作用和影响有所不同:
vim /etc/profile.d/my_env.sh:
/etc/profile.d/目录下的脚本文件专门用于设置环境变量,这些脚本通常以.sh结尾,表示它们是Shell脚本。
当你在这个目录下添加一个新的脚本my_env.sh,任何登录到系统的用户在他们的会话开始时都会执行这个脚本。
这种方法的好处是模块化,你可以针对特定的环境变量创建单独的脚本,便于管理和维护。
仅当新的登录会话开始时,这些脚本才会被执行。当前已经登录的会话不会读取这些脚本中的环境变量设置。
vim /etc/profile:
/etc/profile是一个在用户登录时被读取的脚本文件,通常对所有新的bash登录会话有效。
在/etc/profile中设置环境变量会影响所有登录到系统的用户(除非用户在他们的.bashrc或.bash_profile中覆盖了这些设置)。
由于/etc/profile在每次登录时都会被读取,所以在这里添加的环境变量会在每个新的登录会话中自动生效。
/etc/profile通常还包含一些设置路径和加载其他脚本(比如/etc/profile.d/下的脚本)的代码。
不同之处包括:
作用范围:/etc/profile.d/my_env.sh通常只影响新启动的登录会话,而/etc/profile中的设置会影响所有新的登录会话。
管理方式:/etc/profile.d/my_env.sh提供了更细粒度的管理,你可以为每个环境变量或每组相关的环境变量创建单独的脚本。
即时生效:对于当前已经登录的用户来说,修改/etc/profile.d/my_env.sh不会立即生效,而修改/etc/profile也不会立即生效,都需要新的登录会话才能看到更改。
在实际操作中,推荐使用/etc/profile.d/目录来设置特定的环境变量,这样可以保持配置文件清晰和模块化,便于管理和更新。如果你需要对所有用户进行全局的环境变量设置,那么可以直接编辑/etc/profile。不过,如果你需要立即生效,对于当前用户来说,你可能还需要运行source /etc/profile或重新登录。
先参照上面的安装Hadoop的步骤走完后
配置hadoop-env.sh,一般是在hadoop安装路径下的/etc/hadoop目录下
如本人的路径是:
cd /opt/module/hadoop-3.1.3/etc/hadoop/
vi hadoop-env.sh
先注释
#export JAVA_HOME=${JAVA_HOME}
再增加如下:
export JAVA_HOME=jdk的安装目录
配置core-site.xml
创建存放运行数据的文件夹mkdir /opt/module/hadoop-3.1.3/tmp
vi core-site.xml
把下面的参数加在configuration标签内
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/module/hadoop-3.1.3/tmp </value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.89.106:9000</value>
</property>
hadoop.tmp.dir用来存放hadoop运行过程中临时文件的目录,目录指定为/opt/module/hadoop-3.1.3/tmp,如果不设置这个目录,那么当hadoop关闭后某些系统临时目录会被清空,当下一次需要启动hadoop时需要重新进行初始化。所以这里人工指定目录可以避免被清空。
df.defaultFS设置好逻辑名称,当我们下次需要访问分布式文件系统的时候,用localhost:9000就可以访问了。
/opt/module/hadoop-3.1.3/tmp目录可以任意,为存放Hadoop运行数据的文件夹
IP要和本机一样
配置mapred-site.xml
1、将mapred-site.xml.template复制并改名为mapred-site.xml(2.9版需要,此处为3.1.3版本,所以忽略)
cp mapred-site.xml.template mapred-site.xml
2、编辑mapred-site.xml
vi mapred-site.xml
将下面的参数加在configuration标签内:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
配置hdfs-site.xml,首先建好dfs,name,data文件夹
mkdir -p /opt/module/hadoop-3.1.3/tmp/dfs
mkdir -p /opt/module/hadoop-3.1.3/tmp/dfs/name
mkdir -p /opt/module/hadoop-3.1.3/tmp/dfs/data
再vi hdfs-site.xml
将下面的参数加在configuration标签内
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/module/hadoop-3.1.3/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/opt/module/hadoop-3.1.3/tmp/dfs/data</value>
</property>
如图:
dfs.replication表示副本的数量,伪分布式要设置为1。
dfs.namenode.name.dir表示本地磁盘目录,是存储fsimage文件的地方。
dfs.datanode.data.dir表示本地磁盘目录,HDFS数据存放block的地方。
配置yarn-site.xml
vi yarn-site.xml
把下面的参数加在configuration标签内
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
如图:
修改workers
vi workers
把文件中的内容修改为主机名
格式化HDFS
在hadoop的bin文件下执行
cd /opt/module/hadoop-3.1.3/bin
./hdfs namenode -format
执行过程会卡住,输入Y即可,当提示successfully formatted 说明成功了。如图:
启动hdfs(单独启动)
如果是root用户,需要在sbin里的start-dfs.sh开头加
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
再切换至/opt/hadoop/hadoop-3.1.3/sbin文件夹下
cd /opt/module/hadoop-3.1.3/sbin
执行./start-dfs.sh
然后在浏览器访问:http://192.168.89.106:9870或者hadoop106:9870
启动yarn(单独启动)
cd /opt/hadoop/hadoop-3.1.3/sbin/
./start-yarn.sh
访问http://192.168.89.106:8088/cluster或hadoop106:8088/cluster成功如下图:
关闭Hadoop(单独关闭)
stop-dfs.sh
stop-yarn.sh
注:如果不想单独启动可执行start-all.sh启动全部Hadoop功能(集群),然后通过stop-all.sh关闭全部功能
完全分布式模式:多台服务器组成分布式环境。生产环境使用。(准备3台客户机(关闭防火墙、静态IP、主机名称),此处用hadoop107、hadoop108、hadoop109演示)
编写集群分发脚本qsync
1)scp(secure copy)安全拷贝
(1)scp定义
scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)
(2)基本语法
scp -r $pdir/$fname $user@$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
前提:在hadoop107、hadoop108、hadoop109都已经创建好的/opt/module、 /opt/software两个目录,并且已经把这两个目录修改为zq:zq(此阶段在配置模板机时就已完成,参考模板机配置第15、16步及克隆虚拟机处)
注:下面的三个操作只为演示scp命令,可不做
在hadoop107上,将hadoop107中/opt/module/jdk1.8.0_212目录拷贝到hadoop108上。
[zq@hadoop107 ~]$ scp -r /opt/module/jdk1.8.0_212/ zq@hadoop108:/opt/module/
在hadoop108上,将hadoop107中/opt/module/hadoop-3.1.3目录拷贝到hadoop108上。
[zq@hadoop108 ~]$ scp -r zq@hadoop107:/opt/module/hadoop-3.1.3/ /opt/module/
在hadoop108上操作,将hadoop107中/opt/module目录下所有目录拷贝到hadoop109上。
[zq@hadoop108 ~]$ scp-r zq@hadoop107://opt/module/* zq@hadoop109:/opt/module/
2)rsync远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去(有相同的会替换原来的)。
基本语法
rsync -av $pdir/$fname $user@$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
选项参数说明
选项 | 功能 |
-a | 归档拷贝 |
-v | 显示复制过程 |
3)qsync集群分发脚本
需求:循环复制文件到所有节点的相同目录下
rsync命令原始拷贝(演示用,可不用执行):[zq@hadoop107 ~]$ rsync -av /opt/module/ zq@hadoop108:/opt/
期望脚本基本语法形式:
qsync加同步的文件名称
要让期望脚本在任何路径都能使用(脚本放在声明了全局环境变量的路径即可)
在/home/zq/bin目录下创建qsync文件
在该文件中编写如下代码
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop107 hadoop108 hadoop109
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
修改脚本 qsync 具有执行权限[zq@hadoop107 bin]$ chmod +x qsync
测试脚本[zq@hadoop107 bin]$ qsync /home/zq/bin/
将脚本复制到/bin中,以便全局调用[zq@hadoop107 bin]$ sudo cp qsync /bin/
同步环境变量配置(root所有者)[zq@hadoop107 ~]$ sudo ./bin/qsync /etc/profile.d/my_env.sh
注意:如果用了sudo,那么qsync一定要给它的路径补全。
分别在三台机子下执行source /etc/profile让环境变量生效
SSH免密登录配置
生成公钥和私钥ssh-keygen -t rsa
注:会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
将公钥拷贝到要免密登录的目标机器上
[zq@hadoop107 .ssh]$ ssh-copy-id hadoop107
[zq@hadoop107 .ssh]$ ssh-copy-id hadoop108
[zq@hadoop107 .ssh]$ ssh-copy-id hadoop109
注意:
还需要在hadoop108上采用zq账号配置一下免密登录到hadoop107、hadoop108、hadoop109服务器上。
[zq@hadoop108 .ssh]$ ssh-keygen -t rsa
[zq@hadoop108 .ssh]$ ssh-copy-id hadoop107
[zq@hadoop108 .ssh]$ ssh-copy-id hadoop108
[zq@hadoop108 .ssh]$ ssh-copy-id hadoop109
还需要在hadoop109上采用zq账号配置一下免密登录到hadoop107、hadoop108、hadoop109服务器上。
[zq@hadoop109 .ssh]$ ssh-keygen -t rsa
[zq@hadoop109 .ssh]$ ssh-copy-id hadoop107
[zq@hadoop109 .ssh]$ ssh-copy-id hadoop108
[zq@hadoop109 .ssh]$ ssh-copy-id hadoop109
还需要在hadoop107上采用root账号,配置一下免密登录到hadoop107、hadoop108、hadoop109;
[zq@hadoop107 .ssh]$su
[root@hadoop107 .ssh]$ ssh-keygen -t rsa
[root@hadoop107 .ssh]$ ssh-copy-id hadoop107
[root@hadoop107 .ssh]$ ssh-copy-id hadoop108
[root@hadoop107 .ssh]$ ssh-copy-id hadoop109
[root@hadoop107 ~]$exit
测试如下则成功
ssh文件夹下(~/.ssh)的文件功能解释
known_hosts | 记录ssh访问过计算机的公钥(public key) |
id_rsa | 生成的私钥 |
id_rsa.pub | 生成的公钥 |
authorized_keys | 存放授权过的免密登录服务器公钥 |
集群配置
集群部署规划
- NameNode和SecondaryNameNode不要安装在同一台服务器
- ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。
hadoop107 | hadoop108 | hadoop109 | |
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
配置文件说明
Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
(1)默认配置文件:
要获取的默认文件 | 文件存放在Hadoop的jar包中的位置 |
[core-default.xml] | hadoop-common-3.1.3.jar/core-default.xml |
[hdfs-default.xml] | hadoop-hdfs-3.1.3.jar/hdfs-default.xml |
[yarn-default.xml] | hadoop-yarn-common-3.1.3.jar/yarn-default.xml |
[mapred-default.xml] | hadoop-mapreduce-client-core-3.1.3.jar/mapred-default.xml |
(2)自定义配置文件:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。
配置集群
核心配置文件
配置core-site.xml
[zq@hadoop107 ~]$ cd $HADOOP_HOME/etc/hadoop
[zq@hadoop107 hadoop]$ vim core-site.xml
在<configuration>标签内添加如下内容:
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop107:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为zq -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>zq</value>
</property>
HDFS配置文件
配置hdfs-site.xml
[zq@hadoop107 hadoop]$ vim hdfs-site.xml
在<configuration>标签内添加如下内容:
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop107:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop109:9868</value>
</property>
YARN配置文件
配置yarn-site.xml
[zq@hadoop107 hadoop]$ vim yarn-site.xml
在<configuration>标签内添加如下内容:
<!-- Site specific YARN configuration properties -->
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop108</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>
MapReduce配置文件
配置mapred-site.xml
[zq@hadoop107 hadoop]$ vim mapred-site.xml
在<configuration>标签内添加如下内容:
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
在集群上分发配置好的Hadoop配置文件
[zq@hadoop107 hadoop]$ qsync /opt/module/hadoop-3.1.3/etc/hadoop/
去另外两台机子上查看文件分发情况
[zq@hadoop108 ~]$ cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
[zq@hadoop109 ~]$ cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
群起集群
配置workers
[zq@hadoop107 hadoop]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
在该文件中删除原来的localhost,添加如下内容:
hadoop107
hadoop108
hadoop109
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件
[zq@hadoop107 hadoop]$ qsync /opt/module/hadoop-3.1.3/etc/
启动集群
如果集群是第一次启动,需要在hadoop107节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程(杀死进程用kill -9 进程号,例如kill -9 112718,用jps查看进程号),并且要删除所有机器的data和logs目录,然后再进行格式化。)
[zq@hadoop107 hadoop-3.1.3]$ hdfs namenode -format
初始化前三台机子都没有data和logs文件夹
初始化后hadoop107会出现data和logs(其余两台不会产生logs文件夹)文件夹
启动HDFS
[zq@hadoop107 hadoop-3.1.3]$ cd /opt/module/hadoop-3.1.3/sbin/
[zq@hadoop107 sbin]$ ./start-dfs.sh
在配置了ResourceManager的节点(hadoop108)启动YARN
[zq@hadoop108 sbin]$ ./start-yarn.sh
Web端查看HDFS的NameNode
浏览器中输入:http://hadoop107:9870或192.168.89.107:9870
然后查看HDFS上存储的数据信息
Web端查看YARN的ResourceManager
浏览器中输入:http://hadoop108:8088或192.168.89.108:8088
查看YARN上运行的Job信息
集群基本测试
上传文件到集群
上传小文件
先创建一个文件夹
[zq@hadoop107 ~]$ hadoop fs -mkdir /input
创建一个文件并上传
[zq@hadoop107 ~]$ vim /opt/module/hadoop-3.1.3/wcinput.txt
[zq@hadoop107 ~]$ hadoop fs -put /opt/module/hadoop-3.1.3/wcinput.txt /input
上传大文件
[zq@hadoop107 ~]$ hdfs dfs -put /opt/software/jdk-8u212-linux-x64.tar.gz /input
上传的文件存放的位置如下
先去到下面这个路径(然后根据自己的实际路径进去)
[zq@hadoop107 ~]$ cd /opt/module/hadoop-3.1.3/data/dfs/data/current/
查看HDFS在磁盘存储文件内容
将刚才的大文件拼接成一个(分块存储,当前每一块的大小为128M)
可用tar -zxvf tmp.tar.gz将其解压在当前路径
下载文件
创建个download文件夹放下载的文件(文件夹随意,这里只作演示用)
[zq@hadoop107 opt]$ cd /opt/module/hadoop-3.1.3/
[zq@hadoop107 hadoop-3.1.3]$ mkdir download
[zq@hadoop107 hadoop-3.1.3]$ hadoop fs -get /input/jdk-8u212-linux-x64.tar.gz ./download/
执行wordcount程序(官方经典的单词计数程序,此处用例为上面上传到HDFS的wcinput.txt文件)
要用到一个jar包(此处为hadoop-mapreduce-examples-3.1.3.jar)
[zq@hadoop107 ~]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input/wcinput.txt /output
注:
hadoop:这是启动Hadoop命令行工具的命令。
jar:这是告诉Hadoop运行一个jar文件。
/opt/moudle/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar:这是包含WordCount程序和其他MapReduce示例的Hadoop示例jar文件的路径。这个路径可能会根据你的Hadoop安装和版本有所不同。
wordcount:这是你想要运行的MapReduce作业的主类。在这个例子中,它指的是WordCount程序。
/input/wcinput.txt:这是HDFS(Hadoop Distributed File System)上的输入路径,其中包含了你想要分析的文本文件。
/output:这是HDFS上的输出路径,WordCount作业的结果将被写入这里。注意,如果输出目录已经存在,Hadoop会报错,因为它不允许覆盖现有的输出目录。
HDFS上会多出两个文件夹
打开输出目录output
将part-r-00000文件下载下来用记事本打开
配置历史服务器(为了查看程序的历史运行情况,需要配置一下历史服务器。)
配置mapred-site.xml
[zq@hadoop107 ~]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml
在<configuration>标签内新增如下内容
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop107:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop107:19888</value>
</property>
分发配置
[zq@hadoop107 ~]$ qsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
在hadoop107启动历史服务器
[zq@hadoop107 ~]$ mapred --daemon start historyserver
查看JobHistory
浏览器访问http://hadoop107:19888/jobhistory或192.168.89.107:19888
配置日志的聚集(应用运行完成以后,将程序运行日志信息上传到HDFS系统上,可以方便的查看到程序运行详情,方便开发调试)
配置yarn-site.xml
[zq@hadoop107 ~]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml
在<configuration>标签内新增如下内容
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop107:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
分发配置
[zq@hadoop107 ~]$ qsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
关闭NodeManager 、ResourceManager和HistoryServer(yarn在hadoop108上关闭)
[zq@hadoop108 ~]$ /opt/module/hadoop-3.1.3/sbin/stop-yarn.sh
[zq@hadoop107 ~]$ mapred --daemon stop historyserver
启动NodeManager 、ResourceManage和HistoryServer(yarn在hadoop108上启动)
[zq@hadoop108 ~]$ start-yarn.sh
[zq@hadoop107 ~]$ mapred --daemon start historyserver
删除HDFS上已经存在的输出文件
[zq@hadoop107 ~]$ hadoop fs -rm -r /output
再次执行WordCount程序
[zq@hadoop107 ~]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input/wcinput.txt /output
查看日志
历史服务器地址
http://hadoop107:19888/jobhistory或192.168.89.107:19888/jobhistory
历史任务列表如下
查看任务运行日志(点击一下任务查看)
可查看运行日志详情
集群启动/停止方式总结
各个模块分开启动/停止(前提是配置了ssh)常用
整体启动/停止HDFS
start-dfs.sh/stop-dfs.sh
整体启动/停止YARN(在hadoop108上)
start-yarn.sh/stop-yarn.sh
各个服务组件逐一启动/停止
分别启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
启动/停止YARN(在hadoop108上)
yarn --daemon start/stop resourcemanager/nodemanager
编写Hadoop集群常用脚本
Hadoop集群启停脚本(包含HDFS,Yarn,Historyserver):zqhadoop.sh
[zq@hadoop107 ~]$ cd /home/zq/bin
[zq@hadoop107 bin]$ vim zqhadoop.sh
输入如下内容
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop107 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop108 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop107 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop107 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop108 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop107 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
保存后退出,然后赋予脚本执行权限
[zq@hadoop107 bin]$ chmod +x zqhadoop.sh
查看三台服务器Java进程脚本:jpsall
[zq@hadoop107 ~]$ cd /home/zq/bin
[zq@hadoop107 bin]$ vim jpsall
输入如下内容
#!/bin/bash
for host in hadoop107 hadoop108 hadoop109
do
echo =============== $host ===============
ssh $host jps
done
保存后退出,然后赋予脚本执行权限
[zq@hadoop107 bin]$ chmod +x jpsall
分发/home/zq/bin目录,保证自定义脚本在三台机器上都可以使用
[zq@hadoop107 bin]$ qsync /home/zq/bin/
常用端口号说明
端口名称 | Hadoop2.x | Hadoop3.x |
NameNode内部通信端口 | 8020 / 9000 | 8020 / 9000/9820 |
NameNode HTTP UI | 50070 | 9870 |
MapReduce查看执行任务端口 | 8088 | 8088 |
历史服务器通信端口 | 19888 | 19888 |
集群时间同步(一般情况下不用配置)
如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;
如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。
找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,生产环境根据任务对时间的准确程度要求周期同步。测试环境为了尽快看到效果,采用1分钟同步一次。
时间服务器配置(必须root用户)
查看所有节点ntpd服务状态和开机自启动状态
[zq@hadoop107 ~]$ sudo systemctl status ntpd
[zq@hadoop107 ~]$ sudo systemctl start ntpd
[zq@hadoop107 ~]$ sudo systemctl is-enabled ntpd
有下列情况说明系统可能没有安装Network Time Protocol (NTP)服务。
对于基于Red Hat的系统(如CentOS):sudo yum install ntp
对于Debian的系统(如Ubuntu):sudo apt-get install ntp
检查服务名 如果NTP服务已经安装,那么检查您使用的服务名是否正确。您可以查看系统中可用的服务列表:sudo systemctl list-unit-files --type=service在输出中查找类似`ntpd`或`timesyncd`的服务名称。
修改hadoop107的ntp.conf配置文件
[zq@hadoop107 ~]$ sudo vim /etc/ntp.conf
修改内容如下
(a)修改1(授权192.168.89.0-192.168.89.255网段上的所有机器可以从这台机器上查询和同步时间)
#restrict 192.168.89.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.89.0 mask 255.255.255.0 nomodify notrap
(b)修改2(集群在局域网中,不使用其他互联网上的时间)
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(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
修改hadoop107的/etc/sysconfig/ntpd 文件
[zq@hadoop107 ~]$ sudo vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
重新启动ntpd服务
[zq@hadoop107 ~]$ sudo systemctl start ntpd
设置ntpd服务开机启动
[zq@hadoop107 ~]$ sudo systemctl enable ntpd
其他机器配置(必须root用户,如果没有安装ntp,请先安装)
关闭所有节点上ntp服务和自启动
[zq@hadoop108 ~]$ sudo systemctl stop ntpd
[zq@hadoop108 ~]$ sudo systemctl disable ntpd
[zq@hadoop109 ~]$ sudo systemctl stop ntpd
[zq@hadoop109 ~]$ sudo systemctl disable ntpd
在其他机器配置1分钟与时间服务器同步一次
[zq@hadoop108 ~]$ sudo crontab -e
编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate hadoop107
[zq@hadoop109 ~]$ sudo crontab -e
编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate hadoop107
修改任意机器时间(测试)
[zq@hadoop108 ~]$ sudo date -s "2021-9-11 11:11:11"
等待1分钟后查看机器是否与时间服务器同步
[zq@hadoop108 ~]$ sudo date