hadoop环境的搭建<二>

在上一篇文章中,我们已经搭建好了三台可以互相ping通的centos7的环境了,现在接着上一篇来继续搭建hadoop的环境。

创建hadoop用户

1.创建hadoop用户

以后都会使用hadoop这个用户来操作,不再使用root用户!!!

useradd hadoop
passwd hadoop

三台虚拟机都添加相应的账户:hadoop。


2.给hadoop添加权限:(当前是root用户)

vim /etc/sudoers

在root的下面添加:
hadoop  ALL=(ALL)       ALL


3.在/opt目录下,创建:sofes目录和modules目录。

sofes:用来存储一些软件的压缩包

modules:用来存储软件的解压缩后文件。

cd /opt

mkdir sofes modules

3.将/opt文件夹的所有者指定为hadoop用户

sudo chown -R hadoop:hadoop /opt


下载java8和hadoop

切换到:hadoop用户

su hadoop

1)Java8 和 hadoop 到相应的官网去下载即可。

2)将java8和hadoop的压缩包上传到:/opt/sofes目录下:

使用:rz命令即可

版本:java是8,hadoop是3.x.x

3) 解压缩包

  tar -zxvf jdk-8u221-linux-x64.tar.gz -C /opt/modules

  tar -zxvf hadoop-3.2.2.tar.gz -C /opt/modules

删除centos7自带的java环境

1)查看是否有java的环境

先测试是否有java的环境:

java -version

如果出现:java的版本信息,就需要删除掉。

因为:hadoop需要使用jdk的环境,自带不行,需要Oracle的java环境。

2)删除java的环境

1. 查找java的环境
rpm -qa | grep java 

python-javapackages-3.4.1-11.el7.noarch
java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
javapackages-tools-3.4.1-11.el7.noarch
tzdata-java-2018c-1.el7.noarch
java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64

2. 删除java的环境
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64

查找后:应该只剩下三行。

PS:如果上述权限不够,请先切换到root用户下


配置环境变量

vim /etc/profile


#JAVA_HOME
export JAVA_HOME=/opt/modules/jdk1.8.0_221
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

#HADOOP_HOME
export HADOOP_HOME=/opt/modules/hadoop-3.2.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin


刷新配置文件:

source /etc/profile

hadoop运行模式

本地运行模式

运行官方的Gerp例子

注意:切换到hadoop用户

$ mkdir input
$ cp conf/*.xml input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar grep input output 'dfs[a-z.]+'
$ cat output/*


查看:output目录

我们,可以看到:有两个文件:1)part-r-0000;2)_SUCCESS

part-r-0000就是运行mr的结果:

注意:mr运行的输出目录必须是不存在的!!!如果存在的话,就会报错。

运行官方的wc案例

word-count的案例:就相当于编程语言中的”hello world”例子。

在hadoop的根目录下:

mkdir wcinput
cd wcinput
touch wc.input

vim wc.input

hadoop java
hadoop yarn
mapreduce spark

保存退出,回到hadoop的根目录下:

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount wcinput wcoutput

运行结果:

能看到结果是,将wcinput文件夹下面的所有文件按行处理,每行按照空格切割,将切割后的单词进行数量统计。


本地单机运行模式,默认采用的是本地的文件系统,所以我们创建的文件夹、文件,最后输出的文件夹都是采用的是Linux的文件系统,保存在本地。

伪分布运行模型

伪分布模型就是在一台机器上面,运行hadoop的各个组件,包括namenode和datanode,启动环境运行。

配置 hadoop-env.sh

添加java的环境变量

vim /etc/hadoop/hadoop-env.sh

export JAVA_HOME=/opt/modules/jdk1.8.0_211

修改 core-site.xml:

vim /etc/hadoop/core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop101:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/modules/hadoop-3.2.2/data/tmp</value>
    </property>
</configuration>

1)设置:hadoop的文件系统为:hdfs,指定namenode的运行节点
可以查看默认的配置:
http://www.hadoop.org/hadoop-project-dist/hadoop-common/core-default.xml

2)设置:hadoop运行时产生文件时所使用的目录

修改 hdfs-site.xml:

vim /etc/hadoop/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

设置:hdfs的副本数为1,默认为3。伪分布模式,一台机器,设置成3没有意义,因此修改默认的配置为:1

启动集群

1)格式化:NameNode(第一次启动的时候才格式化,以后就不要总格式化)

bin/hdfs namenode -format

如果严格按照上述配置执行,那格式化namenode是不会失败的,如果失败,请到各个节点的tmp路径进行删除操作,然后重新格式化namenode。

namenode格式化成功: 在我们配置的namenode生成文件目录下,可以看到信息:

2)启动:NameNode

sbin/hadoop-daemon.sh start namenode

3)启动:DataNode

sbin/hadoop-daemon.sh start datanode

以后请使用:hdfs --daemon start

查看集群

1)查看是否成功

jps

6674 Jps
6518 DataNode
6426 NameNode

2)打开浏览器:hadoop101:9870

注意:hadoop2的端口号是:50070


3)使用hdfs的命令来简单使用

bin/hdfs dfs -ls /

显示为空,啥也没有查询到,因为目前就是为空!

然后,可以通过浏览器来验证:


创建目录:

bin/hdfs dfs -mkdir -p /usr/gakki/wcinput




上传文件:

bin/hdfs dfs -put wcinput/wc.input /usr/gakki/wcinput/

bin/hdfs dfs -ls /usr/gakki/wcinput/



可以看到:wc.input上传成功!

注意:我们的wc.input的文件只有50B,但是hdfs帮我们分配了一个块的大小是:128MB

可以下载我们上传的文件:



命令来下载hdfs上面的文件

bin/hdfs dfs -get /usr/gakki/wcinput/wc.input /opt/modules/hadoop-3.2.2/


查看namenode和datanode的运行日志:

运行的日志目录是在:$HADOOP_HOME/logs目录下

大家如果运行错误,可以查看这个两个日志运行目录,进行排查问题。

在HDFS上运行WC案例

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /usr/gakki/wcinput/wc.input /usr/gakki/wcoutput
bin/hdfs dfs -cat /usr/gakki/wcoutput/p*



使用YARN启动MR

1)配置:yarn-env.sh

增加JAVA_HOME的环境:

export JAVA_HOME=/opt/modules/jdk1.8.0_211

请注意:hadoop3不需要配置了。

可以看到:hadoop-env.sh已经修改java的环境变量,就不需要修改 yarn-env.sh了;yarn-env.sh的配置会覆盖hadoop-env.sh的配置。

2)配置:yarn-site.xml

<configuration>
<!-- Site specific YARN configuration properties -->
    <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
    </property>

    <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>hadoop101</value>
    </property>
</configuration>

3)配置:mapred-env.sh

增加JAVA_HOME的环境变量

export JAVA_HOME=/opt/modules/jdk1.8.0_211

和yarn-env.sh一样。

4)配置:mapred-site.xml

hadoop2的没有mapred-site.xml,有一个mapred-site.xml.template,然后修改它的名字为:mapred-site.xml

mv mapred-site.xml.template mapred-site.xml

hadoop3本身就有。

<configuration>
    <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
    </property>
</configuration>

5)启动:resourcemanager

sbin/yarn-daemon.sh start resourcemanager

该命令已经过期:请使用 yarn –daemon start resourcemanager

6)启动:nodemanager

sbin/yarn-daemon.sh start nodemanager

该命令已经过期:请使用 yarn –daemon start nodemanager

7)查看状态

jps

打开浏览器:hadoop101:8088


8)运行wc案例

首先删除:/usr/gakki/wcoutput

bin/hdfs dfs -rm -r /usr/gakki/wcoutput



启动wc的mr任务:

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /usr/gakki/wcinput/wc.input /usr/gakki/wcoutput


能看到我们任务在yarn上面准备开始运行。

然后看,控制台出现错误:

解决问题:

1) hadoop classpath

出现很多classpath的路径,将这些路径添加到yarn的配置文件中。

2) 修改 yarn.site.xml

    <property>
            <name>yarn.application.classpath</name>
            <value>xxxxx</value>
    </property>


停止:resourcemanager、nodemanager

开启:resourcemanager、nodemanager

yarn --daemon stop resourcemanager
yarn --daemon stop nodemanager

yarn --daemon start resourcemanager
yarn --daemon start nodemanager



重新运行wc的mr任务:




配置历史服务器

vim mapred-site.xml

    <property>
            <name>mapreduce.jobhistory.address</name>
            <value>hadoop101:10020</value>
    </property>
    <property>
            <name>mapreduce.jobhistory.webapp.https.address</name>
            <value>hadoop101:19888</value>
    </property>

启动:历史日志服务器

sbin/mr-jobhistory-daemon.sh start historyserver

命令过期:

mapred --daemon start historyserver

查看:jps


打开浏览器:hadoop101:19888



配置日志的聚集

默认的yarn的日志聚集是关闭:

yarn.log-aggregation-enable = false


vim yarn-site.xml

    <property>
            <name>yarn.log-aggregation-enable</name>
            <value>true</value>
    </property>
    <property>
            <name>yarn.log-aggregation.retain-seconds</name>
            <value>604800</value>
    </property>

    开启日志聚集,并且保存7

重启:resourcemanager、nodemanager、historyserver

yarn --daemon stop resourcemanager
yarn --daemon stop nodemanager
mapred --daemon stop historyserver

yarn --daemon start resourcemanager
yarn --daemon start nodemanager
mapred --daemon start historyserver


删除wc的hdfs上面的路径,再次运行wc任务:


端口号总结

hdfs的端口号:9870

yarn的端口号:8088

历史服务端口:19888



  目录