hadoop入门

一、hadoop的组成

引自尚硅谷教程P12

截图

1.1 hdfs的组成

引自尚硅谷教程p13

1.2 yarn的组成

引自尚硅谷教程p14

1.3 Mapreduce组成

Mapreduce 将计算过程分为两个阶段:Map和Reduce
1). Map阶段输入数据;
2). Reduce阶段对对数据进行汇总;

1.4 hdfs、yarn、Mapreduce三者之间的关系

引自尚硅谷教程p16

1.5 大数据技术整体生态体系

引自尚硅谷教程p17

1.6 软件推荐功能实现的大致流程

引自尚硅谷教程p17

1.7 hadoop的运行模式

引自尚硅谷教程p26

1.8 hadoop常用端口号

1.9 hadoop入门的两道面试题

引自尚硅谷教程p36

二、haddop的运行环境搭建

2.1 搭建模板虚拟机hadoop100

1. 安装vmware(B站或者其它网站上有,我是在百度网盘上下载的vmware16.2.3)

2. 安装centos7.5

3. 然后开始创建一个新的虚拟机,具体步骤如图所示:

1)点击创建新的虚拟机

2)自定义

3)不用动继续下一步

4)稍后安装操作系统

5)选择系统和版本

6)输入虚拟机名称和位置

7)根据电脑的配置设置处理器数量和内核数

8)根据需要选择内存

9)使用net网络

10)接下来两步都使用推荐的就好

11)创建新的虚拟磁盘

12)根据需要设置磁盘大小

13)指定磁盘位置(还是和虚拟机放在一起)

14)完成

4. 下面开始安装centos系统

1)先打开任务管理器性能查看虚拟化技术是否打开

2)点击CD/DVD插入系统硬盘

3)使用ISO映像文件

4)点击浏览打开之前下载的centos镜像

5)点击确定,然后编辑虚拟机设置->选项->高级(因为在电脑上安装了docker),把侧通道缓解关掉,要不然可能会导致虚拟机性能降低(因为已经把hyper-v关掉了,所以这一步删除掉)

6)打开虚拟机等待安装

7)选择语言简体中文

8)设置日期和时间

9)点击软件选择,设置安装的版本(由于我已经安装过一遍了,所以我就选择最小系统安装,没有桌面)

10)点击安装位置->点击我要配置分区->点击完成->来到手动分区页面

11)点击+号,首先添加挂载点/boot,容量设置为1g,这个是设置虚拟机开机所需要的内存,然后点击添加挂载点,并把文件系统设置为etx4

12)继续点击+号添加/swap挂载点,容量设置为4g,这个是相当于备用内存,当内存不够的时候就可以用这4g内存

13)继续点击+号添加根目录/挂载点,剩下45g全部是根目录

14)全部添加完毕,点击完成,然后点击接受更改

15)然后点击kdump,这个是设置当虚拟机崩溃的时候将崩溃的数据保存在哪里,用多少容量保存,由于学习阶段资源有限,所以不配置kdump,直接取消

16)最后设置网络和主机名,将主机名称改为hadoop100,打开以太网

17)全部设置完成后点击开始安装,耐心等待,在安装期间可以设置一下root的密码(我设置了6个1),也可以创建一个普通用户,但是感觉好像也没什么用,所以暂时不创建,需要时再创建

18)等半天,看它完成了以后点击重启,重启完成后就是这个页面,很简陋的页面,登录目前只有root一个用户,没有普通用户

5.下面开始配置IP地址和主机名称

1)打开vmware->编辑->虚拟网络编辑器->点击vmnet8->更改设置->点击vmnet8->将子网IP修改为192.168.10.0->再点击nat设置->将网关IP修改为192.168.10.2后点击确定

2)win10电脑->所有设置->网络和Internet->更改适配器选项->右键vmnet8点击属性->双击Internet版本协议4->将这些改为如图所示->点击确定

3)进入虚拟机电脑,使用root账号(当然目前只有这一个账号),进入后输入命令:vi /etc/sysconfig/network-scripts/ifcfg-ens33,将bootproto改为static,还要把onboot改成yes,然后添加如图所示的最后三行

4)保存后再次输入命令:vi /etc/hostname 修改并查看主机名称,输入命令:vi /etc/hosts ,添加如图所示最后几行并保存退出

5)输入reboot命令重启,由于是最小安装,所以ifconfig命令识别不出来,输入命令:yum install net-tools,再次输入命令:ifconfig即可查看ip地址,ping baidu.com 查看是否可以连接外网,至此,ip地址和主机名称配置完毕。

6.Xshell远程连接

1)首先安装Xshell,自己装吧
2)先去window10 C:\Windows\System32\drivers\etc 路径下,打开hosts文件,直接记事本打开就可以,然后加入如图所示的几行

3)然后就可以用主机名称直接用xshell连接了,然后用户身份验证

4)连接成功!连接成功以后在安装xftp,也是你自己装吧

7.完善模板虚拟机

1)输入命令:yum install -y epel-release 安装epel软件库,主要提供一些额外的软件包(首先确定是有网的)
2)centos最小版,没有net-tools包和vim工具,上面net-tools已经安装了,vim 我感觉可以不装,vi就可以用
3)然后就是关闭防火墙,一般公司只会在外部设置防火墙,内部服务器是不设置的,所以把防火墙关掉,每次开机也都关掉,即永久关闭防火墙,输入命令:systemctl stop firewalld 还有 systemctl disable firewalld.service
4)进入/opt/路径中创建一个software文件夹用来装以后下载的软件等,完成这些以后重启,模板机就搭好了

2.2 搭建hadoop集群

1. 克隆三台虚拟机

1)首先在克隆之前先把模板虚拟机关机,然后右键虚拟机->管理->克隆

2)下一页->当前状态->下一页->创建完整克隆->下一页-

3)设置新克隆的虚拟机的名称和位置,这里是hadoop102->点击完成,很快就可以完成克隆,然后关闭,就克隆完毕了

4)同理,按照同样的方法克隆虚拟机hadoop103,hadoop104

2. 修改各个虚拟机的IP地址和主机名称

1)克隆完成后,由于hadoop102,103,104的IP地址和主机名称还是hadoop100的,所以还需要修改一下,逐个虚拟机输入命令:vi /etc/sysconfig/network-scripts/ifcfg-ens33 修改IP地址,然后输入命令:vi /etc/hostname 来修改主机名称,修改完成后输入reboot重启,因为如果你不重启的话上述命令还没有生效。
2)然后逐个虚拟机验证是否修改成功,可以使用hostname或者ifconfig 或者ping等,验证完成连接xshell。

3. 在hadoop102上安装并配置jdk和hadoop

1)从oracle网站下载jdk8,hadoop官网下载太慢了,照它这个速度得明年才能下完,用清华大学开源软件镜像站下载hadoop3.2.3,速度比较快。
2)然后把下载好的jdk和hadoop用xftp上传到hadoop102虚拟机中路径/opt/software中,使用命令解压jdk:tar -zxvf jdk-8u371-linux-x64.tar.gz,解压好后进入/etc/profile.d ,输入命令:vi my_env.sh,创建新的文件,输入如下代码并保存退出,然后输入命令:source /etc/profile 使修改的文件生效,最后输入java,检验是否配置成功。(出现长串java相关命令即为成功)

#JAVA_HOME
export JAVA_HOME=/opt/software/jdk1.8.0_371
export PATH=$PATH:$JAVA_HOME/bin

3)现在开始解压hadoop,输入命令:tar -zxvf hadoop-3.2.3.tar.gz,输入命令:vi /etc/profile.d/my_env.sh,继续在该文件中输入如下代码并保存退出,同样的输入命令:source /etc/profile 使修改的文件生效,最后输入hadoop,检验是否配置成功。

#HADOOP_HOME
export HADOOP_HOME=/opt/software/hadoop-3.2.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

4.使用scp安全拷贝命令将数据拷贝到hadoop103和104中

引自尚硅谷教程p27


1)在hadoop102虚拟机输入命令:scp -r /opt/software/jdk1.8.0_371/ root@hadoop103:/opt/software/,然后输入yes,再输入hadoop103的密码,然后在虚拟机hadoop103查看是否拷贝成功。
2)相反的,也可以在hadoop103虚拟机中输入命令:scp -r root@hadoop102:/opt/software/hadoop-3.2.3/ /opt/software/,输入yes,再输入hadoop102的密码,将hadoop安全拷贝到hadoop103中,在hadoop103中查看是否拷贝成功。(这分别是安全拷贝命令scp的两种拷贝方式:推送数据和拉取数据)。
3)还有一种比较神奇滴,就是在hadoop103虚拟机上将hadoop102上的数据拷贝到hadoop104上,输入命令scp -r root@hadoop102:/opt/software/ root@hadoop104:/opt/software/*,然后就是需要依次输入hadoop102的密码,输入yes,再输入hadoop104的密码就可以了。

5.使用rsync命令分发

相比scp,rsync只拷贝有变化的部分,效率比scp高,所以在第一次复制时就是用scp命令,后续发生变化有部分改动时可以使用rsync命令。

引自尚硅谷教程p27

6.创建xsync脚本分发集群

1)在~/路径下输入命令:mkdir bin ,创建bin文件,进入bin文件夹,输入命令:vi xsync创建xsync文件,将如下代码填入后保存退出,现在该文件还没有可执行的权限,所以输入命令:chmod 777 xsync,赋予其执行权限,在使用该命令之前,输入命令:yum install -y rsync(上一步已经下载好的话可以跳过)(注意!!!每一台虚拟机都要下载rsync),下载好后现在使用xsync脚本将该bin目录同步到集群所有的虚拟机内,进入到~/目录,输入命令:xsync bin/ ,接下来每台虚拟机需要输入两遍密码,传输完成后进入另外两台虚拟机检查是否分发成功。

#!/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)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done

2)确认该分发脚本可以使用后,输入命令:xsync /etc/profile.d/my_env.sh ,即将之前设置好的环境变量也分发到其它虚拟机上去,完成后查看是否成功。分发该环境变量后还需要在每台虚拟机上输入命令:source /etc/profile ,使环境变量生效,完成后输入: java或者hadoop检查其是否生效。

7.设置集群ssh免密登录

1)首先在hadoop102上输入命令:ssh-keygen -t rsa (任何路径下都可以执行),然后连续回车三次,会生成hadoop102虚拟机的公钥和私钥,进入到 /.ssh/目录(该目录是隐藏文件,可以在/目录下使用ls -al命令查看到所有隐藏文件)下就可以看到该虚拟机的公钥和私钥,为了可以实现在hadoop102上无密访问hadoop103,需要将hadoop102的公钥拷贝到hadoop103上,输入命令:ssh-copy-id hadoop103 (同样的在任何路径下都可以),然后输入hadoop103的密码,即可免密连接103。输入命令:ssh hadoop103 可检验是否可以免密登录hadoop103,进入成功后输入exit即可退出。按照同样的方法,把公钥拷贝到hadoop102、104,是的,本机ssh访问也需要输入密码,而且注意虚拟机上的不同用户ssh是不互通的,普通用户的ssh免密只针对普通用户有效,root用户还是需要密码,按需设置就好。由于本机上只有root一个用户,所以就配置一遍了。
2)同理,在hadoop103上按照上述方法配置对三台虚拟机(包括本机)设置ssh免密登录,hadoop104同理。全部设置完成后,xsync集群分发命令就可以无需密码快速分发了。而且每台虚拟机进入到 ~/.ssh/ 目录下后可以看到存在 authorized_keys 文件,该文件是保存可以无密登录自己虚拟机的其它虚拟机。

8.配置完全分布式的hadoop102、103、104集群

集群部署规划,引自尚硅谷教程p30


1)首先在hadoop102虚拟机配置core-site.xml文件,进入到/opt/software/hadoop-3.2.3/etc/hadoop/路径下找到core-site.xml文件,(因为我只配置了root一个用户,增加用户的话按需修改)将如下代码插入到正确的位置中

<!--指定namenode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!--指定hadoop数据的存储目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/software/hadoop-3.2.3/data</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 root -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>

2)下面配置hdfs-site.xml,与core-site.xml在相同目录下,将如下代码插入到正确的位置上

<!--nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!--2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>

3)配置yarn-site.xml文件,目录同上,将如下代码插入到正确的位置上

<!--指定MR走shuffle-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定Resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</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>

4)配置mapred-site.xml文件,目录同上,将如下代码插入到正确的位置上

<!--指定mapreduce程序运行在yarn上-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

5)配置workers文件,目录同上,输入集群中所有的虚拟机主机名称,以本集群为例,输入如下代码,且不允许有空格和回车等

hadoop102
hadoop103
hadoop104

6)在hadoop102上配置完成后还需要执行命令:xsync /opt/software/hadoop-3.2.3/etc/hadoop/ 来分发到集群中其它的虚拟机上,然后进入其它虚拟机检查一下。

9.启动集群

引自尚硅谷教程p31

1)第一次启动集群需要进行初始化,后续则不在需要初始化。首先在hadoop102虚拟机上进入 /opt/software/hadoop-3.2.3 路径下输入命令:hdfs namenode -format ,和格式化差不多,如果没有报错的话就是初始化成功了,成功以后,在该目录下会出现data和logs两个目录,注意在 /opt/software/hadoop-3.2.3/data/dfs/name/current 目录下的 VERSION 文件记载了该集群的版本信息。
2)初始化成功后就可以启动hdfs了,在hadoop102上进入 /opt/software/hadoop-3.2.3 下输入 sbin/start-dfs.sh 命令启动,然后用jps查看各个虚拟机上运行的结点是否正确,当然了,我就知道你第一次肯定启动不起来,或者崩溃或者缺少结点怎么办呢,首先把每台虚拟机的结点都停掉,停不掉的用kill -9 命令强制停,然后把每台虚拟机上的 /opt/software/hadoop-3.2.3/ 路径下的 data 和 logs 目录删除掉,然后执行上述的初始化命令,最后才可以重新启动。
3)说一下我自己遇到的问题,我的集群倒是没有崩溃,因为我只有root这一个用户,然后启动hdfs的时候报这个错了(如下图)

我也是第一次遇到这个问题,然后上网搜了一下,有很多解决办法,然后我就挑了一个办法,就是在hadoop目录下的sbin目录下,在 start-dfs.sh 和 stop-dfs.sh 这两个文件的顶部添加以下代码

HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

在 start-yarn.sh 文件和 stop-yarn.sh 文件顶部输入以下代码

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

因为我的结点根本就没有启动起来,所以我没有删除data和logs文件,也没有重新初始化,直接在hadoop102上改完以后分发到另外两台然后直接启动,成功了。启动hdfs成功后就可以访问hdfs的外部网站,网站地址:http://hadoop102:9870/
4)访问成功后进入hadoop103进入/opt/software/hadoop-3.2.3/输入命令:sbin/start-yarn.sh,启动成功后查看节点是否缺失。正确启动后可以进入网站http://hadoop103:8088/查看yarn的资源调度页面。至此,集群启动成功。

10.集群启动/停止方式总结

引自尚硅谷教程p35

11.配置历史服务器

1)为了查看程序的历史运行情况,需要配置历史服务器。首先进入hadoop102虚拟机 /opt/software/hadoop-3.2.3/etc/hadoop/ 路径内,更改 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>

2)保存退出后输入命令:xsync mapred-site.xml 分发到其它虚拟机上。配置完成后如果yarn是开着的,需要把yarn关掉重新开启,如果yarn没有开,就直接启动yarn就可以了。启动成功后还需要在hadoop102的路径 /opt/software/hadoop-3.2.3/ 目录下输入命令: bin/mapred --daemon start historyserver 来启动历史服务器,启动成功后jps检查是否存在JobHistoryServer进程。至此,历史服务器配置完成,可以在http://hadoop102:19888/网站查看历史任务进程。

12.配置日志聚集

1)可以方便的查看到程序的运行详情,方便开发调试。首先进入到hadoop102虚拟机 /opt/software/hadoop-3.2.3/etc/hadoop 路径下,更改 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 yarn-site.xml 分发,然后在hadoop102 下关闭历史服务器,输入命令:mapred --daemon stop historyserver ,然后进入hadoop关闭yarn再打开yarn,回到hadoop102 再打开历史服务器。

13.编写集群启停脚本和查看集群jps脚本

1)首先在hadoop102上进入 ~/bin/ 路径下,输入命令:vi myhadoop.sh ,(和xsync同一级目录)添加如下代码

#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop 集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop102 "/opt/software/hadoop-3.2.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop103 "/opt/software/hadoop-3.2.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop102 "/opt/software/hadoop-3.2.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop 集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop102 "/opt/software/hadoop-3.2.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop103 "/opt/software/hadoop-3.2.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop102 "/opt/software/hadoop-3.2.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac

输入命令:chmod 777 myhadoop.sh 赋予其执行权限,然后执行命令:myhadoop.sh stop ,查看其执行情况是否关闭成功,然后执行命令:myhadoop.sh start ,查看是否启动成功。
2)现在开始编写查看集群所有虚拟机java进程的脚本,同样进入hadoop102虚拟机 ~/bin/ 目录下,输入命令:vi jpsall ,添加如下代码

#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done

添加完成后输入命令:chmod 777 jpsall 来赋予脚本执行权限,然后用xsync分发myhadoop.sh 和jpsall两个脚本,使其在任何一台虚拟机上都可以运行。

posted @   KongLong_cm  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示