hadoop是由Apache基金会开发维护的分布式系统基础架构;
狭义的hadoop是指hadoop本身,广义的hadoop主要是指hadoop的生态圈;
hadoop的两大功能:主要解决海量数据的存储和海量数据的分析计算问题。
高可靠性:hadoop底层维护多个数据副本,所以即使部分节点元素出现故障,也能从其他节点恢复;
高扩展性:可以动态的在原先的节点上,新增或删除节点,能适应高爆发的场景;
高效性:在MapReduce的思想下,hadoop是并行工作的,这加快了任务的处理速度;
高容错性:能够将失败的任务重新分配资源再次执行。
目前2.x开始到3.x的hadoop版本主要由HDFS,MapReduce,Yarn和common四部分组成。
HDFS(Hadoop Distributed File System,简称HDFS,是一个分布式文件系统,负责文件存储)
MapReduce(Map阶段并行处理计算输入的数据,reduce阶段负责将Map的结果进行汇总,负责数据计算逻辑)
Yarn(Yet Another Resource Negotiator,简称YARN ,是一种资源协调者,是Hadoop的资源管理器,负责资源调度)
common(其他一些必要的辅助工具)
在 linux 系统下,新建 /opt/software 目录用于存放软件的安装包;新建 /opt/module 目录作为软件的安装目录。
mkdir /opt/software
mkdir /opt/module
安装JDK之前需要先删除 linux 系统自带的JDK。
rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
其中 rpm -qa 查询所有安装的 rpm 软件包;
grep -i 查找所有文件名中包含java的文件,-i 忽略大小写;
xargs -n1 表示每次只传递一个参数,这里传递的是查找出来的包含 java 关键字的文件名;
rpm -e --nodeps 强制卸载软件。
(1)用xftp将JDK文件拷贝到 /opt/software 目录下
(2)将JDK安装到 /opt/module 目录下
tar -zxvf /opt/software/jdk-8u212-linux-x64.tar.gz -C /opt/module/
(3)配置JDK的环境变量,新建一个独立的 sh 文件,便于管理
sudo vim /etc/profile.d/myenv.sh
(4)在文件里面配置 java home 的内容
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
export 先设置全局变量JAVA_HOME,再取出path的值,将path后面再接上 $JAVA_HOME/bin 。
(5)source一下profile,相当于刷新一下,使配置生效
source /etc/profile
(6)测试是否成功
java -version
能正常显示 java 的版本信息即为配置成功。
环境和用户准备:
# CentOS需要安装额外的软件epel-release
yum install -y epel-release
# 添加用户
useradd menghui
passwd menghui
# 修改用户权限
vim /etc/sudoers
# 修改/etc/sudoers文件,在%wheel这行下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
menghui ALL=(ALL) NOPASSWD:ALL
(1)用xftp将hadoop安装包拷贝到 /opt/software 目录下
(2)安装hadoop到 /opt/module 目录下面
tar -zxvf /opt/software/hadoop-3.1.3.tar.gz -C /opt/module/
(3)配置hadoop的环境变量
sudo vim /etc/profile.d/myenv.sh
(4)在文件里面接着配置hadoop home的内容
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
(5)source一下profile,相当于刷新一下,使配置生效
source /etc/profile
(6)测试是否成功
hadoop
如果没有报错,这配置成功,如果不成功,请尝试重启后,再测试。
(7)配置主机映射
su root
vim /etc/hosts
# 往里面追加以下内容
192.168.20.102 hadoop102
192.168.20.103 hadoop103
192.168.20.104 hadoop104
安装后的 /opt/module/hadoop-3.1.3 目录下,都是hadoop的目录结构,其中一些重要的介绍如下:
bin,bin里面存放一般常用的命令,HDFS,Yarn,MapReduce等的命令;
etc, etc存放HDFS,Yarn,MapReduce的各种配置文件;
include,include存放各种头文件;
lib, lib本地动态链接库;
sbin,启动集群,启动yarn,启动历史服务器等的命令;
share,提供学习的资料和官方案例。
Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式。
本地模式:单机运行,只是用来演示一下官方案例。生产环境不用。
伪分布式模式:也是单机运行,但是具备Hadoop集群的所有功能,一台服务器模拟一个分布式的环境。可以用来简单的测试,生产环境不用。
完全分布式模式:多台服务器组成分布式环境。生产环境使用。
(1)scp介绍
scp(secure copy) 安全拷贝,scp可以实现服务器和服务器之间的数据拷贝。
(2)语法介绍
scp -r $user@$host:$pdir/$fname $user@$host:$pdir/$fname
其中 -r 是递归拷贝,pdir 为文件的路径,fname 为文件的名称,user 为远程服务器的用户名, host 为远程服务的主机名。
scp -r 用户@主机:要拷贝的文件路径/文件名称 目的地用户@主机:目的地路径/文件名称。
(3)基本示例
以下用到的是远程的主机名,没有配置主机名的需要先配置主机名和IP地址的映射。
# 从hadoop102本机拷贝jdk到hadoop103服务器,此时在hadoop102上面
scp -r /opt/module/jdk1.8.0_212 mrlin@hadoop103:/opt/module/
# 从hadoop102服务器拷贝hadoop到hadoop103本机,此时在hadoop103上面
scp -r mrlin@hadoop102:/opt/module/hadoop-3.1.3 /opt/module/
# 从hadoop102服务器拷贝hadoop到hadoop103服务器,此时在hadoop104上面
scp -r mrlin@hadoop102:/opt/module/hadoop-3.1.3 mrliin@hadoop104:/opt/module/
上面的命令均需要输入远程服务器的密码才能完成拷贝过程。
(1)rsync 介绍
rsync 主要用于备份和镜像,具有速度快、避免复制相同内容和支持符号链接等的优点。
rsync 和 scp 区别:用 rsync 做文件的复制要比 scp 的速度更快,因为 rsync 只对差异的文件做更新,而 scp 只是把所有文件都完整复制过去。
(2)rsync 语法
rsync -av $pdir/$fname $user@$host:$pdir/$fname
其中 -a 是归档拷贝,-v 是显示复制过程,pdir 为文件的路径,fname 为文件的名称,user 为远程服务器的用户名, host 为远程服务的主机名。
scp -r 用户@主机:要同步的文件路径/文件名称 目的地用户@主机:目的地路径/文件名称。
(3)基本示例
随便删掉 hadoop103 上面 /opt/module/hadoop-3.1.3 下面的一个文件,然后再同步文件,如下
# 从hadoop102本机同步hadoop到hadoop103服务器,此时在hadoop102上面
rsync -av /opt/module/hadoop-3.1.3 mrlin@hadoop103:/opt/module/
# 从hadoop102服务器同步hadoop到hadoop103本机,此时在hadoop103上面
rsync -av mrlin@hadoop102:/opt/module/hadoop-3.1.3 /opt/module/
# 从hadoop102服务器同步hadoop到hadoop103服务器,此时在hadoop104上面
rsync -av mrlin@hadoop102:/opt/module/hadoop-3.1.3 mrliin@hadoop104:/opt/module/
此时会发现,rsync 同步的效率比 scp 安全拷贝更高,速度也更快。
在通过用户名@主机访问远程服务器时,其实是通过SSH登录的,因此每次同步文件的时候,都是需要输入远程服务器的密码,这在实际使用时是比较麻烦的,因为我们通过SSH的私钥和公钥的机制,先分发每个用户对于的公钥,就能在登录的时候,实行免密登录,注意当前是在mrlin用户下面的,mrlin和root是两个用户,需要单独配置。
本机在hadoop102服务器上,先ssh hadoop102 登录一下,然后退出。
ssh hadoop102
(1)进入.ssh
cd /home/mrlin/.ssh
(2)生成公钥和秘钥,输入命令,并按3次回车即可
ssh-keygen -t rsa
(3)将公钥拷贝到需要ssh登录的服务器,登录到本机也是需要密码,所以本地也是需要拷贝一份
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
免密登录的原理,就是先利用密码在本地生成秘钥对,本地保留私钥,而将公钥发送给需要ssh登录的服务器,当本地发送数据到其他服务器时,先由本地私钥加密,再在其他服务器通过公钥解密即可;当其服务器发送数据时,其他服务器通过公钥加密,本地再通过私钥解密即可。所以需要本地保留私钥,而将公开的公钥发送给其他需要登录的服务器。
注意:以上的步骤只是实现了在服务器hadoop102的mrlin用户上面登录其他服务器的功能,如需在hadoop103上面也能登录其他服务器,也需在hadoop103上面执行上面的操作。同理,hadoop104或者更多的服务器也需要各执行一遍。
同时,ssh登录是区分用户的,这里我是在 mrlin 的用户下面执行的ssh配置,如需要其他用户也实现免密登录功能,需先切换用户,再执行上面的操作,如需在 root 用户下也能实现,则需在切换成 root 用户后,再次生成秘钥对,并分发公钥。
(4).ssh文件夹下(~/.ssh)的文件功能解释
known_hosts | 记录ssh访问过计算机的公钥(public key) |
---|---|
id_rsa | 生成的私钥 |
id_rsa.pub | 生成的公钥 |
authorized_keys | 存放授权过的无密登录服务器公钥 |
(5)根据上面的内容,我们可以写如下的集群分发脚本
要求:循环复制所有文件到其他服务器的相同目录下,同步后的名称要相同,并且在任何路径下面都可以直接调用
在 hadoop102 下面新建 bin 目录和 sxync 文件。
mkdir /home/mrlin/bin
cd /home/mrlin/bin
vim sxync
编写内容如下:
#!/bin/bash
#1.判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2.遍历集群所有机器
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)
# 7.ssh登录其他服务器账号创建目录
ssh $host "mkdir -p $pdir"
# 8.同步文件
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
修改脚本具有执行权限
chmod +x xsync
测试脚本是否可用,将xsync脚本同步到其他服务器上
xsync /home/mrlin/bin
将脚本复制到/bin中,以便全局调用
sudo cp xsync /bin/
同步环境变量配置(root所有者)
sudo ./bin/sxync /etc/profile.d/myenv.sh
注意:如果用了sudo,那么 xsync 一定要给它的路径补全 ./bin/sxync。
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)自定义配置文件路径
自定义配置文件的路径都在 /opt/module/hadoop-3.1.3/etc/hadoop 里面,里面分别对应核心配置文件 core-site.xml,hdfs 配置文件 hdfs-site.xml ,yarn 配置文件 yarn-site.xml 和 mapreduce 配置文件 mapred-site.xml。
配置 NameNode、SecondaryNameNode 和 ResourceManager 到不同的服务器上面,这3个都是比较耗内存的,也是功能不同的,所以分开配置到不同服务器。
这里 NameNode 可以看成是 HDFS 的管理者,SecondaryNameNode 是辅助 NameNode 的次管理者,帮忙协助 NameNode 处理事情,也能作为 NameNode 的部分备份。
ResourceManager 可以看成是 yarn 的管理者,也叫资源管理器。
自定义文件配置:
vim /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
vim /opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml
vim /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml
vim /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml
(1)配置核心文件 core-site.xml
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://hadoop102:8020value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/opt/module/hadoop-3.1.3/datavalue>
property>
<property>
<name>hadoop.http.staticuser.username>
<value>mrlinvalue>
property>
configuration>
(2)配置HDFS文件 hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.http-addressname>
<value>hadoop102:9870value>
property>
<property>
<name>dfs.namenode.secondary.http-addressname>
<value>hadoop104:9868value>
property>
configuration>
(3)配置YARN文件 yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.resourcemanager.hostnamename>
<value>hadoop103value>
property>
<property>
<name>yarn.nodemanager.env-whitelistname>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOMEvalue>
property>
configuration>
(4)配置MapReduce文件 mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
configuration>
(5)配置集群的workers,将需要添加进集群的服务器都加进来
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
添加如下内容:
hadoop102
hadoop103
hadoop104
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
(6)分发配置信息
将自定义的配置信息分发到其他的服务器上面。
xsync /opt/module/hadoop-3.1.3/etc/hadoop/
在其他的服务上面,查看 mapred-site.xml 是否和配置的信息一致。
(7)启动集群
如果集群是第一次启动,需要在hadoop102节点格式化NameNode,格式化NameNode会生成新的集群id。如果是集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有服务器上面的data和logs目录,然后再进行格式化。如果不先删除data和log目录的内容,当重新格式化NameNode后,会生成新的id,导致新的id跟之前datanode的id不一致,集群就无法正常启动。
# 在 hadoop102 节点上格式化 namenode(集群第一次启动时,才需要)
hdfs namenode -format
# 在 hadoop102 节点上启动HDFS
sbin/start-dfs.sh
# 在配置了ResourceManager的节点(hadoop103上)启动YARN
sbin/start-yarn.sh
Web端查看HDFS的NameNode
(a)浏览器中输入:http://hadoop102:9870
(b)查看HDFS上存储的数据信息
Web端查看YARN的ResourceManager
(a)浏览器中输入:http://hadoop103:8088
(b)查看YARN上运行的Job信息
(8)测试集群基本功能
在集群新建目录,上传文件到集群中,并将文件再次下载下来:
hadoop fs -mkdir /input
hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz /
hadoop fs -get /jdk-8u212-linux-x64.tar.gz ./
新建目录并上传文件后,可以通过 http://hadoop102:9870 查看文件是否存在。
为了查看程序的历史运行情况,需要配置一下历史服务器,具体配置步骤如下:
(1)配置mapred-site.xml
在 mapred-site.xml 文件里面添加如下配置
<property>
<name>mapreduce.jobhistory.addressname>
<value>hadoop102:10020value>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>hadoop102:19888value>
property>
(2)分发历史服务器的配置
xsync /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml
(3)在hadoop102启动历史服务器
mapred --daemon start historyserver
(4)查看历史服务器是否启动
jps
(5)在Web端,浏览器中输入以下网址,查看JobHistory
http://hadoop102:19888/jobhistory
应用运行完成以后,将程序运行日志信息上传到HDFS系统上,可以查看到程序运行的详细情况,方便开发和调试。具体配置步骤如下:
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryServer。
(1)配置yarn-site.xml
在 yarn-site.xml 中添加配置如下:
<property>
<name>yarn.log-aggregation-enablename>
<value>truevalue>
property>
<property>
<name>yarn.log.server.urlname>
<value>http://hadoop102:19888/jobhistory/logsvalue>
property>
<property>
<name>yarn.log-aggregation.retain-secondsname>
<value>604800value>
property>
(2)分发日志服务器的配置到其他服务器
xsync /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml
(3)关闭NodeManager 、ResourceManager和HistoryServer
sbin/stop-yarn.sh
mapred --daemon stop historyserver
其中 start-dfs.sh / stop-dfs.sh 为整体启动或关闭 HDFS 进程;
start-yarn.sh / stop-yarn.sh 为整体启动或关闭 yarn 进程;
单独启动或关闭 HSDF 组件namenode,datanode,secondarynamenode 命令如下:
hdfs --daemon start/stop namenode/datanode/secondarynamenode
单独启动或关闭 yarn组件 resourcemanager,nodemanager 命令如下:
yarn --daemon start/stop resourcemanager/nodemanager
单独启动或关闭历史服务器命令如下:
mapred --daemon start/stop historyserver
(4)启动NodeManager 、ResourceManager和HistoryServer
sbin/start-yarn.sh
mapred --daemon start historyserver
(5)测试hadoop系统自带的wordcount程序
在 /opt/module/hadoop-3.1.3 目录新建 input 目录,并新建文件word.txt。
mkdir input
vim word.txt
word.txt 里面写入如下内容:
hello world
Hello hadoop
hello hadoop
执行wordcount程序:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
目标文件 output 为hadoop上 hdfs 的目录,且该目录不能存在,存在就会报错。如果再次执行wordcount程序时,需要先删除 output 目录。
hadoop fs -rm -r /output
(6)查看刚刚执行程序的日志
http://hadoop102:19888/jobhistory
常用端口号说明:
端口名称 | Hadoop3.x |
---|---|
NameNode内部通信端口 | 8020 / 9000 / 9820 |
NameNode HTTP UI | 9870 |
MapReduce查看执行任务端口 | 8088 |
历史服务器通信端口 | 19888 |
在启动集群的时候,每次都要启动hdfs,启动yarn,启动历史服务器,就显的比较繁琐,一般这种情况,可以将所有的命令都写到脚本里面,只需执行一个命令就所有的进程都启动,同理,关闭的时候也所有的都关闭。
在 /home/mrlin/bin 目录下新建 myhadoop.sh 文件,并输入以下内容:
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
修改脚本赋予执行的权限:
chmod +x myhadoop.sh
测试效果:
myhadoop.sh stop
myhadoop.sh start
查看三台服务器Java进程脚本:jpsall
在 /home/mrlin/bin 目录下新建 jpsall 文件,并输入以下内容:
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
同理,赋予执行的权限:
chmod +x jpsall
测试效果:
jpsall
测试有效时,将脚本分发到其他服务器上,这样其他服务器也能使用:
xsync /home/mrlin/bin/
(1)在hadoop102启动集群的时候,报hadoop104无权限问题,查看hadoop104中的hadoop文件是什么用户,这里是root用户时,因为用户的权限不同,会报无权限问题。
解决方法:修改hadoop104的hadoop文件的用户为mrlin即可,就是跟hadoop102上面属于同一用户。
(2)is running 233589248B beyond the ‘VIRTUAL’ memory limit. Current usage: 10.0 MB of 1 GB physical memory used; 2.3 GB of 2.1 GB virtual memory used. Killing container.
这是因为虚拟内存的检查导致,将虚拟内存的检查关闭即可。
解决方法:在 yarn-site.xml 配置文件中添加如下虚拟内存的检测关闭即可。
<property>
<name>yarn.nodemanager.vmem-check-enabledname>
<value>falsevalue>
property>
修改完之后,注意分发到其他服务器上面。然后重启yarn服务。
xsync /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml
sbin/stop-yarn.sh
sbin/start-yarn.sh
(3)虚拟机卡死,断电后重启报错/run/initramfs/rdsosreport.txt
解决方法:
# 第一步:首先输入命令查看mapper下面有哪些设备
ls /dev/mapper
# 第二步:输入命令修复centos-root
xfs_repair /dev/mapper/centos-root -L
# 第三步:重启
reboot
(4)不识别主机名称
解决方法:在 /etc/hosts 文件中添加ip地址和主机名称的对应关系
192.168.20.102 hadoop102
192.168.20.103 hadoop103
192.168.20.104 hadoop104
192.168.20.105 hadoop105
(5)修改环境变量后不生效
一般查看是否没有执行更新命令导致。
解决方法:source /etc/profile