前提你已经安装了虚拟机!
虚拟机有openjdk,需要完全卸载!!!
检查下自带的jdk
命令:
rpm -qa |grep java
rpm -qa |grep jdk
rpm -qa |grep gcj
如果没有输出信息表示没有安装。
如果安装了可以使用rpm -qa | grep java | xargs rpm -e --nodeps 批量卸载所有带有Java的文件 这句命令的关键字是java
更多请访问:https://blog.youkuaiyun.com/jimuka_liu/article/details/82784313
(安装Java,前去官网下载文件 https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html)
请注意:你选择的Jdk版本要对应你的Hadoop,并且请注意选择适合你Linux系统的版本,推荐rmp版本,安装简单
安装后找Java真实路径:https://blog.youkuaiyun.com/u013991521/article/details/78292136
(将 Hadoop安装至/usr/local/中,可自行选择, hadoop文件去官方下载即可 https://hadoop.apache.org/releases.html,请对应Linux系统)
tar -zxf hadoop-3.2.2.tar.gz -C /usr/local
(去查看是否解压完成)
cd /usr/local/
(设置变量,Java路径请对应自己的安装路径)
vi /usr/local/hadoop-3.2.2/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.x86_64
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
(设置节点,(虚拟机分配的IP))
vi /etc/hosts
192.168.1.75 namenode (填写当前节点,代表自身)
192.168.1.76 datanode1 (填写其它节点,代表他人)
…
vi /usr/local/hadoop-3.2.2/etc/hadoop/workers
(设置环境变量)
vi /etc/profile
export PATH=$PATH:/usr/local/hadoop-3.2.2/bin/
(刷新文件)
source /etc/profile
(修改机器名称)
hostnamectl set-hostname namenode (虚拟机名称,与节点名称相连)
(重启)
init 6
(配置文件,namenode是本节点名称,对应本节点IP,节点名称要连续,最好不要有特殊字符)
vi /usr/local/hadoop-3.2.2/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://namenode:9000</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
vi /usr/local/hadoop-3.2.2/etc/hadoop/hdfs-site.xml
(/usr/local/hadoop-3.2.2/data/hdfs 存放hdfs 文件的路径,新建或让其启动时创建)
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop-3.2.2/data/hdfs</value>
</property>
</configuration>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>
$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*
</value>
</property>
</configuration>
vi /usr/local/hadoop-3.2.2/etc/hadoop/mapred-site.xml
关于mapred-site.xml,$ HADOOP_MAPRED_HOME可以换成安装的绝对路径或者$ {HADOOP_HOME}
也可借鉴:https://blog.youkuaiyun.com/qq_36318271/article/details/89339974
主要是防止运行jar任务失败!
vi /usr/local/hadoop-3.2.2/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</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>
</configuration>
(多节点时加入)
<property>
<name>yarn.resourcemanager.address</name>
<value>namenode:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>namenode:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>namenode:8031</value>
</property>
(hdfs格式化,用于清除原有节点信息)
hdfs namenode -format
(启动进程,在安装目录下:/usr/local/hadoop-3.2.2/ )
sbin/start-dfs.sh
sbin/start-yarn.sh
或
sbin/start-all.sh
(启动后jps查看进程)
13643 DataNode
14380 Jps
13486 NameNode
如果没有启动则去查看日志(hadoop-3.2.2/logs/和你有问题节点对应!!log)
(添加访问端口)
firewall-cmd --permanent --add-port=9870/tcp
firewall-cmd --permanent --add-port=8088/tcp
firewall-cmd --reload
(访问虚拟机地址)
http://192.168.1.75:9870/
http://192.168.1.75:8088/
(测试)
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/root
hdfs dfs -mkdir /input
hdfs dfs -put etc/hadoop/.xml /input
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar grep /input /output ‘dfs[a-z.]+’
hdfs dfs -get /output ./output
cat ./output/
hdfs dfs -mkdir /data
hdfs dfs -put README.txt /data
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /data /output2
(hadoop 命令要么用绝对路径,要么到其安装目录下接上该jar目录)
要离开安全模式,需要满足以下条件:
1)达到副本数量要求的block比例满足要求;
2)可用的datanode节点数满足配置的数量要求;
3) 1、2 两个条件满足后维持的时间达到配置的要求。
在这里笔者是等了几分钟后还是处于安全模式,就采用的命令强制退出的安全模式~
hdfs dfsadmin -safemode get //查看状态
hdfs dfsadmin -safemode enter //进入安全模式
hdfs dfsadmin -safemode leave //退出安全模式
hdfs dfsadmin -safemode forceExit //进行强制关闭
出现:
Call From hadoop3/192.168.91.132 to hadoop1:9000 failed on connection exception。
开放指定端口
firewall-cmd --zone=public --add-port=1935/tcp --permanent
命令含义:
–zone #作用域
–add-port=1935/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
telent 安装:https://blog.youkuaiyun.com/doubleqinyan/article/details/80492421
telnet ip port 检验端口有没有开放
netstat -tlpn 查看端口开放给谁了
netstat -ntulp |grep 1935 //查看所有1935端口使用情况
如果开放给了127.0.0.1,则修改 /etc/hosts 删除有关localhost记录
并检查 core-site.xml 是否配置正确,记得关闭防火墙(直接关闭不在开启)
目前运行的规则,使用iptables -L
关闭所有虚拟机防火墙(完全关闭服务)
systemctl status firewalld查看是否启动
systemctl stop firewalld
systemctl disable firewalld.service
删除新增节点 data/ 与 logs/ 再 hdfs namenode -format
详情:https://blog.youkuaiyun.com/u011170921/article/details/80437937
用户权限问题:(配置是选定的拥有者和登陆者没对上)
错误:Permission denied: user=Hadoop, access=READ_EXECUTE, inode="/tmp":root:supergroup:drwx------
可修改 hadoop-env.sh (或修改自己的登陆用户)
export HDFS_NAMENODE_USER=xxx
export HDFS_DATANODE_USER=xxx
export HDFS_SECONDARYNAMENODE_USER=xxx
export YARN_RESOURCEMANAGER_USER=xxx
export YARN_NODEMANAGER_USER=xxx
或:vi core-site.xml
<!-- 配置 HDFS 网页登录使用的静态用户为 xxx-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>xxx</value>
</property>
再不济就开放全部权限(不做权限检查)
<!-- 不做权限检查 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
集群配置
主节点:
进入安装目录:cd /usr/local/hadoop-3.2.2/
vim core-site.xml
<configuration>
<!-- 指定 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://namenode:8020</value>
</property>
<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.2.2/data</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 root-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
</configuration>
vim hdfs-site.xml
<configuration>
<!-- NameNode web 端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>namenode:9870</value>
</property>
<!-- SecondaryNameNode web 端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>datanode1:9868</value>
</property>
</configuration>
vim yarn-site.xml
<configuration>
<!-- 指定 MR 走 shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 ResourceManager 的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>datanode1</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>
</configuration>
vim mapred-site.xml
<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
关于mapred-site.xml,
H
A
D
O
O
P
M
A
P
R
E
D
H
O
M
E
可
以
换
成
安
装
的
绝
对
路
径
或
者
HADOOP_MAPRED_HOME可以换成安装的绝对路径或者
HADOOPMAPREDHOME可以换成安装的绝对路径或者{HADOOP_HOME}
也可借鉴:https://blog.youkuaiyun.com/qq_36318271/article/details/89339974
分别配置好上述文件,hadoop102的所有配置文件均配置完了。
但我们需要将这个配置文件分发给hadoop103,hadoop104
4 ) 在集群上分发配置好的 Hadoop 配置文件
[leokadia@hadoop102 hadoop]$ xsync /opt/module/hadoop-3.2.2/etc/hadoop/
5 )去 103 和 104 上 查看文件分发情况
[leokadia@hadoop103 ~]$ cat /opt/module/hadoop-3.2.2/etc/hadoop/core-site.xml
[leokadia@hadoop104 ~]$ cat /opt/module/hadoop-3.2.2/etc/hadoop/core-site.xml
刚才已经把集群都配置完毕了,现在需要启动集群
6) 配置 workers
在启动集群前需要配置workers
[leokadia@hadoop102 hadoop]$ vim /opt/module/hadoop-3.2.2/etc/hadoop/workers
在该文件中增加如下内容:(有几个节点就配置几个主机名称)
hadoop102
hadoop103
hadoop104
同步所有节点配置文件
[leokadia@hadoop102 hadoop]$ xsync /opt/module/hadoop-3.2.2/etc
启动集群:
关闭所有虚拟机防火墙
systemctl stop firewalld
systemctl disable firewalld.service
(1)初始化(注意:只有第一次的时候才需要)
如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode(注意:格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。)
[leokadia@hadoop102 hadoop-3.1.3]$ hdfs namenode -format
相当于将整个记账本清空,重新开始记录
初始化完毕后,源路径(/opt/module/hadoop-3.2.2/)就多了两个路径data合logs
在主节点:start-dfs.sh (hadoop102)
ResourceManager 的节点 :start-yarn.sh (hadoop103)
集群基本测试
(1)上传文件到集群
➢ 上传小文件
[leokadia@hadoop102 ~]$ hadoop fs -mkdir /input
➢ 上传大文件
[leokadia@hadoop102 ~]$ hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz /
出现:
Call From hadoop3/192.168.91.132 to hadoop1:9000 failed on connection exception。
开放指定端口
firewall-cmd --zone=public --add-port=1935/tcp --permanent
命令含义:
–zone #作用域
–add-port=1935/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
telnet ip port 检验端口有没有开放
netstat -tlpn 查看端口开放给谁了
netstat -ntulp |grep 1935 //查看所有1935端口使用情况
如果开放给了127.0.0.1,则修改 /etc/hosts 删除有关localhost记录
并检查 core-site.xml 是否配置正确,记得关闭防火墙(直接关闭不在开启)
目前运行的规则,使用iptables -L
关闭所有虚拟机防火墙(完全关闭服务)
systemctl status firewalld查看是否启动
systemctl start firewalld
systemctl stop firewalld
systemctl disable firewalld.service
删除新增节点 data/ 与 logs/ 再 hdfs namenode -format(无效则删除所有节点)
在尝试使用hdfs的命令时,例如出现mkdir: Cannot create directory xxxx. Name node is in safe mode.是因为:
在NameNode节点启动的时候,HDFS首先会进入安全模式,DataNode在启动的时候会向NameNode汇报block等状态,直到等整个系统进入到安全标准时,HDFS会自动离开安全模式
系统什么时候才离开安全模式,需要满足哪些条件?当收到来自datanode的状态报告后,namenode根据配置,确定 1)可用的block占总数的比例、2)可用的数据节点数量符合要求之后,离开安全模式。如果有必要,也可以通过命令强制离开安全模式。
要离开安全模式,需要满足以下条件:
1)达到副本数量要求的block比例满足要求;
2)可用的datanode节点数满足配置的数量要求;
3) 1、2 两个条件满足后维持的时间达到配置的要求。
在这里笔者是等了几分钟后还是处于安全模式,就采用的命令强制退出的安全模式~
hdfs dfsadmin -safemode get //查看状态
hdfs dfsadmin -safemode enter //进入安全模式
hdfs dfsadmin -safemode leave //退出安全模式
hdfs dfsadmin -safemode forceExit //进行强制关闭
以上不行则:
datanode丢失的block达到一定的比例(1-dfs.safemode.threshold.pct),则系统会一直处于安全模式状态即只读状态。dfs.safemode.threshold.pct(缺省值0.999f)表示HDFS启动的时候,如果DataNode上报的block个数达到了元数据记录的block个数的0.999倍才可以离开安全模式,否则一直是这种只读模式。如果设为1则HDFS永远是处于SafeMode。有两个方法离开这种安全式模式
1.修改dfs.safemode.threshold.pct为一个比较小的值,缺省是0.999。
:在hdfs-site.xml中设置安全阀值属性
<property>
<name>dfs.safemode.threshold.pct</name>
<value>0.999f</value>
<description>
Specifies the percentage of blocks that should satisfy
the minimal replication requirement defined by dfs.replication.min.
Values less than or equal to 0 mean not to wait for any particular
percentage of blocks before exiting safemode.
Values greater than 1 will make safe mode permanent.
</description>
</property>
配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
1 ) 配置 mapred-site.xml
只需在mapred-site.xml配置文件加两个参数:
[leokadia@hadoop102 hadoop]$ vim mapred-site.xml
在该文件里面增加如下配置。
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器 web 端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
解释下这两个参数
将历史服务器mapreduce.jobhistory.address配置在hadoop102:10020内部通讯端口
一个服务器内部代码之间的通讯用的是hadoop102:10020
e.g. hadoop102和103之间的通讯
历史服务器对外暴露的接口
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
用户查看集群里面的历史服务,从web页面查看,这个端口用的hadoop102:19888
配置好后分发配置(xsync脚本在最下方给出,可自行编辑,或使用 rsync ,用法也在下放给出)
[leokadia@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
启用历史服务器
[leokadia@hadoop102 hadoop]$ mapred --daemon start historyserver
查看历史服务器是否启动
jps
xxxx JobHistoryServer
配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到 HDFS 系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动 NodeManager 、ResourceManager 和HistoryServer。
开启日志聚集功能具体步骤如下:
1 ) 配置 yarn-site.xml
[leokadia@hadoop102 hadoop]$ vim yarn-site.xml
在该文件里面增加如下配置。
<!-- 开启日志聚集功能 -->
<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>
2 ) 分发配置(xsync脚本在最下方给出,可自行编辑,或使用 rsync ,用法也在下放给出)
[leokadia@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
注意:分发完毕后一定要重启一下yarn
3 ) 关闭 NodeManager 、ResourceManager 和 HistoryServer
关闭HistoryServer
[leokadia@hadoop103 hadoop-3.1.3]$ mapred --daemon stop historyserver
关闭 NodeManager 、ResourceManager
[leokadia@hadoop103 hadoop-3.1.3]$ sbin/stop-yarn.sh
因为更改了yarn的配置,所以需要重启yarn
HDFS配置没有修改,所以不需要重启HDFS
4 ) 启动 NodeManager 、ResourceManage 和 HistoryServer
启动 NodeManager 、ResourceManage
[leokadia@hadoop103 ~]$ start-yarn.sh
启动 HistoryServer
[leokadia@hadoop102 ~]$ mapred --daemon start historyserver
5 ) 删除 HDFS 上已经存在的 输出 文件
[leokadia@hadoop102 ~]$ hadoop fs -rm -r /output
6 ) 执行 WordCount 程序
[leokadia@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
7 ) 查看日志
(1)历史服务器地址
http://hadoop102:19888/jobhistory
集群时间同步
如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;
如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。
详情请见:https://blog.youkuaiyun.com/m0_46413065/article/details/116378004
常见错误解决:https://blog.youkuaiyun.com/m0_46413065/article/details/116378297
补充知识
scp 源文件 目标
#推文件
[root@web02 ~]# scp /root/1.txt root@10.0.0.41:/root/
#这里注意写上文件的绝对路径
#推目录
#推目录要加上-r选项
[root@web02 ~]# scp -r /root/123 root@10.0.0.41:/tmp
#拉目录
#把10.0.0.41机器上面的/etc目录拷贝到本地/tmp下
[root@web02 ~]# scp -r root@10.0.0.41:/etc /tmp
#拉文件
#把10.0.0.41机器上面的/tmp/yum.log文件拷贝到web02机器下的/root目录下
[root@web02 ~]# scp root@10.0.0.41:/tmp/yum.log /root/
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
#rsync的传输模式
#本地传输相当于cp命令
#传输目录加-a选项,把/root目录下的123目录传输到/tmp目录下
[root@web02 ~]# rsync -a /root/123 /tmp
#把/tmp/yum.log文件传输到/root目录下
[root@web02 ~]# rsync /tmp/yum.log /root
#远程传输相当于scp命令
#把本地的/root/123目录传输到10.0.0.41机器的/tmp目录下
[root@web02 ~]# rsync -a /root/123 root@10.0.0.41:/tmp/
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
xsync 集群分发 脚本
#!/bin/bash
#1. 判断参数个数
#判断参数是否小于1
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
#对102,103,104 节点(节点名称对应IP写入/etc/hosts 中)都进行分发
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
修改脚本 xsync 具有执行权限:
chmod +x xsync
测试脚本:
xsync /root/bin
(前提要在/etc/hosts写入对应的节点ip和名称!!!)