一、上次课回顾
- https://blog.csdn.net/zhikanjiani/article/details/89382036
二、HDFS三个进程都以当前用户启动
HDFS三个进程都以当前用户启动:我的当前用户是hadoop
Hadoop启动解析:
1、现在发现NameNode和DataNode都是从localhost机器上启动的,SecondaryNameNode是从0.0.0.0机器上启动的。
注意:
生产上是不会允许这么做的,所以我们hdfs的三个进程都要使用hadoop用户来进行启动;
如何配置?
进入到如下目录:/home/hadoop/app/hadoop/etc/hadoop;
干掉该目录下后缀为.cmd的文件(windows上的配置),rm -f *.cmd
etc/hadoop目录下常用的几个配置文件?
[hadoop@hadoop004 hadoop]$ ll
total 144
-rw-r--r-- 1 hadoop hadoop 905 Jun 30 01:14 core-site.xml //把hdfs、mapreduce、yarn单独做一个xml文件
-rw-r--r-- 1 hadoop hadoop 4293 Jun 29 23:53 hadoop-env.sh //JDK目录、hadoop家目录
-rw-r--r-- 1 hadoop hadoop 887 Jun 29 21:00 hdfs-site.xml //需要部署
-rw-r--r-- 1 hadoop hadoop 1383 Mar 24 2016 mapred-env.sh
-rw-r--r-- 1 hadoop hadoop 883 Jun 30 00:12 mapred-site.xml
-rw-r--r-- 1 hadoop hadoop 10 Mar 24 2016 slaves
-rw-r--r-- 1 hadoop hadoop 4567 Mar 24 2016 yarn-env.sh
-rw-r--r-- 1 hadoop hadoop 833 Jun 30 00:12 yarn-site.xml
第一个修改:core-site.xml(NameNode进程)
生产学习上:统一用机器名hostname部署,不要用ip部署;
为什么使用hostname部署?
- 生产上网段变化,那所有ip都要去改,太过繁杂,所以我们只要在etc/hosts文件中做好映射关系就行。
注意:千万不要买etc/hosts中的前两行自带的删除,会出事;服务会出问题
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop:9000</value>
</property>
</configuration>
第二个修改:slaves(DataNode进程)
-
我们在以后的学习中会做很多DataNode,小弟就在salves中配置;
-
万一以后有很多小弟,如何操作,在slaves文件中进行如下添加即可:
hadoop001,hadoop002,hadoop003,hadoop004,hadoop005…
第三个修改:hdfs-site.xml(SecondaryNameNode)
1、官方给出的所有参数和默认值及意思:
- http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html
2、在打开hadoop.apache.org后,点击getting started,鼠标拉到底,左下角有几行Configuration,是一些默认配置参数。
修改的是hdfs-site.xml,我们找到hdfs-default.xml。
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop:50090</value>
</property>
<property>
<name>dfs.namenode.secondary.https-address</name>
<value>hadoop:50091</value>
</property>
</configuration>
上述修改好后即配置成功。
3、sbin/start-dfs.sh再次进行启动,会有一个提示如下,原因:我们并没有以hadoop用户进行一次信任关系,我们之前做的是以localhost做的ssh信任关系,那我们怎么操作呢?
- 重新构建ssh信任的关系即可。
赘述构建单台机器ssh信任关系
1、回到/home/hadoop目录下,rm -rf .ssh
2、ssh-keygen 四个回车
3、cd .ssh 进入到.ssh目录下 cat id_rsa.pub >> authorized_keys 将公钥文件追加到认证文件当中
4、start-dfs.sh启动,提示还要输入密码,且密码不正确,需要赋予authorized_keys这个文件600权限。
https://blog.csdn.net/zhikanjiani/article/details/89205904
三、jps命令和pid进程剖析
3.1 jps命令剖析
1、hadoop用户下jps查看到的:
[hadoop@hadoop hadoop-2.6.0-cdh5.7.0]$ jps
32058 Jps
30906 SecondaryNameNode
30737 DataNode
30606 NameNode
2、在/tmp目录下的这个文件hsperfdata_hadoop,对应有三个进程标识文件
[root@hadoop ~]# cd /tmp
[root@hadoop tmp]# ll
total 48
drwxrwxr-x 3 hadoop hadoop 4096 Oct 16 10:10 hadoop-hadoop
drwxr-xr-x 2 hadoop hadoop 4096 Oct 16 11:16 hsperfdata_hadoop
[root@hadoop tmp]# cd hsperfdata_hadoop/
[root@hadoop hsperfdata_hadoop]# ll
total 96
-rw------- 1 hadoop hadoop 32768 Oct 16 11:18 30606
-rw------- 1 hadoop hadoop 32768 Oct 16 11:17 30737
-rw------- 1 hadoop hadoop 32768 Oct 16 11:18 30906
3、普通用户只能看当前用户的进程,root用户可以看所有的;普通用户加上sudo权限也相当于是root权限:
[root@hadoop hadoop]# jps
30906 -- process information unavailable
30737 -- process information unavailable
484 Jps
30606 -- process information unavailable
4、jps是java进程:
[hadoop@hadoop hadoop]$ which jps
/usr/java/jdk1.7.0_80/bin/jps
生产案例:shell脚本判断大数据组件是否是okay的,当出现process information unavailable时,去重启进程,问题:process information unavailable真的不可用么?
如何解决?去做一件事情,ps -ef|grep pid,如果出来有进程,那就是okay的;ps -ef|grep namenode,则进程是真的可用的。
测试是真的不可以用还是假的不可以用(ps -ef是否存在):
- 我们在root用户下kill掉一个进程:kill -9 30906,然后再新开一个session,还是以root用户去进行jps命令查看,发现30906进程还是在的;切换到hadoop用户30906进程是消失了。
1、在root用户下kill掉30906进程后使用jps命令发现进程还在:
2、切换到hadoop用户后jps命令发现进程已经没了:
为什么root用户还有残留信息?
- 大数据环境部署过程中,hdfs组件是用hdfs用户,我们的脚本统一的是用root用户或者sudo权限的用户去获取;基于这样的生产环境。
1、kill的情况分为2种:
- 人为
- 自动kill,进程在linux看来是耗内存最大的,会自动给kill;linux有个特性叫out of memory,系统认为进程消耗内存太大,会拖垮其它应用程序
jps命令反应的结果不知道是真的还是假的,所以推荐使用ps -ef查看进程是否真的存在
在root用户下使用命令:[root@hadoop tmp]# rm -rf hsperfdata_hadoop,再去使用jps命令查看,则没有残余进程了;干之前要看看有没有其它的进程残留。
3.2 /tmp目录下的pid文件
Linux在/tmp目录下会定期删除一些文件和文件夹,30天一个周期
- https://blog.csdn.net/qq_43688472/article/details/87872293
生产案例:/tmp目录下的pid文件给删除了,删除后进程是不会挂的,pid文件中存储的是进程号,我们测试删除hadoop-hadoop-namenode.pid,删除pid过后,命令和进程都是可以正常使用的。
存在的情况:正常大数据环境会运行几个月,哪天我们控制集群的停止,namenode进程是关不了的,因为pid文件被我们删除了。
记住两句话:
1、linux会定期清除非自己规则的文件和文件夹,当关闭和启动的时候都会有问题
[root@hadoop tmp]# cat hadoop-hadoop-namenode.pid
30606
重启集群的目的:
- 进程异常崩溃,参数进行变更需要重启生效,pid文件删除后,重新启动的时候还是旧的。
已有的进程还在,jps查看不到,ps -ef|grep namenode
如何操作使得pid文件不会被删除呢?
第一种解决方法:
1、进入到如下目录,编辑hadoop-env.sh文件
[hadoop@hadoop hadoop]$ pwd
/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop
[hadoop@hadoop hadoop]$ vi hadoop-env.sh
# The directory where pid files are stored. /tmp by default.
# NOTE: this should be set to a directory that can only be written to by
# the user that will run the hadoop daemons. Otherwise there is the
# potential for a symlink attack.
export HADOOP_PID_DIR=${HADOOP_PID_DIR}
export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR}
2、在root用户下创建目录,mkdir /data/tmp,chmod -R 777 /data/tmp,在hadoop-env.sh中找到这句话进行修改:
export HADOOP_PID_DIR=/data/tmp
第二种解决方法:
- 将一些特定的文件放进去,不被/tmp目录下的规则所删除。
3.3 为什么需要pid文件
- 依靠sbin/hadoop-daemon.sh中的pid来进行判断。
四、Yarn伪分布式部署及log日志分析
1、MapReduce:是提交到yarn上做计算的,本身不需要部署;
2、Yarn:是资源(CPU、MEMORY)和作业调度;
- eg:程序运行在上海或者杭州的机房,我们有48个core的CPU,Yarn来分配给这个作业10个Core;内存有120G,分配给它20G。
4.1 Yarn的伪分布式部署
1、You can run a MapReduce job on YARN in a pseudo-distributed mode by setting a few parameters and running ResourceManager daemon and NodeManager daemon in addition.
翻译:通过设置几个参数并运行ResourceManager和NodeManager进程,你可以在伪分布式
的yarn上提交一个MapReduce作业。
1、配置xml文件参数:
- 拷贝一份文件:cp mapred-site.xml.template mapred-site.xml
- vi etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- vi etc/hadoop/yarn-site.xml:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name> //洗牌
<value>mapreduce_shuffle</value>
</property>
</configuration>
启动YARN:
[hadoop@hadoop hadoop-2.6.0-cdh5.7.0]$ sbin/start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/logs/yarn-hadoop-resourcemanager-hadoop.out
hadoop: starting nodemanager, logging to /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/logs/yarn-hadoop-nodemanager-hadoop.out
[hadoop@hadoop hadoop-2.6.0-cdh5.7.0]$ jps
22399 ResourceManager
22716 Jps
22492 NodeManager
ResourceManager | NodeManager |
---|---|
老大 | 小弟 |
资源管理者 | 节点管理者 |
4.2 如何查看log日志及通过日志快速定位问题
至此YARN的部署过程okay。
在我们启动过程中,如果有哪个进程没启动成功,自己去hadoop目录下log文件夹中使用tail -200f 打印出对应的以log为结尾的日志内容进行排错。
如何通过日志快速定位问题:
1、ll -h * //查看日志文件大小
如果文件小,直接vi进编辑模式,尾行模式输入 : 再输入 /error,通过搜索查看error。
2、倒序查看1000行,tail -1000f
新开一个窗口重启进程再配合tail -200f 使用
eg. call from hadoop004/10.0.0.135 to hadoop004:9000 failed on connection exception: java.net.ConnectException: Connection refused
是不是端口号占用?
3、使用sz把linux上文件上传到windows,再用editplus打开排错。
4.3 Yarn的面试题
面试题:hadoop-hadoop-datanode-hadoop002.log
hadoop-用户-进程名称-机器名称 //hdfs,这里面用hadoop表示
yarn-hadoop-nodemanager-hadoop004.log //yarn
五、MR Job案例
- 在hadoop目录下,使用find ./ -name “example.jar” //在当前目录下模糊匹配搜索文件名中带“example”,并且结尾是jar的文件。
[hadoop@hadoop004 hadoop]$ find ./ -name "*example*.jar"
./share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar
./share/hadoop/mapreduce2/sources/hadoop-mapreduce-examples-2.6.0-cdh5.7.0-sources.jar
./share/hadoop/mapreduce2/sources/hadoop-mapreduce-examples-2.6.0-cdh5.7.0-test-sources.jar
./share/hadoop/mapreduce1/hadoop-examples-2.6.0-mr1-cdh5.7.0.jar
案例一:计算圆周率
1、查看命令帮助
hadoop jar
./share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar //此时回车查看命令使用
pi: A map/reduce program that estimates Pi using a quasi-Monte Carlo method.
2、正式的命令
hadoop jar ./share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi 5 20
案例二:词频统计
- 解释:wordcount 后要跟一个输入路径/wordcount/input 和一个输出路径/wordcount/output1
创建在hdfs文件系统上的,自己编写两个.log文件,进行上传。
如下操作:
1、hdfs上传件输入路径和输出路径
hdfs dfs -mkdir -p /wordcount/input
hdfs dfs -put /home/hadoop/data/a.txt /wordcount/input
注意:output1目录我们不用创建,执行时会自动创建,做好命名即可;若提前创建好,则程序压根不会执行。
2、词频统计命令
hadoop jar ./share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /wordcount/input /wordcount/output1
出现如下表示成功:
HDFS命令:hdfs dfs -get /wordcount/output1/ ./ 把output1的目录文件下载到当前目录。
5.运行mr
map:映射
reduce:规约
map、reduce执行先后顺序,并没有绝对地说,要先map执行完后才执行reduce。
六、部署出现的问题
1、NameNode不能启动的问题
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /data/tmp/hadoop-hadoop/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverStorageDirs(FSImage.java:314)
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:202)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:1063)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:767)
at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:609)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:670)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:838)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:817)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1538)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1606)
2019-10-18 13:33:07,643 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 1
2019-10-18 13:33:07,645 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hadoop/172.17.0.5
妈耶,还是用的bin/hdfs namenode -format解决的