HDFS入门

企业大数据的一般工作流程:

数据源:

数据的来源有如下的内容:
	-关系型数据库
		各种关系表,如订单表,账号表,基本信息表
	-日志文件
		用户行为数据
		浏览了哪些页面(网页,App,电视机顶盒),导航栏上的哪些选项等
	-第三方数据
		第三方的接口提供数据
		爬虫

数据采集或者同步:

常用的数据采集导入框架:
	-sqoop:
		用于RDBMS和HDFS之间数据导入与导出
	-flume:
		采集日志文件数据,动态的采集日志文件,数据流
		flume采集到的数据,一份给HDFS,用于离线分析;一份给Kafka了,实时处理
	-kafka:
		主要用于实时的数据流处理
		flume和kafka都有类似的消息队列的机制,来缓存大数据环境处理不了的数据

数据存储:

常用的数据存储框架:
HDFS,HBase,ES

数据清洗:

即对数据进行过滤,得到具有一定格式的数据源
常用的框架:MapReduce,Hive(ETL),SparkCore,SparkSql

数据分析:

对经过数据清洗的数据进行分析,得到某个指标
常用的框架:MapReduce,Hive,SparkSQL,impala(impale),kylin

数据展示:

即将数据分析后的结果展示出来,也可以理解成数据的可视化,以图或者表的具体形式展示出来:
常用的工具:metastore,JavaWeb,hcharts,echarts

Hadoop概述:

数据大小单位:Byte,KB,MB,GB,TB,PB,EB,ZB,YB,DB,NB

Hadoop的组成部分:

hadoop2.0以后的四个模块:
	Hadoop Common:Hadoop模块的通用组件
	Hadoop Distributed File System:分布式文件存储系统
	Hadoop Yarn:作业调度,资源管理框架
	Hadoop MapReduce:基于Yarn的大型数据集并行计算处理框架
Hadoop3.0新扩展的两个模块:
	Hadoop Ozone:Hadoop的对象存储机制
	Hadoop Submarine:Hadoop的机器学习引擎

Hadoop生态圈:

Hbase:
	是一个可扩展的分布式数据库,支持大型表格的结构化数据存储。Hbase是Apache的Hadoop项目的子项目,Hbase不同于一般的关系型数据,它是一个适合于非结构化数据存储的数据库,另一个不同的是Hbase是基于列的,而不是基于行的模式
Hive:
	数据仓库基础架构,提供数据汇总和临时查询,可以将结构化的数据文件映射成一张表数据库表,并提供简单的sql查询功能,可以将sql语句转化成MapReduce任务进行运行,Hive提供的是一种结构化数据的机制,定义了类似于传统关系型数据库的类sql语言Hql,通过该查询语言,数据分析人员可以很方便的运行数据分析业务
Spark:
	Hadoop数据的快速和通用计算引擎,Spark提供了一个简单而富有表现力的编程模型,支持广泛的应用程序,包括ETL,机器学习,流处理和图计算
Zookeeper:
	一个面向分布式应用程序的高性能协调服务,是Hadoop和Hbase和重要组件,它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护,域名服务,分布式同步,组同步
Sqoop(数据ETC/同步工具):
	Sqoop是Sql-to-Hadoop的缩写,主要用于传统数据库和Hadoop直接传输数据、数据的导入导出本质上是MapReduce程序,充分利用了MR的并行和容错性
Flume(日志收集工具):
	Cloudera开源的日志收集系统,具有分布式,高可靠,高容错,易于定制和扩展的特点,它将数据从产生,传输,处理最终写入目标的路径,的过程抽象为数据流,在具体的数据流中,数据源支持再Flume中定制数据发送方,从而支持收集各种不同协议数据,同时,Flume数据流提供对日志数据进行简单处理的能力,如过滤,格式转换等
Kafka:
	Kafka是Linkedin于2010年12月份开源的消息系统,它主要用于处理活跃的流式数据,这些数据包括网站的pv,用户访问了什么内容,搜索了什么内容等,这些数据通常以日志的形式记录下来,然后每隔一段时间进行一次统计处理
Ambari:
	用于供应,管理和监控Apache Hadoop集群的基于Web的工具,Ambari目前已经支持大多数Hadoop组件,包括HDFS,MapReduce,Hive,Pig,Hbase,Zookeeper,Sqoop,Hcatalog等,Ambari还提供了一个用于查看集群健康状态的仪器版,例如热图以及可视化查看MapReduce,Pig和Hive应用程序的功能以及用于诊断其性能特性的功能,以方便用户使用
Avro:
	数据序列化系统,可以将数据节后或者对象转换成便于存储的和传输的格式,其设计目标是用于支持数据密集型应用,适合规模数据的存储与交换。Avro提供了丰富的数据结构类型,快速可压缩的二进制数据格式,存储持久性数据的文件集,远程调用RPC和简单动态语言集成等功能
Cassandra:
	可扩展的多主数据库,没有单点障碍,是一套开源分布式的NoSQL数据库系统
Chukwa:
	于管理大型分布式系统的数据收集系统(2000+以上的节点,系统每天产生的监控数据量在T级别以上),他构建在Hadoop的HDFS和MapReduce基础之上,继承了Hadoop的可伸缩性和鲁棒性,Chukwa包含一个强大和灵活的工具集,提供了数据的产生,收集,排序,去重,分析和展示等一些列功能,是Hadoop使用者,集群运营人员和管理人员的必备工具
Mahout:
	Apache旗下的一个开源项目,可扩展的机器学习和数据挖掘库
Pig:
	用于并行计算的高级数据流语言和执行框架,它简化了使用Hadoop进行数据分析的要求,提供了一个高层次的面向领域的抽象语言:Pig Latin
Tez:
	一个基于Hadoop Yarn的通用数据流编程框架,它提供了一个强大而灵活的引擎,可执行任意地DAG任务来处理批处理和交互式用力的数据Hado生态系统中的Hive,Pig和其他框架以及其他商用软件(例如ETL工具)正在采用Tez,以替代Hadoop的MapReduce作为底层执行引擎
Oozie:
	一个可扩展的工作体系,集成于Hadoop的堆栈,用于协调多个MapReduce作业的执行,它能够管理一个复杂的系统,基于外部事件来执行,外部事件包括数据的定时和数据的出现
pig(ad-hoc脚本):
	由yahoo!开源设计动机是提供一种基于MapReduce的ad-hoc(计算在query是发生)数据分析工具,通常用于离线分析,它定义了一种数据流语言-Pig Latin,它是MapReduce编程的复杂性的抽象,Pig平台包括运行环境和用于分析Hadoop数据集的脚本语言(Pig Latin)
Apache官网:https://apache.org

Hadoop安装部署:

本地模式搭建:

特点:
	-本地模式,即运行在 单台机器上,没有分布式的思想,使用的是本地文件系统
用途:
	本地模式主要用于对MapReduce程序的逻辑进行调试,确保程序的正确性,由于在本地模式下测试和体哦啊是MapReduce程序较为方便,因此,这种模式适合用在开发阶段

平台软件安装:

操作系统:Windows10
虚拟软件:VMware
虚拟机:qianfeng04,ip地址:192.168.10.104
SSH工具:finalshell
软件包上传安装路径:/usr/local
jdk:jdk-8u221-linux-x64.tar.gz
Hadoop:hadoop-2.7.6.tar.gz
用户:root

环境搭建:

1.安装jdk
2.安装hadoop

hadoop的目录说明:

drwxr-xr-x. 2 20415 101   194 4月  18 2018 bin		hadoop的二进制执行命令文件存储目录
drwxr-xr-x. 3 20415 101    20 4月  18 2018 etc		hadoop的配置文件存储目录
drwxr-xr-x. 2 20415 101   106 4月  18 2018 include	hadoop的工具脚本存储目录
drwxr-xr-x. 3 20415 101    20 4月  18 2018 lib		hadoop的资源库存储目录
drwxr-xr-x. 2 20415 101   239 4月  18 2018 libexec	hadoop的资源库存储目录
-rw-r--r--. 1 20415 101 86424 4月  18 2018 LICENSE.txt
-rw-r--r--. 1 20415 101 14978 4月  18 2018 NOTICE.txt
-rw-r--r--. 1 20415 101  1366 4月  18 2018 README.txt
drwxr-xr-x. 2 20415 101  4096 4月  18 2018 sbin		hadoop的执行脚本存储目录
drwxr-xr-x. 4 20415 101    31 4月  18 2018 share		haodop的共享资源,开发工具和案例存储目录

伪分布式集群搭建:

伪分布式模式介绍:

特点:
	-在一台机器上安装,使用的是分布式思想,即分布式文件系统,非本地文件系统
	-HDFS涉及到相关的守护进程(namenode,datanode,secondaryNamenode)都是运行在一台机器上,都是独立的java进程
用途:
	-比standalone mode多了代码调试功能,允许检查内存使用情况,HDFS输入输出,以及其他的守护进程交互

平台软件说明:

操作系统:Windows10
虚拟软件:VMware
虚拟机:qianfeng05,ip地址:192.168.10.105
SSH工具:finalshell
软件包上传安装路径:/usr/local
jdk:jdk-8u221-linux-x64.tar.gz
Hadoop:hadoop-2.7.6.tar.gz
用户:root

伪分布式搭建环境准备:

总纲:

1.确保防火墙是关闭状态
2.确保NAT模式和静态ip的确定(192.168.10.105)
3.确保/etc/hosts文件中的映射关系
4.确保免密登录localhost有效
5.jdk和hadoop的环境变量配置

2.防火墙关闭

systemctl stop firewalld
systemctl stop NetworkManager
systemctl disable firewalld
systemctl disable NetworkManager

#最好也把selinux关闭掉,这是linux系统的一个安全机制,进入文件中将SELINUX设置为disabled

3.配置etc/hosts文件

[root@qianfeng01 ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.105 qianfeng05	#本机的静态ip和本机的主机名之间的对应关系

5.环境变量的配置

#Java的环境:
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/lib

#Haoop的环境:
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HAODOP_HOME/sbin

伪分布式的相关文件配置:

1.core-site.xml的配置:

#位置:/usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
	<!-- 配置分布式文件系统的schema和ip以及port,默认8020-->
	<property>
		<name>fs.defaultFS</name>
		<value>hdfs://localhost:8020/</value>
	</property>
</configuration>
#扩展:hadoop.x的默认端口是9000,hadoop2.x的默认端口是:8020,使用哪一个端口都可以

2.hdfs-site.xml的配置:

#位置:/usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
	<!-- 配置副本数,注意:伪分布式只能是1-->
	<property>
		<name>dfs.replication</name>
		<value>1</value>
	</property>
</configuration>

3.hadoop-env.sh的配置:指定jdk的环境:

#位置:/usr/local/haodop/etc/hadoop/hadoop-env.sh
# The Java implementation to use
export JAVA_HOME=/usr/local/jdk

格式化NameNode

1.格式化命令:

hdfs namenode -format

2.日志解读:

关键:
formatting using clusterid:CID-df7asd6faefa6sdf-adsf57asef5sd5
defaultReplication		=1
fsOwner					=root(auth:SIMPLE)
supergroup				=supergroup
Allocated new BlockPoolId:BP-5468548-6546468-4587485
successfully

3.启动HDFS

3.1启动伪分布式

start-dfs.sh

3.2启动滚动信息:

3.3jps命令查看守护进程:

不难发现,启动脚本之后,会开启分布式文件系统上的相关进程:
namenode
datanode
secondaryNamenode

4.WebUI查看:

在浏览器中输入:192.168.10.105:50070可以查看伪分布式集群的信息

compiled:编译
cluster id:集群id
block pool id:datanode节点的block池的id,每一个datanode节点都要一样

全分布式集群搭建:

总纲:

1.三台机器的防火墙必须是关闭的
2.确保三台机器的网络配置是通畅(NAT模式,静态ip,主机名的配置)
3.确保/etc/hosts文件配置了ip和hostname的映射关系
4.确保配置了三台机器的免密登录认证(克隆会更加方便)
5.确保所有机器时间同步
6.jdk和hadoop的环境变量配置

3.映射关系(重点)

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
#添加主机ip和本机的主机名之间的映射关系
192.168.10.101 qianfeng01
192.168.10.102 qianfeng02
192.168.10.103 qianfeng03

4.免密登录认证(重点)

#一定要自己对自己免密验证登录
ssh-copy-id root@qianfeng01
注意:三台机器提前安装好的情况下,需要同步公钥文件,如果使用克隆技术,那么使用同一套密钥就方便很多

5.时间同步:

hadoop集群的配置文件:

core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml

#这几个配置文件都有默认的配置,命名为default
core-default.xml
hdfs-default.xml
mapred-default.xml
yatn-default.xml

完全分布式配置内容:

core-site.xml

#位置:/usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
	<!-- hdfs的地址名称:schame,ip,port-->
	<property>
		<name>fs.defaultFS</name>
		<value>hdfs://qianfeng01:8020</value>
	</property>
	<!-- hdfs的基础路径,被其他属性所依赖的⼀个基础路径 -->
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/usr/local/hadoop/tmp</value>
		</property>
</configuration>

hdfs-site.xml

#位置:/usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
	 <!-- namenode守护进程管理的元数据⽂件fsimage存储的位置-->
	 <property>
		<name>dfs.namenode.name.dir</name>
 		<value>file://${hadoop.tmp.dir}/dfs/name</value>
	 </property>
	 
	 <!-- 确定HDFS数据节点应该将其块存储在本地⽂件系统的何处-->
 	 <property>
 		<name>dfs.datanode.data.dir</name>
		<value>file://${hadoop.tmp.dir}/dfs/data</value>
	 </property>
	 
	 <!-- 块的副本数-->
	 <property>
 		<name>dfs.replication</name>
		<value>3</value>
	 </property>
	 
 	 <!-- 块的⼤⼩(128M),下⾯的单位是字节-->
 	 <property>
 	 	<name>dfs.blocksize</name>
 		<value>134217728</value>
 	 </property>
 	 
 	 <!-- secondarynamenode守护进程的http地址:主机名和端⼝号。参考守护进程布局-->
	 <property>
		 <name>dfs.namenode.secondary.http-address</name>
 		 <value>qianfeng02:50090</value>
 	 </property>
 	 
	 <!-- namenode守护进程的http地址:主机名和端⼝号。参考守护进程布局-->
	 <property>
		 <name>dfs.namenode.http-address</name>
		 <value>qianfeng01:50070</value>
	 </property> 
</configuration>

mapred-site.xml

[root@qianfeng01 hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@qianfeng01 hadoop]# vi mapred-site.xml
<configuration>
	 <!-- 指定mapreduce使⽤yarn资源管理器-->
 	 <property>
 		<name>mapreduce.framework.name</name>
 		<value>yarn</value>
 	 </property>
 	 
 	 <!-- 配置作业历史服务器的地址-->
 	 <property>
 		<name>mapreduce.jobhistory.address</name>
 		<value>qianfeng01:10020</value>
 	 </property>
 	 
 	 <!-- 配置作业历史服务器的http地址-->
 	 <property>
 		<name>mapreduce.jobhistory.webapp.address</name>
 		<value>qianfeng01:19888</value>
 	 </property>
</configuration>

yarn-site.xml

#位置:/usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
	 <!-- 指定yarn的shuffle技术-->
 	 <property>
		 <name>yarn.nodemanager.aux-services</name>
 		 <value>mapreduce_shuffle</value>
	 </property>
	 
 	 <!-- 指定resourcemanager的主机名-->
	 <property>
		 <name>yarn.resourcemanager.hostname</name>
 		 <value>qianfeng01</value>
	 </property>
	 
 	 <!--下⾯的可选-->
 	 <!--指定shuffle对应的类 -->
	 <property>
 		<name>yarn.nodemanager.auxservices.mapreduce_shuffle.class</name>
	    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
	 </property>
	 
	 <!--配置resourcemanager的内部通讯地址-->
	 <property>
 		<name>yarn.resourcemanager.address</name>
 		<value>qianfeng01:8032</value>
 	 </property>
 	 
 	 <!--配置resourcemanager的scheduler的内部通讯地址-->
	 <property>
		 <name>yarn.resourcemanager.scheduler.address</name>
		 <value>qianfeng01:8030</value>
	 </property>
	 
 	 <!--配置resoucemanager的资源调度的内部通讯地址-->
 	 <property>
		 <name>yarn.resourcemanager.resourcetracker.address</name>
 		 <value>qianfeng01:8031</value>
	 </property>
	 
 	 <!--配置resourcemanager的管理员的内部通讯地址-->
 	 <property>
 		<name>yarn.resourcemanager.admin.address</name>
 		<value>qianfeng01:8033</value>
 	 </property>
 	 
 	 <!--配置resourcemanager的web ui 的监控⻚⾯-->
 	 <property>
		 <name>yarn.resourcemanager.webapp.address</name>
		 <value>qianfeng01:8088</value>
 	 </property>
</configuration>

hadoop-env.sh

#位置:/usr/local/hadoop/etc/hadoop/hadoop-env.sh
# The Java implementation to use
export JAVA_HOME=/usr/local/jdk

slaves

#此文件用于指定datanode守护进程所在的机器节点主机名
位置:/usr/local/hadoop/etc/hadoop/slaves
qianfeng01
qianfeng02
qianfeng03

yarn-env.sh

#此文件可以不配置,不过还是修改一下yarn的jdk环境比较好
#位置:/usr/local/hadoop/etc/hadoop/yarn-env.sh
# some Java parameters
export JAVA_HOME=/usr/local/jdk
if [ "$JAVA_HOME" != "" ]; then
 #echo "run java in $JAVA_HOME"
 JAVA_HOME=$JAVA_HOME
fi

另外两台机器的说明:

方式一:
	scp进行同步
方式二:
	克隆qianfeng01虚拟机

格式化NameNode:

1.注意事项

格式化完成NameNode后,会在core-site.xml中配置hadoop.tmp.dir的路径下生成集群相关的文件,如果之前在伪分布式的时候已经完成格式化,并且这个路径已经生成了,需要先将这个目录手动删除,然后再格式化集群,否则会导致集群启动失败,namenode和datanode无法建立连接

2.在qianfeng01上运行格式化指令

hdfs namenode -format

3.格式化的相关信息解读

1.生成一个集群的唯一标识符:clusterid
2.生成一个块池的唯一标识符:blockPoolId
3.生成namenode进程管理内容(fsimage)的存储路径:
	默认配置文件属性hadoop.tmp.dir指定的路径下生成dfs/name目录
4.生成镜像文件fsimage,记录分布式文件系统根路径的元数据
5.块的副本数,集群的fsOwner

启动集群:

1.启动脚本和关闭脚本介绍:

启动脚本:
	start-dfs.sh
	start-yarn.sh
	start-all.sh
关闭脚本:
	stop-dfs.sh
	stop-yarn.sh
	stop-all.sh

2.启动集群

​ 2.1使用start-all.sh,启动集群

​ 2.2启动过程解析:

1.启动集群中的各个机器节点上的分布式文件系统的守护进程
2.一个namenode和resourcemanager以及secondarynamenode多个datanode和nodemanager
3.在namenode守护进程管理内容的目录下生成edit日志文件
4.在每个datanode所在节点下生成${hadoop.tmp.dir}/dfs/data目录里

3.jps查看进程

注意:

如果哪台机器的相关守护进程没有开启,那么,就查看哪台机器上的守护进程对应的日志log文件,注意,启动脚本运行时提醒的日志后缀是*.out,而我们查看的是*.log文件,此文件的位置:${HADOOP_HOME}/logs/里

4.Web UI查看:

http://192.168.10.101:50070

集群守护进程不能开启的情况:

1.格式化集群时,报错原因:
	当前用户使用不当
	/etc/hosts/里面的映射关系填写错误
	免密登录认证异常
	jdk的环境变量配置错误
	防火墙没有关闭
2.namenode进程没有开启的原因:
	当前用户使用不当
	重新格式化时,没有手动删除${hadoop.tmp.dir}
	网络震荡,导致edit日志文件中的事务ID序号不连续
3.datanode出现问题的原因
	/etc/hosts里的映射文件填写错误
	免密登录异常
	重新格式化时,忘记删除${hadoop.tem.dir}目录下的内容,造成datanode的唯一标识符不在新集群中
4.上述问题的暴力解决方式:重新格式化
	如果想重新格式化,那么需要删除每台机器上的${hadoop.tmp.dir}指定路径下的所有内容,然后再格式化:最好也把logs下目录下的内容也清空,因为日志内容已经是前一个废弃集群的日志信息了,留着也没有

HDFS的Shell操作:

hdfs实际就是一个分布式文件系统,我们可以使用一些命令来操作这个分布式文件系统上的文件
访问hdfs的命令:
	hadoop dfs -- 已经过时
	hadoop df -- 适用范围更大
	hdfs dfs -- 范围相对较小
	hadoop和hdfs dfs之间没有太大的区别
注意事项:
	分布式文件系统的路径在命令行中,要从/开始写起,即写绝对路径
hdfs dfs -mkdir (-p) /a/b/c			--->在分布式文件系统上创建目录,-p,多级创建
hdfs dfs -put /本地文件 /分布式文件系统路径			---->将本地文件系统的文件上传到分布式文件系统中
hdfs dfs -ls / 			---->查看分布式文件系统中的文件内容
hdfs dfs -copyToLocal  /分布式系统文件 /本地路径(可以不存在)   ---->下载文件
hdfs dfs -rm -rf /分布式路径		---->删除文件
hdfs dfs -appendToFile /本地文件 /hdfs上的文件
hdfs dfs -setrep 3 /	将hdfs的根目录下的文件副本数进行修改,默认为3、
hdfs dfs -touchz /path+filename		创建新的空文件
hdfs dfs -getmerge hdfs上的路径 本地路径	合并下载

HDFS块的概念:

传统理念下的数据存储缺点:

1.负载不均衡,因为文件大小不一致,势必会导致有的节点的磁盘的利用率高,有的节点磁盘利用率低
2.网络瓶颈问题:一个过大的文件存储在一个节点磁盘上,当有并行处理时,每个线程都需要从这个节点磁盘上读取的这个文件内容,那么这个时候就会出现网络瓶颈,不利于分布式的数据处理

HDFS的块:

HDFS与其他普通文件系统一样,同样引入了块(block)的概念,并且块的大小是固定的,但不想是普通文件系统那样小,而是根据实际需求可以自己定义,块时HDFS系统中的最小存储单位,在hadoop2.0中默认大小是128M,(hadoop1.x中默认大小是64M),在HDFS上的文件会被拆分 成许多块,每个块作为独立的单元进行存储,多个块存放在不同的DataNode上,整个过程中HDFS系统会保证一个块存储在一个数据节点上,但值得注意的是:如果某个文件的大小或者是文件的最后一个块没有到128M,则不会占据整个块空间

HDFS块的大小:

hdfs的块的大小远远大于传统文件的目的:
1.目的是最小化寻址开销时间
2.为了节省内存的使用率
不适合存储小文件的原因:
1.站在固定内存的角度来看,块所占用的内存大小是固定的,尽管块里面没有存满128M的数据,但是这个块还是会在内存中占用150字节的元数据
2.站在固定存储能力的角度来看,占用相同的内存资源,被存储的文件夹越大,存储的内容就越多

块的参数配置:

#这些配置信息存储在hdfs-default.xml文件中,我们可以在hdfs-site.xml中重新配置(建议不要)
<property>
  <name>dfs.blocksize</name>
  <value>134217728</value>
  <description>
      The default block size for new files, in bytes.
      You can use the following suffix (case insensitive):
      k(kilo), m(mega), g(giga), t(tera), p(peta), e(exa) to specify the size (such as 128k, 512m, 1g, etc.),
      Or provide complete size in bytes (such as 134217728 for 128 MB).
  </description>
</property>

<property>
  <name>dfs.namenode.fs-limits.min-block-size</name>
  <value>1048576</value>
  <description>Minimum block size in bytes, enforced by the Namenode at create
      time. This prevents the accidental creation of files with tiny block
      sizes (and thus many blocks), which can degrade
      performance.</description>
</property>

<property>
    <name>dfs.namenode.fs-limits.max-blocks-per-file</name>
    <value>1048576</value>
    <description>Maximum number of blocks per file, enforced by the Namenode on
        write. This prevents the creation of extremely large files which can
        degrade performance.</description>
</property>

块的存储位置:

#hdfs-default.xml中的位置,同时也是在hdfs-site.xml中的位置
<property>
  <name>dfs.datanode.data.dir</name>
  <value>file://${hadoop.tmp.dir}/dfs/data</value>
</property>

HDFS的优点:

1.高容错性(硬件故障是常态)
2.适合大数据
3.数据访问
4.构建成本低
5.多种软硬件平台中的可移植性
6.高效性
7.高可靠性

HDFS的缺点:

1.不适合做低延迟的数据访问
2.不适合小文件存取
3.不适合并发写入,文件随即修改

HDFS的体系结构:

HDFS采用的是master/slaves这种主从的结构模型来管理数据,这种结构模型主要是由四个部分组成,分别是:client,namenode,datanode,secondarynamenode

真正的hdfs集群包括一个namenode和若干数目的datanode

namenode:

namenode进程只有一个(HA除外)
管理hdfs的命名空间,并以fsimage和edit进行持久化保存
在内存中维护数据块的映射信息
实施副本冗余策略
处理客户端的访问请求

datanode:

存储真正的数据(块进行存储)
执行数据块的读写操作
心跳机制(3秒)

secondaryNamenode

帮助namenode合并fsimage和edits文件
不能实时同步,不能作为热备份节点

client

hdfs实际上提供了各种语言操作hdfs的接口
与namenode进行交互,获取文件的存储位置(读/写两种操作)
与datanode进行交互,写入数据或者读取数据
上传时分块进行存储,读取时分片进行读取

映像文件fsimage:

命名空间指的是文件系统树以及整棵树内的所有文件和目录的元数据,每个namenode只能管理唯一的命名空间hdfs不支持软连接和硬连接,namenode会在内存里维护文件系统的元数据,同时还使用fsimage和edit日志两个文件来辅助管理元数据,并持久化到本地磁盘上

faimage:
	命名空间镜像文件,它是文件系统元数据的一个完整永久检查点,内部维护的是最近一次检查点的文件系统树和整棵树内部的所有文件和目录的元数据,如修改时间,访问时间,副本数据,块大小,文件的块列表信息
	fsimage默认存储两份,是最近的两次检查点

日志文件edit

集群正常工作时,客户端的所有更新操作(如打开,关闭,创建,删除,重命名等)除了在内存中维护之外,还会被写入到edit日志文件中,而不是直接写入fsimage映像文件
原因:
	对于分布式文件系统而言,fsimage映像文件通常非常大,如果客户端所有的更新操作都直接往fsimage文件中添加,那么系统的性能一定越来越差,相对而言edit日志文件通常都要小于fsimage,一个edit日志文件最大64M,更新操作写入editlog是非常高效的
小知识:
	1.滚动编辑日志(前提是必须启动集群)
		1.1.可以强制滚动
			hdfs dfsadmin -rollEdits
		1.2可以等到edits.inprogress满64M生成edits文件
		1.3可以等到操作数量达到100万次
		1.4时间到了,默认是1小时
		注意:在2.3.4时发生滚动,会进行checkpoint
	2.镜像文件什么时候产生
		可以在namenode启动时加载镜像文件和编辑日志
		也可以在secondarynamenode生成的fsimage.checkpoint文件重新替换namenode原来的fsimage文件时	
[root@qianfeng01 current]# pwd
/usr/local/hadoop/tmp/dfs/name/current

[root@qianfeng01 current]# ll
总用量 8264
-rw-r--r--. 1 root root 1048576 628 23:15 edits_0000000000000000001-0000000000000000001
-rw-r--r--. 1 root root 1048576 628 23:23 edits_0000000000000000002-0000000000000000002
-rw-r--r--. 1 root root 1048576 629 09:56 edits_0000000000000000003-0000000000000000003
-rw-r--r--. 1 root root      42 629 16:14 edits_0000000000000000004-0000000000000000005
-rw-r--r--. 1 root root   32833 629 17:15 edits_0000000000000000006-0000000000000000283
-rw-r--r--. 1 root root 1048576 629 17:17 edits_0000000000000000284-0000000000000000364		---文件的后缀名表示在在17:15-17:17这两分钟内,执行的写操作次数为:364-284=80次
-rw-r--r--. 1 root root 1048576 629 20:49 edits_0000000000000000365-0000000000000000365
-rw-r--r--. 1 root root 1048576 629 20:51 edits_0000000000000000366-0000000000000000366
-rw-r--r--. 1 root root 1048576 629 20:55 edits_0000000000000000367-0000000000000000367
-rw-r--r--  1 root root      42 630 10:12 edits_0000000000000000368-0000000000000000369
-rw-r--r--  1 root root      42 630 11:12 edits_0000000000000000370-0000000000000000371		---默认的日志滚动时间是1小时,当namenode发生重启,强制滚动除外
-rw-r--r--  1 root root 1048576 630 11:12 edits_inprogress_0000000000000000372	----这个名称中带有inprogress的文件执行的是当前正在进行的操作,所以他的编号一定是最大的
-rw-r--r--  1 root root    3572 630 10:12 fsimage_0000000000000000369
-rw-r--r--  1 root root      62 630 10:12 fsimage_0000000000000000369.md5
-rw-r--r--  1 root root    3572 630 11:12 fsimage_0000000000000000371		----合并生成的fsimage文件默认只保存两个版本
-rw-r--r--  1 root root      62 630 11:12 fsimage_0000000000000000371.md5		----这是fsimage文件的md5校验文件
-rw-r--r--  1 root root       4 630 11:12 seen_txid		--->这里保存的是edits_inprogress文件的id号	
-rw-r--r--. 1 root root     205 630 10:10 VERSION		--->默认生成的版本号

安全模式:

简介:
	namenode启动时,首先要加载fsimage文件到内存中,并逐条执行editlog文件里的事务操作,此期间一旦在内存中成功建立文件系统元数据的映像,就会新创建一个fsimage文件和一个空的editlog文件,这个过程中namenode处于安全状态,客户端只能读数据
	系统中的数据块的位置并不是由namenode维护的,而是以块列表存储在datanode中,在安全模式下,各个datanode会向namenode发送最新的块列表信息,如果满足最小副本条件,就会退出安全模式开始运行

系统离开安全模式的条件:

1.可用的block占总数的比例达到99.9%

2.可用的数据节点数量符合要求后,离开安全模式

hdfs的工作机制:

开机启动namenode过程:

非第一次启动namenode:
第一步:
	namenode在启动时,会首先加载name目录下的fsimage文件
	将fsimage里保存的元数据加载到内存中,这样内存中就有了之前检查点里存有的元数据
第二步:
	加载剩下的edit日志文件
	将从最近一次检查点到目前为止所有的日志文件加载到内存中
第三步:
	进行检查点设置(满足条件会进行)
	namenode会终止之前正在使用的edit文件,创建一个新的edit空日志文件,然后将所有未合并过的edit日志文件,fsimage文件进行合并,产生一个新的fsimage
第四步:
	出于安全模式下,等datanode节点的心跳反馈,但收到99.9%的块至少一个副本后,退出安全模式,开始转换成正常状态

datanode和namenode通信:

1.hdfs是qianfeng01/slave结构,qianfeng01包括namenode,resourcemanager,slave包括datanode和nodemanger
2.qianfeng01启动时会开启个ipc服务,等待slave连接
3.slave启动之后,会主动连接ipc服务,并每个3秒连接一次,这个时间可以调整,设置heartbeat,这个每隔一段时间连接一次的机制,称为心跳机制,slave通过心跳给qianfeng01汇报信息,qianfeng01通过心跳下达命令
4.namenode通过心跳得知datanode的状态,resourcemanager通过心跳得知nodemanager状态
5.当qianfeng01长时间没有收到slave信息时,就认为slave挂掉了

注意:超长时间计算结果:默认是10分30秒

secondaryNamenode的工作机制(检查点机制)

secondarynamenode是hdfs中的重要组成部分,它可以辅助namenode进行fsimage和editlog的合并工作,减小editlog文件的大小,以便缩短下次namenode的重启时间,尽快退出安全模式

两个文件的合并周期称为检查点机制,可以通过hdfs-default.xml文件进行修改:

总结如下:

1.secondarynamenode请求namenode停止正在编辑的editlog文件,namenode会创建新的editlog文件(确保editlog不会太长),同时更新sedd_txid文件
2.secondarynamenode通过http协议获取namenode上的fsimage和editlog文件
3.secondarynamenode将fsimage读进内存中,并逐步分析editlog文件里的数据,进行合并操作,然后写入新文件fsimage_ckpt文件中
4.secondarynamenode将新文件fsimage_x.ckpt通过http协议发送回namenode
5.namenode进行更名操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值