准备资源:VMware、CentOS7镜像文件、XShell7、JDK1.8、hadoop-3.1.3
一、Hadoop概述
Hadoop
组成
HDFS
架构概述
(1)NameNode
: 存储文件的元数据以及每个文件的快列表和块所在的DataNode
;
(2)DataNode
: 存储文件块数据以及校验和;
(3)Secondary NameNode
: 每隔一段时间对NameNode
元数据进行备份;Yarn
架构概述
(1)ResourceManager
: 管理整个集群的资源
a. 接受客户端的请求;
b. 资源分配调度;
c. 监控NodeManager
;
d. 启动或监控AppMaster
;
(2)NodeManager
: 管理单个节点的资源
a. 管理单个节点上的资源;
b. 处理来自ResourceManager
的命令;
c. 处理来自AppMaster
的命令;
(3)AppMaster
: 一个job
会对应开启一个AppMaster
a. 负责数据的切片;
b. 任务的监控和容错;
c. 为应用程序申请资源,并将申请到的资源分配给内部的任务;
(4)Container
: 计算机资源的抽象表示MapReduce
架构概述
二、准备模板机
- 安装
VMWare
- 打开
VM
,点击创建新的虚拟机
- 选择
自定义
- 选择
稍后安装操作系统
- 设置客户机操作系统为
Linux
,版本为CentOS 7 64位
- 设定虚拟机名称为
base
,自定义安装位置
- 设定
处理器内核总数
,要求处理器内核总数 <= 物理机逻辑内核总数
物理机逻辑内核总数
可以在任务管理器中查看:
- 设定虚拟机
内存
- 选择
NAT
- 选择
创建新虚拟磁盘
- 自定义
磁盘大小
- 选择磁盘文件的
存放位置
- 选择安装的
镜像文件
- 开启虚拟机,开始安装
- 选择语言
- 设定日期和时间
- 手动配置分区
开始安装
- 设置
root
用户密码
- 安装好之后进行重启,使用
root
账号登录
- 设置静态
IP
(1) 记录网卡配置信息
a.VM
工具栏,编辑
=>虚拟网络编辑器
b. 点击更改设置
c. 记录子网IP
、子网掩码
、网关
(2) 打开网卡文件
(3) 配置网卡vi /etc/sysconfig/network-scripts/ifcfg-ens33
(4) 保存退出,重启网卡服务# 需要进行修改的配置项 BOOTPORTO=static ONBOOT=yes # 末尾需要添加的配置项 # IP地址 IPADDR=192.168.159.100 # 子网掩码 NETMASK=255.255.255.0 # 网关 GATEWAY=192.168.159.2 # 域名解析,和网关一样就行 DNS1=192.168.159.2
# 重启网卡 systemctl restart network # 查看IP地址 ip addr
- 使用
XShell
工具连接虚拟机
(1) 修改物理机hosts
文件,添加主机名和IP
的映射关系
(2) 打开# hosts文件地址:C:\Windows\System32\drivers\etc\hosts # 添加内容为 192.168.159.100 hadoop100 192.168.159.101 hadoop101 192.168.159.102 hadoop102 192.168.159.103 hadoop103 192.168.159.104 hadoop104 192.168.159.105 hadoop105 192.168.159.106 hadoop106 192.168.159.107 hadoop107 192.168.159.108 hadoop108
XShell
,新建会话
或者
(3) 配置XShell
(4) 连接
- 关闭虚拟机防火墙
systemctl stop firewalld.service & systemctl disable firewalld.service
- 新建普通用户并赋予该用户
root
权限
(1) 新建普通用户
(2)赋予该用户useradd soro echo "123456" | passwd soro --stdin
root
权限# 打开sudoers文件 vi /etc/sudoers # 来到第92行,另起一行,添加如下内容 soro ALL=(ALL) NOPASSWD:ALL # 强制保存退出
- 安装常用工具
yum install -y epel-release psmisc nc net-tools rsync vim lrzsz ntp libzstd openssl-static tree iotop git
- 修改主机名、
hosts
(1) 修改主机名
(2) 修改echo "hadoop100" > /etc/hostname
hosts
# 打开hosts文件 vim /etc/hosts # 末尾添加如下内容 192.168.159.100 hadoop100 192.168.159.101 hadoop101 192.168.159.102 hadoop102 192.168.159.103 hadoop103 192.168.159.104 hadoop104 192.168.159.105 hadoop105 192.168.159.106 hadoop106 192.168.159.107 hadoop107 192.168.159.108 hadoop108
- 创建目录
mkdir -p /opt/moudle /opt/software & chown -R soro:soro /opt/moudle /opt/software
- 重启后关机
# 重启 reboot # 关机 poweroff
三、准备集群环境
- 将模板机克隆三台(克隆一台为例)
(1)右键模板机
=>管理
=>克隆
(2) 选择创建完整克隆
(3) 设定虚拟机名称
和安装位置
(4) 点击完成,等待克隆 - 将克隆的三台虚拟机的
hostname
和IPADDR
分别修改为:hadoop101、hadoop102、hadoop103
和192.168.159.101、192.168.159.102、192.168.159.103
,重启使配置生效 XShell
连接,用户使用普通用户soro
- 安装
Java
并配置环境变量
(1) 向hadoop101
上传jdk-8u212-linux-x64.tar.gz
,置于/opt/software
(2) 解压安装
(3)配置环境变量cd /opt/software tar -zxvf jdk-8u212-linux-x64.tar.gz -C ../moudle/
# 创建环境变量文件 sudo vim /etc/profile.d/my-env.sh # 在my-env文件中添加如下内容: # Java环境变量 export JAVA_HOME=/opt/moudle/jdk1.8.0_212 export PATH=$PATH:$JAVA_HOME/bin
- 安装
Hadoop
并配置环境变量
(1) 向hadoop101
上传hadoop-3.1.3.tar.gz
,置于/opt/software
(2) 解压安装
(3) 配置环境变量cd /opt/software tar -zxvf hadoop-3.1.3.tar.gz -C ../moudle
sudo vim /etc/profile.d/my-env.sh # 在my-env文件中添加如下内容: # Hadoop环境变量 export HADOOP_HOME=/opt/moudle/hadoop-3.1.3 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
- 免密配置(以
hadoop101
为例)
(1) 生成公钥和私钥
(2) 将公钥拷贝到需要免密登录的机器上ssh-keygen -t rsa
# 每一台虚拟机都需要: ssh-copy-id hadoop101 ssh-copy-id hadoop102 ssh-copy-id hadoop103 # 只有hadoop101需要: su - root ssh-keygen -t rsa ssh-copy-id hadoop101 ssh-copy-id hadoop102 ssh-copy-id hadoop103 exit
- 在
hadoop101
上准备常用脚本
(1) 家目录下创建文件夹
(2) 分发同步脚本cd ~ mkdir -p bin # 在bin目录下创建machines.conf配置文件 # 该配置文件中存储了以下脚本要远程操作的机器 vim bin/machines.conf # 将脚本所在机器的主机名或者IP地址写到最后一行 # 这样可以确保所有机器都有执行以下脚本命令的机会 # 以后需要修改机器数时,只需要修改配置文件即可 # 但是确保最后一行永远是本机的主机名或者IP地址 # 本文中需要存储的机器为, hadoop102 hadoop103 hadoop101
(3) 批量操作虚拟机脚本# 创建脚本文件 vim bin/xrsync.sh # 脚本内容如下 #!/bin/bash if [[ $# -eq 0 ]] then echo "usage: xrsync.sh files-or-folders" exit fi confFile=$(cd /home/$USER/bin;pwd)'/machines.conf' if [[ ! -f $confFile ]] then echo "配置文件:$confFile不存在" exit fi for host in $(cat $confFile) do if [[ $host != $(hostname) && $(ping -c1 -W1 $host &>/dev/null;echo $?) -eq 0 ]] then echo "==========transfer to $host==========" for file in $@ do if [[ -e $file ]] then pdir=$(cd -P $(dirname $file); pwd) fname=$(basename $file) ssh $host "mkdir -p $pdir" rsync -av $pdir/$fname $host:$pdir fi done else if [[ $host != $(hostname) ]] then echo "======transfer false: $host net err======" fi fi done # 赋予执行权限 chmod u+x bin/xrsync.sh
# 创建脚本文件 vim bin/xcall.sh # 脚本内容如下 #!/bin/bash if [[ $# -eq 0 ]] then echo 'usage: xcall.sh cmds' exit fi confFile=$(cd /home/$USER/bin;pwd)'/machines.conf' if [[ ! -e $confFile ]] then echo "配置文件:$confFile不存在" exit fi for host in $(cat $confFile) do if [[ $(ping -W1 -c1 $host &>/dev/null;echo $?) -eq 0 ]] then echo "----------$host----------" ssh $host "$*" else echo "$hosr net err" fi done # 赋予执行权限 chmod u+x bin/xcall.sh
- 同步文件
(1) 同步moudle
下的jdk
和hadoop
(2) 同步xrsync.sh /opt/moudle
my-env
文件# 切换到root,继承soro的环境变量 su # 分发文件 xrsync.sh /etc/profile.d/my-env.sh # 使配置文件生效 xcall.sh source /etc/profile # 退出 exit
四、搭建完全分布式(非高可用)
每一个配置项,务必name一行、value紧贴在下一行,否则之后编写的脚本无法使用
-
修改
hadoop101
上的hadoop
配置文件,所有的配置都在configuration
标签下# 来到配置目录下 cd /opt/moudle/hadoop-3.1.3/etc/hadoop
(1)
core-site.xml
<configuration> <!-- 指定NameNode的地址,端口号也可以是8020和9000 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop101:9820</value> </property> <!-- 指定hadoop数据的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/moudle/hadoop-3.1.3/data</value> </property> <!-- 配置HDFS网页登录使用的静态用户为soro--> <property> <name>hadoop.http.staticuser.user</name> <value>soro</value> </property> <!-- 配置该soro(superUser)允许通过代理访问的主机节点 --> <property> <name>hadoop.proxyuser.soro.hosts</name> <value>*</value> </property> <!-- 配置该soro(superUser)允许通过代理用户所属组 --> <property> <name>hadoop.proxyuser.soro.groups</name> <value>*</value> </property> <!-- 配置该soro(superUser)允许通过代理的用户--> <property> <name>hadoop.proxyuser.soro.groups</name> <value>*</value> </property> </configuration>
(2)
hdfs-site.xml
<configuration> <!-- nn web端访问地址--> <property> <name>dfs.namenode.http-address</name> <value>hadoop101:9870</value> </property> <!-- 2nn web端访问地址--> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop103:9868</value> </property> </configuration>
(3)
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>hadoop102</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> <!-- yarn容器允许分配的最大最小内存 --> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>512</value> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>4096</value> </property> <!-- yarn容器允许管理的物理内存大小 --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>4096</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.log-aggregation-enable</name> <value>true</value> </property> <!-- 设置日志聚集服务器地址 --> <property> <name>yarn.log.server.url</name> <value>http://hadoop101:19888/jobhistory/logs</value> </property> <!-- 设置日志保留时间为7天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property> </configuration>
(4)
mapred-site.xml
<configuration> <!-- 指定MapReduce程序运行在Yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- 历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop101:10020</value> </property> <!-- 历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop101:19888</value> </property> </configuration>
(5)
workers
hadoop101 hadoop102 hadoop103
-
分发配置文件
xrsync.sh /opt/moudle/hadoop-3.1.3/etc/hadoop/
-
启动集群
(1) 启动命令:语法 说明 hdfs --daemon start/stop namenode/datanode/secondarynamenode 单独启动/停止HDFS组件 yarn --daemon start/stop resourcemanager/nodemanager 单独启动/停止YARN start-dfs.sh/stop-dfs.sh 整体启动/停止HDFS start-yarn.sh/stop-yarn.sh 整体启动/停止YARN
(2) 启停脚本
# 可放置在任何机器上 # 创建脚本文件 vim ~/bin/hadoop.sh # 脚本内容如下: #!/bin/bash if [[ $# -ne 1 ]] then echo "usage: hadoop.sh start|stop|format" exit fi case $1 in "format"|"start"|"stop") num=$(cat -n $HADOOP_HOME/etc/hadoop/core-site.xml | tr -s ' \t' | awk '/defaultFS/{print $1+1}') namenodeHost=$(cat -n $HADOOP_HOME/etc/hadoop/core-site.xml | tr -s ' \t' | awk -vnum=$num 'FNR==num{print $2}' | awk -F'[:/]' '{print $4}') num=$(cat -n $HADOOP_HOME/etc/hadoop/yarn-site.xml | tr -s ' \t' | awk '/yarn.resourcemanager.hostname/{print $1+1}') resourcemanagerHost=$(cat -n $HADOOP_HOME/etc/hadoop/yarn-site.xml | tr -s ' \t' | awk -vnum=$num 'FNR==num{print $2}' | awk -F'[><]' '{print $3}') num=$(cat -n $HADOOP_HOME/etc/hadoop/mapred-site.xml | tr -s ' \t' | awk '/mapreduce.jobhistory.address/{print $1+1}') historyserverHost=$(cat -n $HADOOP_HOME/etc/hadoop/mapred-site.xml | tr -s ' \t' | awk -vnum=$num 'FNR==num{print $2}' | awk -F'[><:]' '{print $3}') if [[ $1 == "format" ]] then for host in $(cat $HADOOP_HOME/etc/hadoop/workers) do ssh $host 'rm -rf $HADOOP_HOME/data $HADOOP_HOME/logs' done ssh $namenodeHost 'hdfs namenode -format' elif [[ $1 == "start" ]] then ssh $namenodeHost 'start-dfs.sh' ssh $resourcemanagerHost 'start-yarn.sh' ssh $historyserverHost 'mapred --daemon start historyserver' else ssh $namenodeHost 'stop-dfs.sh' ssh $resourcemanagerHost 'stop-yarn.sh' ssh $historyserverHost 'mapred --daemon stop historyserver' fi ;; *) echo 'usage: hadoop.sh format|start|stop' ;; esac # 赋予执行权限 chmod u+x ~/bin/hadoop.sh
(3) 格式化并启动
# 格式化 hadoop.sh format # 启动 hadoop.sh start # 查看启动情况 xcall.sh jps
-
查看网页端:
Web查看目标 访问网址 NameNode http://hadoop101:9870 Resource Manager http://hadoop102:8088 历史服务器 http://hadoop101:19888/jobhistory
-
运行官方案例
WordCount
# hdfs中存在/input目录,且该目录中有内容 # hdfs中不存在/output目录 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
-
停止集群
hadoop.sh stop