大数据零基础班第九课 - 大数据入门(二)

一、上次课回顾

二、HDFS三个进程都以当前hadoop用户启动

三、jps命令和pid进程剖析

四、Yarn伪分布式部署及log日志分析

五、MR JOB运行案例

六、部署出现的问题

一、上次课回顾

  • 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
ResourceManagerNodeManager
老大小弟
资源管理者节点管理者

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解决的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值