目标
- 搭建 yarn伪分布式
- 跑mr count案例
- 整理 jps命令
- Linux两个机制 oom clean
Yarn伪分布式部署&单点&主从架构
由于hadoop集成了MapReduce和Yarn,所以这里我们只要修改相关的配置文件即可使用
我们需要配置mapred-site.xml
和yarn-site.xml
这两个文件,由于mapred-site.xml
不存在所以需要复制一个出来
[hadoop@aliyun hadoop]$ cp mapred-site.xml.template mapred-site.xml |
然后用vim
打开mapred-site.xml
并修改
vim mapred-site.xml
<configuration> |
然后用vim
打开yarn-site.xml
并修改文件
vim yarn-site.xml
<configuration> |
注意:
这是使用38088替代默认的8088是为了避免云主机被挖矿
最后启动Yarn
[hadoop@aliyun hadoop]$ start-yarn.sh |
最后再用ps -ef
命令验证ResourceManager
程序是否真的启动完成
[hadoop@aliyun hadoop]$ netstat -nlp|grep 32415 |
启动完成,可以去玩wordcount
案例了
使用MapReduce运行WordCount案例
在data目录下创建mapreduce的输入文件
[hadoop@aliyun data]$ vim name.log
ruozedata |
把name.log文件put到hdfs上
[hadoop@aliyun data]$ hdfs dfs -mkdir -p /wordcount/input |
使用hadoop jar 运行案例
hadoop jar share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.16.2.jar wordcount /wordcount/input /wordcount/output |
查看结果
[hadoop@aliyun hadoop]$ hdfs dfs -cat /wordcount/output/* |
jps命令不为人知的地方
我们想既然jps可以直接运行,肯定在APTH路径下,我们何不which一下看看
[hadoop@aliyun hadoop]$ which jps |
原来jps是一个java命令,我们使用一下jps看看它有什么作用
[hadoop@aliyun hadoop]$ jps |
jps命令打印出来了hadoop组件里面的程序pid和程序名,引申出这些程序都属于java程序,结合jps属于java命令,得出jps打印出来所有运行的java程序
我们可以从启动程序的脚本中得到pid和程序名存放的文件,这里就不去debug,他们默认存放在/tmp目录下一个叫做hsperfdata_用户名的文件下
[hadoop@aliyun tmp]$ ll hsperfdata_hadoop/ |
每个pid对应是一些二进制文件,没啥好看的,我们发现这个文件下还有一些以pid结尾的文件,文件保存的其实也是各自对应的pid号码,但是这里的.pid文件是进程自己创建的。用来管理和结束进程的。
[hadoop@aliyun tmp]$ ll grep *.pid |
[hadoop@aliyun tmp]$ cat hadoop-hadoop-datanode.pid |
所以jps命令的作用就明白了,在使用jsp命令时,会去/tmp目录下/hsperfdata_username目录下找到程序的pid和程序名并打印出来,/tmp/hsperfdata_username目录会存放该用户所有已经启动的java进程信息。
这里需要get到一个很关键的知识点,它可能让你在shell脚本中犯错,那就是进程所属的用户去执行 jps命令,只显示自己的相关的进程信息,也就是说,其他用户使用jps命令查看不到本用户启动的程序,root用户可以看所有的,但是显示不可用,我们这里就用root用户尝试一下
我在这里翻车了,使用root显示出来了所有的进程,原因不明,但是其他普通用户无法显示
aliyun:mysqladmin:/usr/local/mysql:>jps |
这同样能得出我们想要的结果,那就是其他用户使用jps不能查看到本用户启动的java程序。其原理我们看看这个文件夹的权限就知道了
[hadoop@aliyun tmp]$ ll hsperfdata_hadoop/ |
最后总结一下我们在判断一个程序是否在运行时,切不可使用jps命令,因为jps命令只能查看本用户的java进程,那我们在shell脚本中应该如何判断一个程序是否存在?使用万能的ps -ef。
[hadoop@aliyun tmp]$ ps -ef|grep 781 | grep -v grep | wc -l |
Linux的oom-kill和clean机制
在最后我们说一下在使用hadoop时会遇到的两个坑,而且还都是Linux自带的特性,以及解决的方法。
oom-killer机制:
大数据程序是非常吃内存的,而在Linux内核检测到系统内存不足后,会触发oom-killer,挑选占用最大内存的进程杀掉。
如果我们的进程突然断了,首先查看日志找EROOR
,有ERROR
具体分析,没有ERROR
但是INFO
信息断了,很可能就是触发了oom-killer机制
,使用free -h
命令查看内存使用情况,再使用cat /var/log/messages | grep oom
命令查看有没有类似于Killed process
的命令,如果有,就是触发了oom-killer机制
clean机制:
Linux的/tmp目录是一个临时目录,它有一个机制,默认清理超过30天的内容,而前面使用jps
命令的时候就发现,hadoop
的进程pid
都存放在/tmp
目录中,启动进程的时候去/tmp
目录下创建对应的pid
文件,结束进程的时候去/tmp
目录下找到程序对应的pid
用来结束进程并删除pid
文件,那么引申出来一个问题,如果我们的hadoop
组件进程启动时间超过了30天了呢,pid
文件被清理,结束命令找不到pid
号,会再重新创建一个pid
,结果就是pid
号紊乱,进程无法正常结束。
解决的办法
就是在家目录下面创建一个tmp目录,然后把hdfs和yarn的pid号管理文件夹设置成家目录下的tmp目录即可。
[hadoop@aliyun hadoop]$ vi hadoop-env.sh |