CentOS8上使用 yum 直接安装,环境变量自动配置好
看到下面结果,说明已经安装配置 jdk
[root@localhost ~]# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
查看系统是否自带 jdk
rpm -qa |grep java
rpm -qa |grep jdk
rpm -qa |grep gcj
如果有输出信息,批量卸载系统自带
rpm -qa | grep java | xargs rpm -e --nodeps
如果使用 yum 安装的 jdk,请使用下面命令卸载
yum -y remove java-1.8.0-openjdk-headless.x86_64
yum list java-1.8*
yum install java-1.8.0-openjdk* -y
[root@localhost ~]# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
要获得发行版,请从Apache 下载镜像之一下载最新的 稳定版本(3.3.3)。
##下载好上传
rz -y
选择文件上传
##解压
tar zxvf hadoop-3.3.3.tar.gz
也可以使用centos7是自带的java环境,不过还是建议大家自己安装java,自带的java环境可以通过下面的方式找到路径。
使用ls -lrt命令,可以找到自带java的路径向下深入。
ls -lrt /usr/bin/java
/usr/bin/java -> /etc/alternatives/java
##当得到到一个真实的路径,一般就是了。
ls -lrt /etc/alternatives/java
/etc/alternatives/java -> /usr/lib/jvm/java-8-openjdk-amd64/jre/bin
## 设置为 Java 安装的根目录
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
在etc/hadoop/hadoop-env.sh配置中添加PID目录以及日志目录
export HADOOP_PID_DIR =/home/zxhy/hadoop-3.3.3/pid
export HADOOP_LOG_DIR =/home/zxhy/hadoop-3.3.3/log
在/etc/profile.d中的一个新建一个简单脚本hadoop.sh,内容如下:
#如果是自己安装的java修改为自己安装的路径
export JAVA_HOME=/opt/jdk1.8.0_202
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export HADOOP_HOME=/home/zxhy/hadoop-3.3.3
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
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
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://hadoop01:19000value>
property>
<property>
<name>io.file.buffer.sizename>
<value>131072value>
property>
<property>
<name>hadoop.http.staticuser.username>
<value>rootvalue>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/home/zxhy/hadoop-3.3.3/data/tmpvalue>
property>
<property>
<name>hadoop.proxyuser.root.hostsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.root.groupsname>
<value>*value>
property>
configuration>
创建两个目录/home/zxhy/hadoop-3.3.3/data/name、/home/zxhy/hadoop-3.3.3/data/file用于存放日志和文件
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!-- NameNode 持久存储命名空间和事务日志的本地文件系统上的路径。 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/zxhy/hadoop-3.3.3/data/name</value>
</property>
<!-- DataNode的本地文件系统上应存储其块的路径的逗号分隔列表。 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/zxhy/hadoop-3.3.3/data/file</value>
</property>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.vmem-chech-enabled</name>
<value>false</value>
</property>
<!-- 关闭yarn对物理内存和虚拟内存的限制检查 -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</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>
<!-- 启用自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 启用日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enabled</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop01:19888?jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- 生产环境 自动检测硬件进行配置,默认false,配置true后后续资源配置参数将不起作用 -->
<property>
<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
<value>false</value>
</property>
<!-- 生产环境 设置nodemanager的内用内存,默认8G -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
<!-- 生产环境 处理调度器的线程数量,默认50 ,一般根据集群所有cpu的核心数乘以台数*0.8进行配置-->
<property>
<name>yarn.resourcemanager.scheduler.client.thread-count</name>
<value>50</value>
</property>
<!-- 生产环境 是否将虚拟核数当做cpu核数,默认是false,采用物理cpu核数-->
<property>
<name>yarn.nodenamager.resource.count-logical-processors-as-cores</name>
<value>false</value>
</property>
<!-- 生产环境 上面参数如果为true的话,需要修改虚拟核数和物理核数的乘数,默认是1.0,也就是线程数和cpu个数的乘数,一般设置为2-->
<property>
<name>yarn.nodemanager.resource.pcores-vcores-multiplier</name>
<value>1.0</value>
</property>
<!-- 生产环境 设置nodemanager的微系统保留多少内存 -->
<property>
<name>yarn.nodemanager.resource.system-reserved-memory-mb</name>
<value>1024</value>
</property>
<!-- 生产环境 设置nodemanager的容器的最小内存默认1G -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<!-- 生产环境 设置nodemanager的容器的最大内存,默认8g,不能超过机器的物理内存 -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8196</value>
</property>
<!-- 生产环境 容器最小cpu核数,默认1个-->
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<!-- 生产环境 容器最大cpu核数,默认4个-->
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>4</value>
</property>
<!-- 生产环境 虚拟内存检测,默认打开true,建议关闭-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 生产环境 虚拟内存和物理内存的设置比例。默认2.1-->
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<!-- 生产环境 设置任务的优先级,默认为零,如果资源紧张的情况,希望某些任务能优先执行-->
<property>
<name>yarn.cluster.max-application-priority</name>
<value>5</value>
</property>
</configuration>
默认情况下,容量调度器只有一个default队列,可以在配置文件中添加其他队列,按照default队列的参数进行配置即可
<property>
<name>yarn.scheduler.capacity.root.queuesname>
<value>default,hivevalue>
<description>
The queues at the this level (root is the root queue).
description>
property>
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/jobhistory/tmp</value>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/jobhistory/done</value>
</property>
</configuration>
为用于运行 Hadoop 的帐户建立 ssh 信任(通过无密码 ssh 或其他方式,例如 Kerberos),在每个节点上执行下面命令
#现在检查您是否可以在没有密码的情况下 ssh 到 localhost:
$ ssh localhost
#如果没有密码就无法 ssh 到 localhost,请执行以下命令:
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
把id_rsa.pub 文件通过scp复制到hadoop01的.ssh目录下,合并秘钥
#在第二个节点执行复制命令
scp /root/.ssh/id_rsa.pub root@hadoop01:$PWD/id_rsa.pub2
#在第三个节点执行复制命令
scp /root/.ssh/id_rsa.pub root@hadoop01:$PWD/id_rsa.pub3
#在第一个节点合并秘钥
cat id_rsa.pub >> authorized_keys
cat id_rsa.pub2 >> authorized_keys
cat id_rsa.pub3 >> authorized_keys
chmod 0600 ~/.ssh/authorized_keys
#然后把authorized_keys在复制到hadoop02和hadoop02上
scp authorized_keys root@hadoop02:$PWD
scp authorized_keys root@hadoop03:$PWD
#然后测试下用ssh能无密码连上其他节点不,如果不需要密码则成功。
ssh hadoop02
也可以使用命令直接复制公钥到其他服务器上
ssh-copy-id hadoop01
ssh-copy-id hadoop02
ssh-copy-id hadoop03
同样在其他两个机子上也执行同样的命令,就可以完成公钥的复制,这样其他两个机子就可以无密码访问其他两个服务器。
以三个节点为例,分别设置hostname为hadoop01、hadoop02、hadoop03
#修改每个机器的hostname
vi /etc/hostname
#修改为hadoop01
#修改每个机器的hosts
vi /etc/hosts
#修改为下面的ip,ip为每个节点的ip
192.168.1.251 hadoop01
192.168.1.250 hadoop02
192.168.1.249 hadoop03
列出您的etc/hadoop/workers文件中的所有工作人员主机名或 IP 地址,每行一个。帮助程序脚本(如下所述)将使用etc/hadoop/workers文件一次在多个主机上运行命令。它不用于任何基于 Java 的 Hadoop 配置。为了使用此功能,。
#修改每个机器的hostname
vi /etc/hadoop/workers
#修改为下面内容,每一行一个hostname
hadoop01
hadoop02
hadoop03
在hadoop/bin目录下创建一个下xysnc的文件,编辑文件内容为下面内容,这个是方便服务器之间同步更改后的文件的。
使用方式是:xsync 文件/文件夹
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if [ $pcount -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
#也可以采用:
#for host in hadoop{102..104};
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)
echo pdir=$pdir
#6. 获取当前文件的名称
fname=$(basename $file)
echo fname=$fname
#7. 通过ssh执行命令:在$host主机上递归创建文件夹(如果存在该文件夹)
ssh $host "mkdir -p $pdir"
#8. 远程同步文件至$host主机的$USER用户的$pdir文件夹下
rsync -av $pdir/$fname $USER@$host:$pdir
else
echo $file does not exists!
fi
done
done
要启动 Hadoop 集群,您需要同时启动 HDFS 和 YARN 集群。
#首次启动 HDFS 时,必须对其进行格式化。将新的分布式文件系统格式化为hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format
在指定节点上使用以下命令启动 HDFS NameNode 作为hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode
#在每个指定节点上使用以下命令启动一个 HDFS DataNode 作为hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode
#使用以下命令启动 YARN,在指定的 ResourceManager 上以yarn运行:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager
#运行脚本以在每个指定主机上启动 NodeManager 作为yarn:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager
#启动一个独立的 WebAppProxy 服务器。作为yarn在 WebAppProxy 服务器上运行。如果多个服务器与负载平衡一起使用,则应在每个服务器上运行:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start proxyserver
#使用以下命令启动 MapReduce JobHistory Server,在指定服务器上以mapred身份运行:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver
#前面我们配置了etc/hadoop/workers和 ssh 可信访问,则可以使用实用程序脚本启动所有 HDFS 进程。作为
[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh
[yarn]$ $HADOOP_HOME/sbin/start-yarn.sh
使用以下命令停止 NameNode,在指定的 NameNode 上以hdfs运行:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode
#在每个指定节点上使用以下命令停止一个 HDFS DataNode 作为hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop datanode
#使用以下命令停止 YARN,在指定的 ResourceManager 上以yarn运行:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop resourcemanager
#运行脚本以在每个指定主机上停止 NodeManager 作为yarn:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager
#停止一个独立的 WebAppProxy 服务器。作为yarn在 WebAppProxy 服务器上运行。如果多个服务器与负载平衡一起使用,则应在每个服务器上运行:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop proxyserver
#使用以下命令停止 MapReduce JobHistory Server,在指定服务器上以mapred身份运行:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver
#前面我们配置了etc/hadoop/workers和 ssh 可信访问,则可以使用实用程序脚本启动所有 HDFS 进程。作为
[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh
[yarn]$ $HADOOP_HOME/sbin/stop-yarn.sh
编写一个一键启动和停止脚本命名为myhadoop.sh,放到hadoop目录的sbin目录下。
使用方式为
#启动
./myhadoop.sh start
#停止
./myhadoop.sh stop
下面为脚本内容
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
this="${BASH_SOURCE-$0}"
bin=$(cd -P -- "$(dirname -- "${this}")" >/dev/null && pwd -P)
if [[ -n "${HADOOP_HOME}" ]]; then
HADOOP_HOME_DIR="${HADOOP_HOME}"
else
HADOOP_HOME_DIR="${bin}/../"
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop01 "${HADOOP_HOME_DIR}/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop01 "${HADOOP_HOME_DIR}/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop01 "${HADOOP_HOME_DIR}/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop01 "${HADOOP_HOME_DIR}/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop01 "${HADOOP_HOME_DIR}/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop01 "${HADOOP_HOME_DIR}/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
jps的集群脚本,用jps脚本查看所有的机器进程是否启动
#!/bin/bash
for host in hadoop01 hadoop02 hadoop03
do
echo ============= $host =============
ssh $host jps
done
因为yarn的启动需要hdfs退出安全模式后才可以,所以我们加入下面脚本到start-yarn.sh的最开始,当hdfs完全启动并且退出安全模式后,再启动yarn
while true
do
monitor=`hdfs dfsadmin -safemode get`
if [[ $monitor =~ "OFF" ]]
then
break
else
echo "hdfs Safe mode is ON ,please wait。"
fi
sleep 5
done
先把防火墙关闭了,否侧不能访问。
#关闭防火墙。
systemctl stop firewalld.service
#永久关闭防火墙。
systemctl disable firewalld.service
按照之前的设置访问web管理界面
名称节点
http://hadoop01:9870/ ,默认 HTTP 端口为 9870。
资源管理器
http://hadoop01:8088/ ,默认 HTTP 端口为 8088。
MapReduce JobHistory 服务器
http://hadoop01:19888/,默认 HTTP 端口为 19888。