hadoop3入门

深入浅出 Hadoop YARN:https://zhuanlan.zhihu.com/p/54192454?utm_source=qq

常用命令

统计文件系统的可用空间信息

hadoop fs -df -h /

统计文件夹的大小信息

hadoop fs -du -s -h /aaa/*

统计一个指定目录下的文件节点数量

hadoop fs -count /aaa/

设置HDFS中文件的副本数量

hadoop fs -setrep 3 /aaa/a.txt

 

 

 

 

环境准备

克隆虚拟机

Vmware左侧选中要克隆的机器,这里对原有的hadoop-master机器进行克隆,虚拟机菜单中,选中管理菜单下的克隆命令。选择“创建完整克隆”,虚拟机名称为hadoop-slave2,选择虚拟机文件保存路径,进行克隆。再次克隆一个名为hadoop-slave2的虚拟机。

服务器功能规划

#部署完成后
root@servera:/opt/hadoop/hadoop-3.1.0# jps
14056 SecondaryNameNode
14633 Jps
13706 NameNode
14317 ResourceManager

root@serverb:~# jps
5288 NodeManager
5162 DataNode
5421 Jps


root@serverc:~# jps
4545 NodeManager
4371 DataNode
4678 Jps

JDK安装(每个节点同样操作)

  • 下载JDK(可到甲骨文网站Oracle下载,我当时下载的是jdk-8u151-linux-x64.tar.gz(jdk8都行)
  • 在jdk压缩包目录下(我的路径是/home/ubuntu/java/)解压:tar –zxvf jdk-8u151-linux-x64.tar.gz
  • 配置jdk(关于Linux配置文件,可以参考:Linux配置文件说明),执行以下命令:
vim ~/.bashrc  #在文件最后添加

export JAVA_HOME=/opt/jdk8
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH

source ~/.bashrc #刷新配置
java –version #验证,查看 java 版本

ssh免密码登录配置

2.2.1 网络环境配置

首先修改主机名和 IP 的映射关系,分别配置两台机器的hosts文件,在此之前先通过ip addr showifconfig命令查看两台机器(三个及三个以上节点只需添加即可)的IP地址,我的IP地址为:

2、host配置和主机名(四台)

修改四台服务器的hosts文件

vim /etc/hosts

192.168.0.71 hadoop-master 
192.168.0.72 hadoop-slave1 
192.168.0.73 hadoop-slave2

此时,两个节点间应该可以互相ping通

2.2.2 ssh免密登录(可以参考我之前博客

Hadoop集群中的各个机器间会相互地通过SSH访问,每次访问都输入密码是不现实的,所以要配置各个机器间的
SSH是无密码登录的。
1、 在 hadoop01上生成公钥

 ssh-keygen -t rsa

一路回车,都设置为默认值,然后再当前用户的Home目录下的.ssh目录中会生成公钥文件(id_rsa.pub)和私钥文件(id_rsa)。

2、 分发公钥

yum -y install openssh-server openssh-clients

[hadoop@ hadoop01 hadoop]# ssh-copy-id  hadoop-master
[hadoop@ hadoop01 hadoop]# ssh-copy-id  hadoop-slave1
[hadoop@ hadoop01 hadoop]# ssh-copy-id  hadoop-slave2

(3)master免密码登录worker,把各子节点的 id_rsa.pub 传到主节点 

ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop-master 
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop-slave1 
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop-slave2

3、 设置hadoop-slave1、hadoop-slave2到其他机器的无密钥登录
同样的在hadoop-slave1、hadoop-slave2上生成公钥和私钥后,将公钥分发到三台机器上。


Hadoop的安装与配置

安装Hadoop

下载

(1)到Hadoop官网下载,我下载的是hadoop-3.0.0.tar.gz
(2)同jdk类似,在家目录下(/home/ubuntu/)创建文件夹hadoop:mkdir hadoop,然后解压:tar –zxvf hadoop-3.0.0.tar.gz

配置环境变量

执行如下命令:

vim ~/.bashrc
//在文件最后添加
export HADOOP_HOME=/home/ubuntu/hadoop/hadoop-3.0.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source ~/.bashrc //刷新配置

 创建文件目录

mkdir /home/ubuntu/hadoop/tmp 
mkdir /home/ubuntu/hadoop/dfs 
mkdir /home/ubuntu/hadoop/dfs/data
mkdir /home/ubuntu/hadoop/dfs/name

配置Hadoop

进入hadoop-3.0.0的配置目录:cd /home/ubuntu/hadoop/hadoop-3.0.0/etc/hadoop,依次修改hadoop-env.shcore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml以及workers文件。

配置 hadoop-env.sh

vim hadoop-env.sh
HADOOP_PID_DIR=/hadoop/pid # pid文件
HADOOP_LOG_DIR=/hadoop/logs # 日志文件

export JAVA_HOME=/opt/jdk #在hadoop-env.sh中找到 JAVA_HOME,配置成对应安装路径

export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_SECONDARYNAMENODE_USER="root"
export YARN_RESOURCEMANAGER_USER="root"
export YARN_NODEMANAGER_USER="root"

配置 core-site.xml (根据自己节点进行简单修改即可)

vim core-site.xml
<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop-master:9000</value>
        <description>HDFS的URI,文件系统://namenode标识:端口号</description>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/home/ubuntu/hadoop/tmp</value>
        <description>namenode上本地的hadoop临时文件夹</description>
        </property>
        <property>
                <name>io.file.buffer.size</name>
                <value>131072</value>
        <description>Size of read/write buffer used in SequenceFiles</description>
        </property>
</configuration>

fs.default.name:指定NameNode的IP地址和端口号

hadoop.tmp.dir:指定hadoop数据存储的临时文件夹。

特别注意:如没有配置hadoop.tmp.dir参数,此时系统默认的临时目录为:/tmp/hadoo-hadoop。而这个目录在每次重启后都会被删除,必须重新执行format才行,否则会出错。

配置 hdfs-site.xml

vim hdfs-site.xml
<configuration>
    <!-- Configurations for NameNode: -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///home/ubuntu/hadoop/dfs/name</value>
        <description>namenode上存储hdfs名字空间元数据 </description>
    </property>
    <property>
        <name>dfs.blocksize</name>
        <value>268435456</value>
    </property>
    <property>
        <name>dfs.namenode.handler.count  </name>
        <value>100</value>
    </property>

    <!-- Configurations for DataNode: -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///home/ubuntu/hadoop/dfs/data</value>
        <description>datanode上数据块的物理存储位置</description>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
        <description>Hadoop的备份系数是指每个block在hadoop集群中有几份,系数越高,冗余性越好,占用存储也越多</description>
    </property>
    
    <!-- Configurations for namenode secondary -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop-master:50090</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
        <description>dfs.permissions配置为false后,可以允许不要检查权限就生成dfs上的文件,方便倒是方便了,但是你需要防止误删除,请将它设置为true,或者直接将该property节点删除,因为默认就是true</description>
    </property>
</configuration>

dfs.replication:指定HDFS的备份因子为3

dfs.name.dir:指定namenode节点的文件存储目录

dfs.data.dir:指定datanode节点的文件存储目录

 配置 mapred-site.xml

vim mapred-site.xml

注:之前版本需要cp mapred-site.xml.template mapred-site.xml,hadoop-3.0.0直接是mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
        <description>The runtime framework for executing MapReduce jobs. Can be one of local, classic or yarn.</description>
        <final>true</final>
    </property>
    <property>
        <name>mapreduce.jobtracker.http.address</name>
        <value>hadoop-master:50030</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop-master:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop-master:19888</value>
    </property>
    <property>
        <name>mapred.job.tracker</name>
        <value>http://hadoop-master:9001</value>
    </property>
</configuration>

 配置 yarn-site.xml

vim yarn-site.xml
<configuration>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop-master</value>
        <description>The hostname of the RM.</description>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>hadoop-master:8032</value>
        <description>${yarn.resourcemanager.hostname}:8032</description>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>hadoop-master:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>hadoop-master:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>hadoop-master:8033</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>hadoop-master:8088</value>
    </property>
</configuration>

配置 workers 文件(之前版本是slaves,注意查看)

vi /opt/hadoop/etc/hadoop/workers
## 内容
hadoop-slave1
hadoop-slave2

分发Hadoop文件

1、 首先在其他两台机器上创建存放Hadoop的目录

[root@hadoop-slave1 ~]# mkdir /opt/hadoop
[root@hadoop-slave2 ~]# mkdir /opt/hadoop

2、 通过Scp分发
Hadoop根目录下的share/doc目录是存放的hadoop的文档,文件相当大,建议在分发之前将这个目录删除掉,可以节省硬盘空间并能提高分发的速度。
doc目录大小有1.6G。

[root@hadoop-slave1 ]# scp -r /opt/hadoop/ hadoop-slave1:/opt/hadoop

[root@hadoop-slave2 ]# scp -r /opt/hadoop/ hadoop-slave2:/opt/hadoop

五、格式NameNode
在NameNode机器上执行格式化:

[root@hadoop-master ]# /opt/hadoop/bin/hdfs namenode –format

注意:
如果需要重新格式化NameNode,需要先将原来NameNode和DataNode下的文件全部删除,不然会报错,NameNode和DataNode所在目录是在core-site.xml中hadoop.tmp.dir、dfs.namenode.name.dir、dfs.datanode.data.dir属性配置的。

<property>
     <name>hadoop.tmp.dir</name>
     <value>/opt/data/tmp</value>
  </property>
<property>
     <name>dfs.namenode.name.dir</name>
     <value>file://${hadoop.tmp.dir}/dfs/name</value>
  </property>
<property>
     <name>dfs.datanode.data.dir</name>
     <value>file://${hadoop.tmp.dir}/dfs/data</value>
  </property>

因为每次格式化,默认是创建一个集群ID,并写入NameNode和DataNode的VERSION文件中(VERSION文件所在目录为dfs/name/current 和 dfs/data/current),重新格式化时,默认会生成一个新的集群ID,如果不删除原来的目录,会导致namenode中的VERSION文件中是新的集群ID,而DataNode中是旧的集群ID,不一致时会报错。
另一种方法是格式化时指定集群ID参数,指定为旧的集群ID。

作者:Daven_
链接:https://www.jianshu.com/p/230ddb791fda
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

六、启动集群
1、 启动HDFS

[root@hadoop-master]# /opt/hadoop/sbin/start-dfs.sh
enter image description here

2、 启动YARN

[root@hadoo-master]# /opt/hadoop/sbin/start-yarn.sh

在hadoop04上启动ResourceManager:

[root@hadoop-master]# sbin/yarn-daemon.sh start resourcemanager

3、 启动日志服务器
因为我们规划的是在hadoop04服务器上运行MapReduce日志服务,所以要在hadoop04上启动。

[root@hadoop-master  ~]# /opt/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver
[root@hadoop-master ~]# jps
3570 Jps
3537 JobHistoryServer
3310 SecondaryNameNode
3213 DataNode
3392 NodeManager

4、 查看HDFS Web页面

http://hadoop01.chybinmy.com:50070/

5、 查看YARN Web 页面

http://hadoop03:8088/cluster

七、测试Job
我们这里用hadoop自带的wordcount例子来在本地模式下测试跑mapreduce。
1、 准备mapreduce输入文件wc.input

[root@hadoop-master ]# cat /opt/data/wc.input
hadoop mapreduce hive
hbase spark storm
sqoop hadoop hive
spark hadoop

2、 在HDFS创建输入目录input

[root@hadoop-master]# bin/hdfs dfs -mkdir /input

3、 将wc.input上传到HDFS

[root@hadoop-master]# bin/hdfs dfs -put /opt/data/wc.input /input/wc.input

4、 运行hadoop自带的mapreduce Demo

[root@hadoop-master]# bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /input/wc.input /output

5、 查看输出文件

[root@hadoop-master]# bin/hdfs dfs -ls /output
Found 2 items
-rw-r--r--   3 hadoop supergroup          0 2016-07-14 16:36 /output/_SUCCESS
-rw-r--r--   3 hadoop supergroup         60 2016-07-14 16:36 /output/part-r-00000
作者:Daven_
链接:https://www.jianshu.com/p/230ddb791fda
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

3、使用jps命令查看运行情况

这里写图片描述

4、命令查看Hadoop集群的状态

通过简单的jps命令虽然可以查看HDFS文件管理系统、MapReduce服务是否启动成功,但是无法查看到Hadoop整个集群的运行状态。我们可以通过hadoop dfsadmin -report进行查看。用该命令可以快速定位出哪些节点挂掉了,HDFS的容量以及使用了多少,以及每个节点的硬盘使用情况。

hadoop dfsadmin -report

输出结果:

Configured Capacity: 50108030976 (46.67 GB)
Present Capacity: 41877471232 (39.00 GB)
DFS Remaining: 41877385216 (39.00 GB)
DFS Used: 86016 (84 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
......

5、hadoop 重启

sbin/stop-all.sh
sbin/start-all.sh

查看集群是否成功启动

9870端口查看(这里是9870,不是50070了)
在浏览器输入10.10.10.12:9870,结果如下:
这里写图片描述
测试YARN
在浏览器输入10.10.10.12:8088,结果如下:
这里写图片描述
注:将绑定IP或mpi-1改为0.0.0.0,而不是本地回环IP,这样,就能够实现外网访问本机的8088端口了。比如这里需要将yarn-site.xml中的

<property>
      <name>yarn.resourcemanager.webapp.address</name>
      <value>mpi-1:8088</value>
</property>

修改为:

<property>
      <name>yarn.resourcemanager.webapp.address</name>
      <value>0.0.0.0:8088</value>
</property>

另外,可以直接参考Hadoop官网的默认配置文件进行修改,比如hdfs-site.xml文件,里面有详细的参数说明。另外可以使用hdfs dfs命令,比如hdfs dfs -ls /进行存储目录的查看。

问题汇总

 xxx: Error: JAVA_HOME is not set and could not be found

这个错误意思没有找到jdk的环境变量,需要在hadoop-env.sh配置。

vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh 
## 配置项
export JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk.x86_64

The authenticity of host ‘0.0.0.0 (0.0.0.0)’ can’t be established.

解决方案关闭SELINUX

-- 关闭SELINUX
# vim /etc/selinux/config
-- 注释掉
#SELINUX=enforcing
#SELINUXTYPE=targeted
— 添加
SELINUX=disabled

Datanode无法启动

多次执行./hadoop namenode -format命令,导致出错

删除hadoop-master , hadoop-slave1 , hadoop-slave2下/hadoop/文件下的所有文件,重新执行

/hadoop namenode -format

hadoop系统重启过后,namenode不能启动问题

参考地址:https://blog.csdn.net/whiteblacksheep/article/details/94722734

方案一:将namenode重新格式化(生产上不建议使用,因为此操作会把NameNode所有数据删除)

$ bin/hdfs namenode -format

方案二:修改配置文件core-site.xml,添加hadoop.tmp.dir属性:把存放目重新定定义到不会被删除的地方

<configuration>
    <property>
            <name>hadoop.tmp.dir</name>
          <value>/opt/hadoop-2.7.7/data</value>
    </property>
</configuration> 

 

参考地址

posted @ 2019-03-01 18:24  逐梦客!  阅读(488)  评论(0)    收藏  举报