Hadoop入门二(3.2.2版本)

一.配置hdfs的三个进程以本地机器名comerdata001启动

目的:配置hdfs的老大NN、老二SNN、小弟DN三个进程以本地机器名comerdata001启动

好处:hdfs的三个进程和HA都是以机器名配置和启动的,这样的好处在于如果以后ip变化了,不用去修改配置文件,只需要直接修改机器的hosts文件即可

准备工作:

1.登录到hadoop001用户并切换到~/app/hadoop目录下

ps -ef | grep hadoop  #查看hadoop进程

sbin/start -dfs.sh #启动服务    sbin/stop -dfs.sh #关闭服务

启动hdfs的三个服务

2.ifconfig #查看Linux的ip地址

Linux的ip地址

修改机器名:

vi /etc/hosts #配置hadoop001用户的ssh信任关系

     进入之后在最后一行输入ip  机器名

   注意:进入之后第一行和第二行千万不能删除!!!

前面ip;后面机器名

(一).配置Namenode以comerdata001启动

cd /home/hadoop001/app/hadoop/etc/hadoop

vi core-site.xml  #进入之后,第一行、第二行千万不能删除!!!

之间输入:

        fs.defaultFS

        hdfs://comerdata001:9000

   

配置老大NN以机器名启动

(二).配置Datanode以comerdata001启动

cd /home/hadoop001/app/hadoop/etc/hadoop

cat workers #查看小弟DN  【注意】:workers是3.x版本的小弟DN配置文件;2.x版本的小弟DN配置文件是slaves(奴隶变工人)

vi workers  #进入之后直接将localhost改为comerdata001即可

(三).配置Secondary Namenode以comerdata001启动

1.先看官网配置文件的参数

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

老二SNN官方默认参数

其中0.0.0.0代表SNN本身和hostname;9868是默认端口号

【注意】:9868/9869是3.x版本的老二SNN的默认端口;

2.x版本的老二SNN的默认端口是50090、50091

2.配置

cd /home/hadoop001/app/hadoop/etc/hadoop

vi hdfs-site.xml  #进入之后,第一行、第二行千万不能删除!!!

之间输入:

   

        dfs.replication

        1

   

 

        dfs.namenode.secondary.http-address

        comerdata001:9868

   

     

        dfs.namenode.secondary.https-address

        comerdata001:9869

   

配置老二SNN以机器名启动

配置NN、SNN和DN三个进程以comerdata001启动后,

cd /home/hadoop001/app/hadoop (cd ~/app/hadoop)

sbin/stop-dfs.sh  #关闭三个进程

ps -ef | grep hadoop  #查看进程是否完全关闭

sbin/start-dfs.sh  #启动三进程

以comerdata001启动三进程

!!!此时能明显看出老大NN和老二SNN是以comerdata001启动的,但是不能看出小弟DN以什么启动,这时候可以通过log日志查看一下小弟DN是否以comerdata001启动

cd ~/app/hadoop/logs 然后ll 即可。

通过logs查看hdfs的三进程以机器名启动

二./tmp目录、pid文件及更改数据存储目录

(一)./tmp目录、pid文件

用于控制进程的:进程启动会写一个pid;进程停止从pid文件读取进程号,然后kill -9 进程号

pid指的是服务的进程号

cd /tmp  【注意:】这里的tmp目录是系统的tmp目录哟

tmp目录下的pid文件

cd hadoop-hadoop001 然后ll,显示dfs和mapred目录,其中dfs是配置目录和数据存储目录。

ll /tmp

cat cat hadoop-hadoop001-datanode.pid  #显示35141,即datanode的pid是35141,也即datanode服务的进程号是35141.

ps -ef | grep 35141 #通过pid查看进程

查看DN进程的pid并以此pid来查看进程

!!!【问题】:为什么pid文件不能放在/tmp目录(系统自带的tmp目录)下面呢?

因为/tmp目录默认30天自动清除,到时候pid的文件就没有了,会影响服务的启动和重启。

下面手动删除DN的pid文件来模拟此过程:

①rm -f hadoop-hadoop001-datanode.pid  #删除DN的pid文件

②sbin/stop-dfs.sh  #(系统维护的时候)停止hdfs进程,但是表面上看没有任何问题

③ps -ef | grep hadoop #此时就会发现DN根本停不掉

模拟删除DN.pid停止不了该服务进程

④sbin/start-dfs.sh  #启动服务进程,这时候表面上看也没有任何问题

⑤ps -ef | grep hadoop #但是此时就会发现DN的pid根本没有变化(还是之前的pid)

模拟删除DN.pid启动不了该服务新的进程

恶果:维护的时候,你以为更新配置或者更新jar ,DN重启生效了。其实DN压根都没有重启。

所以pid文件一定不能放在系统原有的/tmp目录里面。

(二).更改数据存储目录(2.x版本)

由上面知道pid文件放在系统原有的/tmp目录里面非常危险,其实数据存储目录也在该目录里面,也同样危险,所以要把它们放在用户自己的家目录里面。

cd ~/app/hadoop/etc/hadoop

vi core-site.xml  #进入之后新增:

        hadoop.tmp.dir

        /home/hadoop001/tmp

更改数据存储目录到用户自己的tmp目录下

kill -9 NN、SNN、DN的pid

cd ~/tmp

mv /tmp/hadoop-hadoop001 /home/hadoop001/tmp

su

cd /tmp

rm -rf *.pid

再次启动:

su - hadoop001

cd ~/app/hadoop

sbin/start-dfs.sh

jps

【可能问题1】尽管三个进程已经启动了,但/home/hadoop001/tmp目录下并没有三个.pid文件,这是因为mv之后没有做“ln -s”软连接,配置文件还是读取的老地方:系统/tmp目录下,而实际存储在/home/hadoop001/tmp目录下。这样也可能导致hdfs的三个进程启动不完整。

比如jps后发现Datanode、Secondary Namenode启动了,而Namenode进程没有启动。

解决办法一:建立软连接

解决办法二:格式化

su - hadoop001

cd ~/app/hadoop

sbin/stop-dfs.sh

bin/hdfs namenode -formate  #格式化

显示这行表示格式化成功

再sbin/start-dfs.sh即可

【可能问题2】启动之后,jps发现Namenode、Secondary Namenode启动了,而Datanode进程没有启动

解决办法:把~/tmp目录下dfs里面的VERSION的data的ID改为和name的一样再重新启动即可。具体如下:

cat ~/tmp/hadoop-hadoop001/dfs/data/current/VERSION

cat ~/tmp/hadoop-hadoop001/dfs/name/current/VERSION

然后对比下面两处,将data的clusterID通过vi命令改的和name的clusterID一样即可(我已经改过啦)

确保data和name的clusterID一致

(三).配置pid文件存放在用户的tmp目录下

cd ~/app/hadoop/etc/hadoop

vi hadoop-env.sh

配置pid的环境变量

然后重新启动即可。

(四).更改数据存储目录(3.x版本)

 上面(二)是2.x版本的操作,但我的hadoop是3.2.2版本,所以需要对core-site.xml文件做下修整

cd ~/app/hadoop/etc/hadoop

vi core-site.xml  #进入之后新增:

        hadoop.tmp.dir

        /home/hadoop001/tmp/hadoop-${user.name}

修整core-site文件,更改tmp目录

修整结束后一定要格式化哟!!!

解读官网:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

dfs.datanode.data.dir : 10块物理磁盘 ,5T

dfs.datanode.data.dir : /data01/dfs/dn,/data02/dfs/dn,/data03/dfs/dn.......

也就是说,一块磁盘写的能力30M/s ,那么它需要10s;而10块磁盘写的能力是300M/s,那么它10s就能写完,多块磁盘是为了存储空间更大,且高效率的读写IO。 肯定比单块磁盘更快。

所以生产上DN的数据目录参数,必然不能默认使用${hadoop.tmp.dir},需要根据自己实际情况写清楚。

三.yarn的部署

(一).基本概念

ResourceManager RM 是全局的进程

NodeManager    NM   是每个节点上的进程,管理这个节点上的资源分配和监控运行节点的健康状态。

(二).yarn部署教程

1.配置mapred-site.xml文件

cd ~/app/hadoop/etc/hadoop \ ll

查看yarn的配置文件

【注意】:

①2.x版本没有mapred-site.xml文件,需要拷贝模板文件mapred-queues.xml.template改名为mapred-site.xml;而3.x版本直接有mapred-site.xml文件。

②2.x版本不需要配置classpath。

vi mapred-site.xml  #进入之后,前面的内容千万别动,然后新添加:

        mapreduce.application.classpath

     $HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*

配置mapred-site.xml文件

mapreduce.framework.name

yarn   表示mapreduce的计算框架在yarn上

2.配置yarn-site.xml文件

与2.x版本相比,3.x版本多了env-whitelist配置。

vi yarn-site.xml  进入之后在图示位置新添加:

   

        yarn.nodemanager.env-whitelist

        JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME

   

配置yarn-site.xml文件

3.启动yarn

cd ~/app/hadoop

sbin/start-yarn.sh

yarn启动

4.yarn的浏览器打开

此时ResourceManager的端口号是8088

进入Windows的web界面,输入:ip:8088看能否打开网页,验证是否配置OK

yarn的网页打开

(三).端口挖矿处理及修改端口号

1.端口挖矿处理

根据生产上的经验,8088端口极易被挖矿(中病毒),表现是登录机器和操作命令时很卡很卡,且通过top命令查看到有个进程占据CPU100%。

解决办法一:找到挖矿文件,chmod 000权限给它。

解决办法一:进入挖矿文件,清空里面的内容。

解决办法一:进入挖矿文件开头加exit 0 然后直接退出。

但是问题的关键在于如何找到挖矿文件呢?

所以我们一般通过更改端口号的方法来尽可能的避免被挖矿

2.修改8088端口号

①配置:

vi yarn-site.xml  进入之后,新增配置:

        yarn.resourcemanager.webapp.address

        comerdata001:8123

修改8088端口号为8123

②验证:进入Windows的web界面,输入:ip:8123看能否打开网页,验证端口号是否修改成功.

yarn新端口打开web

(四).经典案例Wordcount(词频统计)及源码实现

1.环境准备

配置个人环境变量

cd

vi .bashrc  进入之后配置:

      export HADOOP_HOME=/home/hadoop001/app/hadoop

      export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

配置个人环境变量

. .bashrc  #使配置文件生效

which hdfs

2.数据准备

hdfs dfs -ls /

hdfs dfs -mkdir /input

vi 1.log  输入:

  jepson

  ruoze

  xingxing

  a b c

  b a c

  jepson

  www.ruozedata.com ruoze a b c

hdfs dfs -put 1.log /input  #把文件从Linux放进hdfs的/input目录下

hdfs dfs -ls /input  #查看文件是否移动成功

hdfs dfs -cat /input/1.log  #查看文件内容是否丢失

3.find查找及计算作业

①find查找

当不知道jar包具体名字是什么,可以根据find查找关键字
find ./ -name '*example*'

find查找

②计算案例

yarn jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /input /output1

词频统计流程

①number of splits:1 【切片是1 规则 】

②map tasks=1 【map 任务 1】

③reduce tasks=1 【reduce 任务 1】(生成的结果)

如果报错:Error file: prelaunch.err.

Last 4096 bytes of prelaunch.err :

Last 4096 bytes of stderr :

/bin/bash: /bin/java: No such file or directory

原因是没有这个目录,做个软连接即可:

先whereis java 再ll /bin/java看看有没有/bin/java目录,

再which java 最后做个ln -s /usr/java/jdk1.8.0_301/bin/java /bin/java

4.分析结果

hdfs dfs -ls /output1

hdfs dfs -cat /output1/part-r-00000

词频统计结果

运行流程:

第一步map:每一行按空格拆分单词 ,且每个单词赋予默认值为1

  (jepson,1)

  (ruoze,1)

  (xingxing,1)

  (a,1) (b,1) (c,1)

  (b,1) (a,1) (c,1)

  (jepson,1)

  (www.ruozedata.com,1)(a,1) (b,1) (c,1)

第二步reduce: 按单词维度,统计每个单词出现的次数(按字母顺序排序)

  a: 1+1+1=3==>  a 3

  b: 1+1+1=3==>  b 3

  c: 1+1+1=3==>  c 3

  jepson: 1+1=2==>  jepson 2

  ruoze: 1+1=2==>  ruoze 2

  www.ruozedata.com: 1==>  www.ruozedata.com 1

  xingxing: 1==>  xingxing 1

相当于SQL里面的select 单词,sum(value) from t group by 单词;

【附】

a 100 --> a 100*10

b 200  --> b 200*10

map    映射  年终奖10倍

reduce 规约  3000块

5.解读源码

https://github.com/apache/hadoop

https://github.com/apache/hadoop/blob/release-3.2.2-RC3/hadoop-mapreduce-project/hadoop-mapreduce-examples/src/main/java/org/apache/hadoop/examples/WordCount.java



已同步至:Hadoop入门二(3.2.2版本)_comer_liu的博客-CSDN博客

你可能感兴趣的:(Hadoop入门二(3.2.2版本))