hadoop发展历史
namenode,记录每个文件块存储位置,数据存储在什么位置,防止单节点故障,会有secondary namenode作为秘书
datanode,具体存储数据
yarn是一个资源管理器,cpu,内存。
resourcemanager 是整个集群资源管理的老大
node manager是单节点资源管理老大
客户提交任务给resourcemanager,
applicationmaster是单个任务运行的老大,会去给resourcemanager申请资源,可以多节点,多任务
任务是在container运行的。
客户端可以有多个
集群上可以运行多个applicationmaster
每个nodemanager上可以有多个container
namenode告诉别人数据存储在哪个节点上, datanode真正存储数据。
namenode宕机了,2nn就会想办法从namenode的备份中恢复数据
yarn负责整个集群资源调度管理。
client发送请求 ,resourcemanager就会找一个节点开启一个任务applicationmaster,开启一个container,applicationmaster找到有资源的节点,开启container创建map阶段的任务,每个map的结果汇总写到datanode
mapreduce基于硬盘,spark基于内存,hive类似sql查询
解压到安装目录
配置环境变量
etc/profile会循环遍历环境变量文件
解压
配置环境变量
hadoop的目录介绍
bin目录下可执行文件后期会用到
etc下有很多组件的配置文件
inclue类似c语言的头文件
lib是本地动态链接库
sbin是一些启动服务的脚本,hadoop-daemon启动单节点
share是一些学习文档
一些需要准备的东西
创建个文件随机放单词,统计单词个数
执行一个mapreduce统计,必须有输入输出的位置
查看结果
再执行一次,文件提示已经存在,因为输出的路径在执行的时候是不能存在的
把jdk拷贝到其他机器上
103拷贝102的文件,一种拉数据,一种推数据
也可以指定一台主机到另一台主机
rsync是同步工具
删除103之前的文件夹
把102的hadoop文件夹同步到103,实际相差就是wcinput和wcoutput两个文件,时间很短
第一次可以用scp,后面同步可以rsync
#!/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
获取当前文件父目录
随便测试一下
配置102免密登录103,104
拷贝公钥至103,104
允许谁免密登录自己
103和104也互相配置免密登录
102的root用户最好也配置下免密登录
现在就不需要输入密码了
hadoop配置文件分两大类,默认配置文件和自定义配置文件
(1)核心配置文件
配置core-site.xml
[atguigu@hadoop102 ~]$ cd
H
A
D
O
O
P
H
O
M
E
/
e
t
c
/
h
a
d
o
o
p
[
a
t
g
u
i
g
u
@
h
a
d
o
o
p
102
h
a
d
o
o
p
]
HADOOP_HOME/etc/hadoop [atguigu@hadoop102 hadoop]
HADOOPHOME/etc/hadoop[atguigu@hadoop102hadoop] vim core-site.xml
文件内容如下:
fs.defaultFS hdfs://hadoop102:8020 内部通信端口,有些使用9000,9820hadoop.tmp.dir /opt/module/hadoop-3.1.3/data hadoop.http.staticuser.user atguigu
默认数据存在/tmp目录下,默认情况tmp会一个月删除一次
102修改core-site
(2)HDFS配置文件
配置hdfs-site.xml
[atguigu@hadoop102 hadoop]$ vim hdfs-site.xml
文件内容如下:
dfs.namenode.http-address hadoop102:9870 dfs.namenode.secondary.http-address hadoop104:9868
(3)YARN配置文件
配置yarn-site.xml
[atguigu@hadoop102 hadoop]$ vim yarn-site.xml
文件内容如下:
yarn.nodemanager.aux-services mapreduce_shuffle yarn.resourcemanager.hostname hadoop103 yarn.nodemanager.env-whitelist JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME
整个配置和默认的区别就是HADOOP_MAPRED_HOME,属于3.1.3小bug,到了3.2之后,不需要配置环境变量,HADOOP_MAPRED_HOME也帮你加上了
(4)MapReduce配置文件
配置mapred-site.xml
[atguigu@hadoop102 hadoop]$ vim mapred-site.xml
文件内容如下:
mapreduce.framework.name yarn
默认是在本地进行调度
102把配置好的文件分发过去
注意不允许有空格
分发配置好的workers文件
第一次启动之前需要格式化
初始化后data下会生成一个dfs目录
version里会有当前服务器的版本号
启动集群,在sbin,start-dfs.sh
现在hdfs就启动完成了
现在启动resourcemanager,在103上
yarn也有web页面
集群启动后,做基本测试
创建一个目录
上传文件
传一个大文件

这个就是刚才传的文件
查看刚才存的jdk
这就是一个jdk
hdfs的存储位
执行一个任务,让yarn调度
输入输出的路径就是要在hadoop跟目录下
多了个任务
然后就可以在hdfs查看结果
假如现在集群 异常了
data数据也删除
把103的数据也删除
但是现在数据还是能下载下来
104的数据也删除
现在就无法删除了
无法恢复,第一种可以先格式化
集群停掉之前先把yarn停止
查看是否能正常启动
现在就没有namenode了,因为之前把data删除了
新恢复的节点的namenode版本号和原先不一样
但是 namenode没起来
正确的处理如下,先杀死进程
删除每个集群上的data和logs
第三步,接下来开始 格式化
初始化后开始启动集群
集群已经恢复,但现在没有历史数据
原因在于,之前namenode有版本号,配套的datanode也有版本号
之前新老版本不一致,就无法访问
5)查看JobHistory
http://hadoop102:19888/jobhistory
10020是内部通信用,19888是给用户 浏览web的地址
分发配置文件
如果yarn已经启动,需要把yarn重启
历史服务器需要手动启动
上传一个数据
进行单词统计
现在就可以点击history了
这里是记录程序运行的日志
提示聚集功能 无法使用
只有开启 了聚集日志,用户才能通过接口查看日志
默认的日志聚集功能是一个关闭状态
分发配置文件
重启历史服务器,但是基于单节点
重启yarn
再启动历史服务器
再次执行一次任务
这里就是详细的日志信息
单独启动datanode
单节点启动停止yarn
编写Hadoop集群常用脚本
1)Hadoop集群启停脚本(包含HDFS,Yarn,Historyserver):myhadoop.sh
[atguigu@hadoop102 ~]$ cd /home/atguigu/bin
[atguigu@hadoop102 bin]$ vim 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
保存后退出,然后赋予脚本执行权限
[atguigu@hadoop102 bin]$ chmod +x myhadoop.sh
先试试关闭
测试启动
2)查看三台服务器Java进程脚本:jpsall
[atguigu@hadoop102 ~]$ cd /home/atguigu/bin
[atguigu@hadoop102 bin]$ vim jpsall
输入如下内容**
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
保存后退出,然后赋予脚本执行权限
[atguigu@hadoop102 bin]$ chmod +x jpsall
3)分发/home/atguigu/bin目录,保证自定义脚本在三台机器上都可以使用
[atguigu@hadoop102 ~]$ xsync /home/atguigu/bin/
2)时间服务器配置(必须root用户)
(1)查看所有节点ntpd服务状态和开机自启动状态
[atguigu@hadoop102 ~]$ sudo systemctl status ntpd
[atguigu@hadoop102 ~]$ sudo systemctl start ntpd
[atguigu@hadoop102 ~]$ sudo systemctl is-enabled ntpd
(2)修改hadoop102的ntp.conf配置文件
[atguigu@hadoop102 ~]$ sudo vim /etc/ntp.conf
修改内容如下
(a)修改1(授权192.168.10.0-192.168.10.255网段上的所有机器可以从这台机器上查询和同步时间)
#restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap
为restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap
(b)修改2(集群在局域网中,不使用其他互联网上的时间)
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
为
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
(c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3)修改hadoop102的/etc/sysconfig/ntpd 文件
[atguigu@hadoop102 ~]$ sudo vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(4)重新启动ntpd服务
[atguigu@hadoop102 ~]$ sudo systemctl start ntpd
(5)设置ntpd服务开机启动
[atguigu@hadoop102 ~]$ sudo systemctl enable ntpd
3)其他机器配置(必须root用户)
(1)关闭所有节点上ntp服务和自启动
[atguigu@hadoop103 ~]$ sudo systemctl stop ntpd
[atguigu@hadoop103 ~]$ sudo systemctl disable ntpd
[atguigu@hadoop104 ~]$ sudo systemctl stop ntpd
[atguigu@hadoop104 ~]$ sudo systemctl disable ntpd
(2)在其他机器配置1分钟与时间服务器同步一次
[atguigu@hadoop103 ~]$ sudo crontab -e
编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate hadoop102
(3)修改任意机器时间
[atguigu@hadoop103 ~]$ sudo date -s “2021-9-11 11:11:11”
(4)1分钟后查看机器是否与时间服务器同步
[atguigu@hadoop103 ~]$ sudo date
启动时间同步服务
这个配置代表允许192.168.10网段的机器访问本机进行同步
不连接外网时钟
当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步
让硬件时间与系统时间一起同步
让103,104周期性和102同步
103和104关闭对外同步
crontab设置每分钟同步
测试修改103时间,后面进行同步
一分钟后时间 已经同步
1)防火墙没关闭、或者没有启动YARN
INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
2)主机名称配置错误
3)IP地址配置错误
4)ssh没有配置好
5)root用户和atguigu两个用户启动集群不统一
6)配置文件修改不细心
7)不识别主机名称
java.net.UnknownHostException: hadoop102: hadoop102
at java.net.InetAddress.getLocalHost(InetAddress.java:1475)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:146)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
解决办法:
(1)在/etc/hosts文件中添加192.168.10.102 hadoop102
(2)主机名称不要起hadoop hadoop000等特殊名称
8)DataNode和NameNode进程同时只能工作一个。
9)执行命令不生效,粘贴Word中命令时,遇到-和长–没区分开。导致命令失效
解决办法:尽量不要粘贴Word中代码。
10)jps发现进程已经没有,但是重新启动集群,提示进程已经开启。
原因是在Linux的根目录下/tmp目录中存在启动的进程临时文件,将集群相关进程删除掉,再重新启动集群。
11)jps不生效
原因:全局变量hadoop java没有生效。解决办法:需要source /etc/profile文件。
12)8088端口连接不上
[atguigu@hadoop102 桌面]$ cat /etc/hosts
注释掉如下代码
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 hadoop102
配置hdfs网页登录使用的静态用户为atguigu,否则无法删除文件
重启hadoop
现在就可以删除了
这个blocksize ,是指这个块最多128M,也就是word.txt最多128M,现在只有36b,128M其余的还是可以让其他文件使用的
也试一下
查看使用几个块进行存储的
block1就是剩下的内容



