HDFS的安装配置及工作流程

10 篇文章 0 订阅
10 篇文章 2 订阅

HDFS

2.2.1 Hadoop相关概念

Hadoop是一个由Apache基金会所开发的分布式系统基础架构,用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS具有高容错性的特点,并且设计用来部署在低廉的硬件上,而且它提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集的应用程序

Hadoop的框架最核心的设计就是:HDFS和MapReduce。 HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算

2.2.2 Hadoop发展历史

Hadoop系统最初的源头来自于Apache Lucene项目下的搜索引擎子项目Nutch,该项目的负责人是Doug Cutting。2003年,Google公司为了解决其搜索引擎中大规模Web网页数据的处理,研究发明了一套称为MapReduce的大规模数据并行处理技术,并于2004年在著名的OSDI国际会议上发表了一篇题为MapReduce的论文,简要介绍MapReduce的基本设计思想。论文发表后,Doug Cutting受到了很大启发,他发现Google MapReduce所解决的大规模搜索引擎数据处理问题,正是他同样面临并急需解决的问题。因而,他尝试依据Google MapReduce的设计思想,模仿Google MapReduce框架的设计思路,用Java设计实现出了一套新的MapReduce并行处理软件系统,并将其与Nutch分布式文件系统NDFS结合,用以支持Nutch搜索引擎的数据处理。2006年,他们把NDFS和MapReduce从Nutch项目中分离出来,成为一套独立的大规模数据处理软件系统,并使用Doug Cutting小儿子当时呀呀学语称呼自己的玩具小象的名字“Hadoop”命名了这个系统。2008年他们把Hadoop贡献出来,成为Apache最大的一个开源项目,并逐步发展成熟,成为一个包含了HDFS、MapReduce、HBase、Hive、Zookeeper等一系列相关子项目的大数据处理平台和生态系统。

Hadoop开源项目自最初推出后,经历了数十个版本的演进。它从最初于2007年推出的Hadoop-0.14.X测试版,一直发展到2011年5月推出了经过4500台服务器产品级测试的最早的稳定版0.20.203.X。到2011年12月,Hadoop又在0.20.205版基础上发布了Hadoop1.0.0,该版本到2012年3月发展为Hadoop1.0.1稳定版。1.0版继续发展,到2013年8月发展为Hadoop1.2.1稳定版。

与此同时,由于Hadoop1.X以前版本在MapReduce基本构架的设计上存在作业主控节点(JobTracker)单点瓶颈、作业执行延迟过长、编程框架不灵活等较多的缺陷和不足,2011年10月,Hadoop推出了基于新一代构架的Hadoop0.23.0测试版,该版本系列最终演化为Hadoop2.0版本,即新一代的Hadoop系统YARN。2013年10月YARN已经发展出Hadoop2.2.0稳定版。

2.2.3 Hadoop的发行版本
2.2.4 HDFS内部组件

整个Hadoop的体系结构主要是通过HDFS来实现对分布式存储的底层支持,并通过MR来实现对分布式并行任务处理的程序支持。

HDFS采用主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的(在最新的Hadoop2.2版本已经实现多个NameNode的配置-这也是一些大公司通过修改hadoop源代码实现的功能,在最新的版本中就已经实现了)。NameNode作为主服务器,管理文件系统命名空间和客户端对文件的访问操作。DataNode管理存储的数据。HDFS支持文件形式的数据。

从内部来看,文件被分成若干个数据块,这若干个数据块存放在一组DataNode上。NameNode执行文件系统的命名空间,如打开、关闭、重命名文件或目录等,也负责数据块到具体DataNode的映射。DataNode负责处理文件系统客户端的文件读写,并在NameNode的统一调度下进行数据库的创建、删除和复制工作。NameNode是所有HDFS元数据的管理者,用户数据永远不会经过NameNode。

[外链图片转存失败(img-j0yk79pn-1567081887420)(E:/qqq/days/8.28/Hadoop-and-hdfs/resources/A3AA1F0DCD1AD8FC7B38318C42114ADC.png)]

上图为:HDFS体系结构图

NameNode:存储文件的元数据,如文件名称,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表和块所在的DataNode等

DataNode:在本地文件系统存储文件块数据,以及数据块的校验和

Secondary NameNode:用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。

2.2.5 Hadoop单机版
  1. 进入 Linux 系统查看本机的主机名。通过 hostname 命令查看。

[root@localhost ~]# hostname
localhost.localdomain

  1. 如果此时需要修改主机名则可以按照如下的方式进行修改

范例1:临时修改主机名称为Hadoop01 hostname hadoop01 重启之后失效

范例2:永久修改主机名称为Hadoop01

vi /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=hadoop01

  1. 在修改完主机名称之后,需要编辑/etc/hosts 文件需要把主机名称与IP地址进行映射

vi /etc/hosts 在该文件下添加如下内容

192.168.1.128 hadoop01

关闭防火墙

1)service iptables stop 关闭防火墙

2)chkconfig iptables off 永久关闭防火墙启动

3)chkconfig iptables --list 查看防火墙开机启动状态

规划软件安装目录

1)创建安装包的保存目录,以及安装目录

mkdir -p /opt/soft 保存软件的安装包

mkdir -p /opt/app 软件的安装了路径

创建Hadoop用户,以及赋予sudo权限

1)创建Hadoop用户,以后的操作都是在hadoop用户下完成的

useradd hadoop 创建hadoop用户

passwd hadoop 为hadoop用户设置密码

2)为hadoop用户赋予sudo权限

在root用户下,执行visudo命令编辑如下内容

Allow root to run any commands anywhere
root ALL=(ALL) ALL

hadoop ALL=(ALL) ALL 为hadoop用户设置sudo权限

Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
hadoop ALL=(ALL) NOPASSWD: ALL. 为hadoop用户设置免密码sudo权限

安装jdk环境

首先先把jdk的安装包上传到soft 文件夹下,之后对其安装

1)解压 sudo tar -zvxf jdk-8u181-linux-x64.tar.gz

2)配置JDK环境变量

首先获取JDK的安装路径

[hadoop@hadoop01 jdk1.8.0_181]$ pwd
/opt/soft/jdk1.8.0_181

接下来打开 /etc/profile 文件进行环境变量的设置

vi /etc/profile

在 profie 文件末尾添加 jdk 路径:

#JAVA_HOME

export JAVA_HOME=/data/jdk1.8.0_181
export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH

保存后推出 :wq

完成以上的操作之后,配置文件并不能立即生效,需要使用到如下命令,使配置文件立即生效

[hadoop@hadoop01 jdk1.8.0_181]$ source /etc/profile

之后测试JDK环境变量是否配置成功,使用如下命令输出JDK的版本信息

[hadoop@hadoop01 jdk1.8.0_181]$ java -version
java version “1.8.0_181”
Java™ SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot™ 64-Bit Server VM (build 25.181-b13, mixed mode)

如果能看到如上的信息,说明JDK的环境变量已经配置成功

安装Hadoop环境

1)进入到软件包的安装路径下:

[hadoop@hadoop01 /]$ cd /opt/soft/

对hadoop安装包进行解压

[hadoop@hadoop01 soft]$ sudo tar -zvxf hadoop-2.7.2.tar.gz

解压成功之后,hadoop的安装目录结构如下:

bin:Hadoop最基本的管理脚本和使用脚本所在目录,这些脚本是sbin目录下管理脚本的基础实现,用户可以直接使用这些脚本管理和使用hadoop

etc:Hadoop配置文件所在目录,包括core-site.xml, hdfs-site.xml, mapred-site.xml等从hadoop1.0继承而来的配置文件和yarn-site.xml等hadoop 2.0新增的配置文件

include:对外提供的编程酷头文件(具体动态库和静态库在lib目录中),这些头文件均是用c++定义的,通常用于c++程序访问hdfs或者编写mapreduce程序

lib:该目录包含了Hadoop对外提供的的编程动态库和静态库,与include目录中的头文件结合使用。

libexec:各个服务对应的shell配置文件所在目录,可用于配置日志输出目录,启动参数(比如JVM参数)等基本信息。

sbin:Hadoop管理脚本所在目录,主要包含HDFS和YARN中各类服务的启动/关闭脚本

share:Hadoop各个模块编译后的jar包所在目录

  1. 配置hadoop环境

hadoop需要我们配置的相关文件都存放在$HADOOP_HOME/etc/hadoop目录下面,首先进入到该目录

[hadoop@hadoop01 hadoop]$ cd etc/hadoop/

进入到该目录之后使用ls 命令查看该目录下的文件信息

[hadoop@hadoop01 hadoop]$ ll

-rw-r--r--. 1 root root  4436 May 22  2017 capacity-scheduler.xml
-rw-r--r--. 1 root root  1335 May 22  2017 configuration.xsl
-rw-r--r--. 1 root root   318 May 22  2017 container-executor.cfg
-rw-r--r--. 1 root root   774 May 22  2017 core-site.xml
-rw-r--r--. 1 root root  3670 May 22  2017 hadoop-env.cmd
-rw-r--r--. 1 root root  4224 May 22  2017 hadoop-env.sh
-rw-r--r--. 1 root root  2598 May 22  2017 hadoop-metrics2.properties
-rw-r--r--. 1 root root  2490 May 22  2017 hadoop-metrics.properties
-rw-r--r--. 1 root root  9683 May 22  2017 hadoop-policy.xml
-rw-r--r--. 1 root root   775 May 22  2017 hdfs-site.xml
-rw-r--r--. 1 root root  1449 May 22  2017 httpfs-env.sh
-rw-r--r--. 1 root root  1657 May 22  2017 httpfs-log4j.properties
-rw-r--r--. 1 root root    21 May 22  2017 httpfs-signature.secret
-rw-r--r--. 1 root root   620 May 22  2017 httpfs-site.xml
-rw-r--r--. 1 root root  3518 May 22  2017 kms-acls.xml
-rw-r--r--. 1 root root  1527 May 22  2017 kms-env.sh
-rw-r--r--. 1 root root  1631 May 22  2017 kms-log4j.properties
-rw-r--r--. 1 root root  5511 May 22  2017 kms-site.xml
-rw-r--r--. 1 root root 11237 May 22  2017 log4j.properties
-rw-r--r--. 1 root root   951 May 22  2017 mapred-env.cmd
-rw-r--r--. 1 root root  1383 May 22  2017 mapred-env.sh
-rw-r--r--. 1 root root  4113 May 22  2017 mapred-queues.xml.template
-rw-r--r--. 1 root root   758 May 22  2017 mapred-site.xml.template
-rw-r--r--. 1 root root    10 May 22  2017 slaves
-rw-r--r--. 1 root root  2316 May 22  2017 ssl-client.xml.example
-rw-r--r--. 1 root root  2268 May 22  2017 ssl-server.xml.example
-rw-r--r--. 1 root root  2250 May 22  2017 yarn-env.cmd
-rw-r--r--. 1 root root  4567 May 22  2017 yarn-env.sh
-rw-r--r--. 1 root root   690 May 22  2017 yarn-site.xml

我们首先可以发现,这些文件目前的权限都是基于root用户的,但是我们现在使用的是hadoop用户,hadoop用户并没有这些文件的权限,所以首先需要修改权限

使用chown 命令修改用户与用户组权限

sudo chown -R hadoop:hadoop /opt/soft/hadoop-2.7.2/

修改完成之后再次使用ls命令查看文件,查看是否修改成功

[hadoop@hadoop01 hadoop]$ ll

-rw-r--r--. 1 hadoop hadoop  4436 May 22  2017 capacity-scheduler.xml
-rw-r--r--. 1 hadoop hadoop  1335 May 22  2017 configuration.xsl
-rw-r--r--. 1 hadoop hadoop   318 May 22  2017 container-executor.cfg
-rw-r--r--. 1 hadoop hadoop   774 May 22  2017 core-site.xml
-rw-r--r--. 1 hadoop hadoop  3670 May 22  2017 hadoop-env.cmd
-rw-r--r--. 1 hadoop hadoop  4224 May 22  2017 hadoop-env.sh
-rw-r--r--. 1 hadoop hadoop  2598 May 22  2017 hadoop-metrics2.properties
-rw-r--r--. 1 hadoop hadoop  2490 May 22  2017 hadoop-metrics.properties
-rw-r--r--. 1 hadoop hadoop  9683 May 22  2017 hadoop-policy.xml
-rw-r--r--. 1 hadoop hadoop   775 May 22  2017 hdfs-site.xml
-rw-r--r--. 1 hadoop hadoop  1449 May 22  2017 httpfs-env.sh
-rw-r--r--. 1 hadoop hadoop  1657 May 22  2017 httpfs-log4j.properties
-rw-r--r--. 1 hadoop hadoop    21 May 22  2017 httpfs-signature.secret
-rw-r--r--. 1 hadoop hadoop   620 May 22  2017 httpfs-site.xml
-rw-r--r--. 1 hadoop hadoop  3518 May 22  2017 kms-acls.xml
-rw-r--r--. 1 hadoop hadoop  1527 May 22  2017 kms-env.sh
-rw-r--r--. 1 hadoop hadoop  1631 May 22  2017 kms-log4j.properties
-rw-r--r--. 1 hadoop hadoop  5511 May 22  2017 kms-site.xml
-rw-r--r--. 1 hadoop hadoop 11237 May 22  2017 log4j.properties
-rw-r--r--. 1 hadoop hadoop   951 May 22  2017 mapred-env.cmd
-rw-r--r--. 1 hadoop hadoop  1383 May 22  2017 mapred-env.sh
-rw-r--r--. 1 hadoop hadoop  4113 May 22  2017 mapred-queues.xml.template
-rw-r--r--. 1 hadoop hadoop   758 May 22  2017 mapred-site.xml.template
-rw-r--r--. 1 hadoop hadoop    10 May 22  2017 slaves
-rw-r--r--. 1 hadoop hadoop  2316 May 22  2017 ssl-client.xml.example
-rw-r--r--. 1 hadoop hadoop  2268 May 22  2017 ssl-server.xml.example
-rw-r--r--. 1 hadoop hadoop  2250 May 22  2017 yarn-env.cmd
-rw-r--r--. 1 hadoop hadoop  4567 May 22  2017 yarn-env.sh
-rw-r--r--. 1 hadoop hadoop   690 May 22  2017 yarn-site.xml

通过再次查看我们发现,现在的权限已经全部修改为hadoop ,这样我们就可以在hadoop用户下对这些文件进行操作了

完成了以上的配置之后,我们接下来首先需要配置如下文件

hadoop-env.sh:  用于hadoop的环境变量配置文件

# The java implementation to use.
export JAVA_HOME=/opt/soft/jdk1.8.0_181

在该配置文件中,找到如上内容,并且修改JAVA_HOME 为自己的JDK路径

配置完成之后,可以在hadoop根路径下,输入如下命令

bin/hadoop

Usage: hadoop [--config confdir] [COMMAND | CLASSNAME]
  CLASSNAME            run the class named CLASSNAME
 or
  where COMMAND is one of:
  fs                   run a generic filesystem user client
  version              print the version
  jar <jar>            run a jar file
                       note: please use "yarn jar" to launch
                             YARN applications, not this command.
  checknative [-a|-h]  check native hadoop and compression libraries availability
  distcp <srcurl> <desturl> copy file or directories recursively
  archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
  classpath            prints the class path needed to get the
  credential           interact with credential providers
                       Hadoop jar and the required libraries
  daemonlog            get/set the log level for each daemon
  trace                view and modify Hadoop tracing settings

Most commands print help when invoked w/o parameters.

如果能看到如上的信息,说明基本的运行环境已经搭建完成了

Hadoop的运行模式,分为以下几种:

1) 本地模式(默认模式)

不需要启用单独进程,直接可以运行,测试和开发时使用。

2)伪分布模式

等同于完全分布式,只有一个节点。

3)完全分布式模式

多个节点一起运行。

本地运行Hadoop官方案例Grep

对于这个案例来说,主要的作用就是,在一堆文件中与规定的正则表达式进行匹配,把匹配成功的单词出现的次数,进行统计

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

以上为官网上给出的案例代码

从以上的案例代码可以得出,首先需要创建一个目录,用于存放需要统计的文件,而对于统计结果的保存目录则不用以前创建,注意:Hadoop中输出结果的目录是不能提前存在的

范例:运行grep案例

1)在hadoop根目录下创建一个文件夹input

[hadoop@hadoop01 hadoop-2.7.2]$ mkdir input

  1. 将hadoop的xml配置文件复制到input

[hadoop@hadoop01 hadoop-2.7.2]$ cp etc/hadoop/*.xml input/

  1. 执行share目录下的mapreduce程序

[hadoop@hadoop01 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output ‘dfs[a-z.]+’

  1. 查看输出结果

[hadoop@hadoop01 hadoop-2.7.2]$ cat output/*
1 dfsadmin

运行官方wordcount案例

1) 在hadoop根目录中创建用于保存统计文件的wcinput目录

[hadoop@hadoop01 hadoop-2.7.2]$ mkdir wcinput

  1. 在 wcinput 文件下创建一个 wordcount.txt 文件

[hadoop@hadoop01 wcinput]$ vi worldcount.txt

hello   java    world   input
hadoop  hive    zookeeper       java
world   input   hello   hadoop
hbase   zookeeper       sqoop
  1. 执行wordcount案例程序

[hadoop@hadoop01 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput

4) 查看结果

[hadoop@hadoop01 hadoop-2.7.2]$ cat wcoutput/part-r-00000
hadoop 2
hbase 1
hello 2
hive 1
input 2
java 2
sqoop 1
world 2
zookeeper 2

2.2.6 HDFS伪分布式安装

启动 HDFS 并运行 MapReduce 程序

对于伪分布式安装来说,需要配置自定义的配置文件,用于启动hdfs,以及yarn

  1. 配置core-site.xml 配置文件,内容如下
<configuration>
	<property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop01:8020</value>
</property>

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

配置HDFS的对外的访问路径,并且配置hadoop临时保存目录

2 ) 配置hdfs-site.xml 配置文件

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

以上的配置,把hdfs 文件块的副本复制的数量设置1 由于在伪分布式环境中,必须设置为1

完成以上的步骤,就可以对HDFS 文件进行格式化操作,命令如下

[hadoop@hadoop01 hadoop-2.7.2]$ bin/hadoop namenode -format

INFO common.Storage: Storage directory /tmp/hadoop-hadoop/dfs/name
has been successfully formatted.

出现如上的信息,说明格式化成功

格式化成功之后,就可以分别启动,HDFS 的相关进程

1) 启动namenode

sbin/hadoop-daemon.sh start namenode
  1. 启动 datanode
sbin/hadoop-daemon.sh start datanode

启动namenode 与 datanode之后,可以通过web的方式进行访问(前提必须关闭防火墙)

http://10.0.153.228:50070/explorer.html#/

完成以上的操作之后,就可以通过操作HDFS 进行文件的上传并且在HDFS文件系统上对文件进行分析

范例:操作集群

1) 在HDFS文件系统上创建一个input文件夹

[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -mkdir /input

  1. 将测试文件内容上传到文件系统上

[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -put wcinput/wordcount.txt /input

  1. 查看文件上传是否正确

[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -ls /input
Found 1 items
-rw-r–r-- 1 hadoop supergroup 98 2019-04-23 14:18 /input/wordcount.txt

  1. 运行mapreducec程序

[hadoop@hadoop01 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output

  1. 查看输出结果

[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -cat /output/par*
hadoop 2
hbase 1
hello 2
hive 1
input 2
java 2
sqoop 1
world 2
zookeeper 2

除了以上的方式查看输出的结果文件之外,也可以通过web访问HDFS的方式进行查看

[外链图片转存失败(img-uiTWedQG-1567081887423)(E:/qqq/days/8.28/Hadoop-and-hdfs/resources/B014A30F08B59EF0706BA4FB15BD90A1.png)]

  1. 将输出结果下载到本地

[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -get /output/part-r-00000

  1. 删除输出结果

[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -rmr /output

在Yarn上运行MapReduce程序

首先需要在mapred-site.xml 配置文件,配置如下信息

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

接下来在yarn-site.xml 配置文件进行如下配置

<configuration>

 <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
  </property>

</configuration>

配置完以上的配置之后,可以使用如下命令启动yarn的进行

  1. resoucemanager
[hadoop@hadoop01 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager
  1. nodemanager
[hadoop@hadoop01 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager

启动成功之后,可以通过jps 查看进程是否启动成功

[hadoop@hadoop01 hadoop-2.7.2]$ jps
5139 Jps
29783 DataNode
29497 NameNode
4766 ResourceManager
5039 NodeManager

执行jps命令之后,可以发现进程中存在ResourceManager与NodeManager两个进程

启动成功之后,就可以通过web浏览器的方式进行查看

http://192.168.1.124:8088/cluster

[外链图片转存失败(img-Mgvenws3-1567081887424)(E:/qqq/days/8.28/Hadoop-and-hdfs/resources/AF866974C6F4458FA09BC5239E340862.png)]

再次执行mapredcue程序,可以发现mapreduce程序已经运行在yarn平台上

[外链图片转存失败(img-SFX5P2LY-1567081887425)(E:/qqq/days/8.28/Hadoop-and-hdfs/resources/D26F7AB28B6A40A570D2D27749B9F4E8.png)]

配置历史服务

1) 在mapred-site.xml 文件中,配置如下信息

<property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop01:10020</value>
    </property>

配置MR任务的历史服务器地址,以及端口号

<property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop01:19888</value>
    </property>

完成以上的配置之后,需要启动历史服务器,的服务进程

sbin/mr-jobhistory-daemon.sh start historyserver

通过以上命令启动,历史服务器

配置日志聚集功能

所谓日志聚集功能,其实就是在MR任务运行结束之后,把相关的运行日志上传到HDFS文件系统中,保存下来方便查看

开启日志聚集的步骤如下:

1)配置yarn-site.xml 配置文件

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

以上的配置内容为,启动日志聚集功能

  1. 配置日志在HDFS上保存的时间 yarn -site.xml
<property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
  </property>

以上的配置,保存时间为7天,之后将会把日志删除

如果配置了日志聚集功能,在启动集群的时候,就需要注意,由于日志需要保存在HDFS上,所以必须保证HDFS首先启动完成。

配置完成之后,需要重新启动,历史服务器 jobhistoryserver

配置完日志聚集功能之后,需要把yarn (resourcemanager,nodemanager) 重新启动

配置文件的说明

在hadoop中配置文件分为两类,默认的配置文件,以及用户自定义的配置文件,在默认的配置文件中,属性都是已经定义好的,但是定义好的默认的属性,有些时候并不适用每个场景,所以需要用户对其进行自定义

在配置文件的优先级中:自定义的配置文件>高于默认的配置文件

默认的配置文件,存放在Hadoop中位置:

core-default.xml :hadoop-2.7.2\share\hadoop\common\hadoop-common-2.7.2.jar

hdfs-default.xml:hadoop-2.7.2\share\hadoop\hdfs\hadoop-hdfs-2.7.2.jar

yarn-default.xml:hadoop-2.7.2\share\hadoop\yarn\hadoop-yarn-common-2.7.2.jar

mapred-default.xml:hadoop-2.7.2\share\hadoop\mapreduce\hadoop-mapreduce-client-core-2.7.2.jar

2.2.7 完全分布式安装hadoop

1)环境准备

修改3台虚拟机的主机名称,ip地址,修改完成主机名称之后,修改hosts地址,要求3台主机全部一致

sudo vi /etc/hosts

10.0.153.228  hadoop01

10.0.153.223 hadoop02

10.0.153.225 hadoop03

编辑完成之后,把该文件分发到其他两个节点

scp /etc/hosts hadoop02:/etc/hosts

如果使用的用户不是root 则需要使用sudo 提升权限

由于目前的环境是从一台虚拟机克隆出来的,所以只需要修改主机名称,以及IP地址即可,其他的配置完全一样

  1. 集群规划
Hadoop01Hadoop02Hadoop03
NameNodedataNodeDataNode
DataNodeResourceManagerNodemanager
NodeManagerNodeManagerSecondaryNamenode

3)集群安装

Hadoop 完全分布式的安装,在之前的基础上修改即可

core-site.xml 保持原来不变

<configuration>
	<property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop01:8020</value>
    </property>
	
	<property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/app/hadoop-2.7.2/data/tmp</value>
    </property>
</configuration>

hdfs-site.xml 配置的修改的内容如下

<configuration>
	<property>
	  <name>dfs.namenode.secondary.http-address</name>
	  <value>hadoop03:50090</value>
	</property>
	<property>
	  <name>dfs.namenode.http-address</name>
	  <value>hadoop01:50070</value>
	</property>
	<property>
	  <name>dfs.permissions.enabled</name>
	  <value>false</value>
	</property>
</configuration>

dfs.namenode.secondary.http-address: 设置secondaryNamenode 主机地址

dfs.namenode.http-address: NameNode WEB访问地址的主机地址设置

dfs.permissions.enabled: HDFS 文件系统的权限控制 false 为关闭

修改yarn-site.xml 配置文件,增加RM的主机位置

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

 <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
  </property>
  
  
  <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
  </property>
  
  <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
  </property>
</configuration>

mapred-site.xml 配置文件 没有任何改变

<configuration>
	<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
	
	<property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop01:10020</value>
    </property>
	
	<property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop01:19888</value>
    </property>
</configuration>

在完全分布式环境中,必须要配置savles 文件,在该文件中增加从节点的主机名称

hadoop01
hadoop02
hadoop03

完成以上的配置之后,使用scp命令,把配置的文件分发到不同的节点上

scp -r /opt/app/hadoop-2.7.2/etc/hadoop/ hadoop03:/opt/app/hadoop-2.7.2/etc/

格式化之前,保证所有节点中的/tmp目录中是被清空的,以及hadoop根目录中的data/tmp 下面是没有内容的

清空所有节点之后,需要在hadoop01 也就是NameNode所在的节点上进行格式化

bin/hadoop namenode -format

格式化成功之后,就可以分别启动从节点上的服务

sbin/hadoop-daemon.sh start namenode  在hadoop01 

sbin/yarn-daemon.sh start resourcemanager  hadoop02

Datanode 与 nodemanager 分别在3台节点上启动 sbin/hadoop-daemon.sh start datanode
sbin/yarn-daemon.sh start nodemanager

配置集群节点之间的免密登录

在用户名中的家目录中进入到.ssh 隐藏目录中,使用如下命令

ssh-keygen -t rsa

生成公钥与私钥

id_rsa  id_rsa.pub

分别在3台节点上重复以上的步骤

之后使用ssh-copy_id 对应相应的主机名进行公钥之间的拷贝完成免密

ssh-copy-id hadoop03

完成免密登录之后,就可以使用start-all.sh stop-all.sh 的方式启动和关闭集群。

集群时间同步

时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时
的同步,比如,每隔十分钟,同步一次时间

配置时间同步的步骤如下:

1) 在root用户下检查是否安装ntp服务

[hadoop@hadoop01 hadoop-2.7.2]$ rpm -qa |grep ntp
fontpackages-filesystem-1.41-1.1.el6.noarch
ntpdate-4.2.6p5-10.el6.centos.x86_64
ntp-4.2.6p5-10.el6.centos.x86_64
2.2.8 HDFS工作机制

HDFS概念

HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
HDFS的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。

HDFS优缺点

优点:

1)高容错性:数据自动保存多个副本,当一个副本丢失后,可以自动回复。
2)适合大数据处理:文件规模大(个数多)、数据规模大(数据大小)
3) 流式数据访问:一次写入,多次读取,不能修改,只能追加。保证数据一致性。
4) 构建成本低:可以构建在廉价的机器上。

缺点:

1)不适合做低延迟数据访问,比如毫秒级的数据访问是做不到的。
2)无法高效的对大量小文件进行存储。
3)无法并发写入和随机修改。

[外链图片转存失败(img-nx8MnnL7-1567081887430)(E:/qqq/days/8.28/Hadoop-and-hdfs/resources/A3AA1F0DCD1AD8FC7B38318C42114ADC.png)]

对于HDFS的架构,存在以下组件:

Client ,NameNode DataNode 和SecondaryNameode

Client: 客户端

1)负责文件的切片,文件上传到HDFS的时候会把文件切分成一个个BLOCK进行上传存储

2)与NameNode进行交互,获得文件的存储位置,检查是否存在重复文件等

3)与DataNode进行交互,写入真正的数据,以及读取数据

4)提供了一些HDFS的访问命令,以及API操作

NameNode :主节点 只有一个(在没有HA的情况下)

1) 管理HDFS的命名空间

2) 管理数据块的映射信息

3) 配置副本策略

4) 处理客户端的请求

DataNode: 工作者

1)存储真正的数据(按照块进行存储)

2)执行数据块的读写操作

3)定时向NameNode进行汇报(心跳机制)

SecondaryNameNode:

SecondaryNameNode,作为nameNode的辅助节点,帮助namenode合并fsimae 与edits文件,由于SecondaryNameNode 的元数据不能与nameNode的元数据保持实时同步,所以不能作为NameNode的热备节点

HDFS 的文件块大小

​ HDFS 中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize) 来规定,默认大小在 hadoop2.x 版本中是 128M,老版本中是 64M。

​ HDFS 的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁 盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组 成的文件的时间取决于磁盘传输速率。

​ 如果寻址时间约为 10ms,而传输速率为 100MB/s,为了使寻址时间仅占传输时间的 1%, 我们要将块大小设置约为 100MB。默认的块大小 128MB。

块的大小:10ms100100M/s = 100M

2.2.9 HDFS文件读取流程

为了了解客户端及与之交互的HDFS,namenode和datanode之间的数据流是什么样的,我们可以通过下图来了解HDFS在读取文件时发生的顺序

[外链图片转存失败(img-ePogrMe4-1567081887433)(E:/qqq/days/8.28/Hadoop-and-hdfs/resources/6ED6851CCE4EFC07CC3DDA815B4C4BBB.png)]

1) 客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说,这个对象是DistributedFileSystem通过使用远程调用RPC来调用namenode,以确定文件起始块的位置

2) 对于每一个块NameNode返回存有该块副本的DataNode地址

3)DistributedFileSystem类返回一个FSDataInputStream对象(该对象是一个支持文件定位的输入流)给客户端以便读取数据,接着客户端对这个输入流调用read()方法

4)FSDataInputStream随即连接距离最近文件中第一个块所在的DataNode,通过对数据流反复调用read()方法,可以将数据从DataNode传输到客户端

  1. 当读取到块的末端时,FSInputStream关闭与该DataNode的连接,然后寻找下一个块的最佳DataNode

  2. 客户端从流中读取数据时,块是按照打开FSInputStream与DataNode的新建连接的顺序读取的。它也会根据需要询问NameNode来检索下一批数据块的DataNode的位置。一旦客户端完成读取,就对FSInputStream调用close方法

在读取数据的时候,如果FSInputStream与DataNode通信时遇到错误,会尝试从这个块的最近的DataNode读取数据,并且记住那个故障的DataNode,保证后续不会反复读取该节点上后续的块。FInputStream也会通过校验和确认从DataNode发来的数据是否完整。如果发现有损坏的块,FSInputStream会从其他的块读取副本,并且将损坏的块通知给NameNode

2.2.10HDFS文件写入流程

1) 客户端通过对DistributedFileSystem对象调用create()方法来新建文件

2)DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中新建一个文件,此时该文件中还没有相应的数据块

3)namenode执行各种不同的检查,以确保这个文件不存在以及客户端有新建该文件的权限。如果检查通过,namenode就会为创建新文件记录一条记录,否则,文件创建失败并向客户端抛出一个IOException异常。DistributedFileSystem向客户端返回一个FSDataOuputStream对象,由此客户端可以开始写入数据,

4)在客户端写入数据时,FSOutputStream将它分成一个个的数据包,并写入内部队列,这个队列称为“数据队列”(data queue)。

FSOutputStream处理数据队列时它的责任是挑选出合适存储数据复本的一组datanode,并以此来要求namenode分配新的数据块。这一组datanode将构成一个管道,以默认复本3个为例,所以该管道中有3个节点.FSOutputStream将数据包流式传输到管道中第一个datanode,该datanode存储数据包并将它发送到管道中的第2个datanode,同样,第2个datanode存储该数据包并且发送给管道中的第三个datanode

5)datanode写入数据成功之后,会为FSOutputStream发送一个写入成功的信息回执,也称为确认队列,当收到管道中所有的datanode确认信息后,该数据包才会从确认队列中删除

如果任何datanode在写入数据期间发生故障,则执行以下操作:

1)首先关闭管道,确认把队列中的所有数据包都添加回数据队列的最前端,以确保故障节点下游的datanode不会漏掉任何一个数据包

2)为存储在另一正常datanode的当前数据块制定一个新标识,并将该标识传送给namenode,以便故障datanode在恢复后可以删除存储的部分数据块

3)从管道中删除故障datanode,基于两个正常datanode构建一条新管道,余下数据块写入管道中正常的datanode

4) namenode注意到块复本不足时,会在另一个节点上创建一个新的复本

件写入流程

1) 客户端通过对DistributedFileSystem对象调用create()方法来新建文件

2)DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中新建一个文件,此时该文件中还没有相应的数据块

3)namenode执行各种不同的检查,以确保这个文件不存在以及客户端有新建该文件的权限。如果检查通过,namenode就会为创建新文件记录一条记录,否则,文件创建失败并向客户端抛出一个IOException异常。DistributedFileSystem向客户端返回一个FSDataOuputStream对象,由此客户端可以开始写入数据,

4)在客户端写入数据时,FSOutputStream将它分成一个个的数据包,并写入内部队列,这个队列称为“数据队列”(data queue)。

FSOutputStream处理数据队列时它的责任是挑选出合适存储数据复本的一组datanode,并以此来要求namenode分配新的数据块。这一组datanode将构成一个管道,以默认复本3个为例,所以该管道中有3个节点.FSOutputStream将数据包流式传输到管道中第一个datanode,该datanode存储数据包并将它发送到管道中的第2个datanode,同样,第2个datanode存储该数据包并且发送给管道中的第三个datanode

5)datanode写入数据成功之后,会为FSOutputStream发送一个写入成功的信息回执,也称为确认队列,当收到管道中所有的datanode确认信息后,该数据包才会从确认队列中删除

如果任何datanode在写入数据期间发生故障,则执行以下操作:

1)首先关闭管道,确认把队列中的所有数据包都添加回数据队列的最前端,以确保故障节点下游的datanode不会漏掉任何一个数据包

2)为存储在另一正常datanode的当前数据块制定一个新标识,并将该标识传送给namenode,以便故障datanode在恢复后可以删除存储的部分数据块

3)从管道中删除故障datanode,基于两个正常datanode构建一条新管道,余下数据块写入管道中正常的datanode

4) namenode注意到块复本不足时,会在另一个节点上创建一个新的复本

在一个块被写入期间可能会有多个datanode同时发生故障,但概率非常低。只要写入了dfs.namenode.replication.min的复本数(默认1),写操作就会成功,并且这个块可以在集群中异步复制,直到达到其目标复本数dfs.replication的数量(默认3)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值