前提你已经安装了虚拟机!
虚拟机有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.csdn.net/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.csdn.net/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.csdn.net/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.csdn.net/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.csdn.net/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
<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>
<property>
<name>fs.defaultFS</name>
<value>hdfs://namenode:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.2.2/data</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
</configuration>
vim hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>namenode:9870</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>datanode1:9868</value>
</property>
</configuration>
vim yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<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>
<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可以换成安装的绝对路径或者
HADOOPM?APREDH?OME可以换成安装的绝对路径或者{HADOOP_HOME} 也可借鉴:https://blog.csdn.net/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>
<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>
<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.csdn.net/m0_46413065/article/details/116378004
常见错误解决:https://blog.csdn.net/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和名称!!!)
|