注:本文是我学习Hadoop权威指南的时候一些关键点的记录,并不是全面的知识点
Hadoop 避免数据丢失的方法:副本 冗余硬盘队列
数据结合问题:结合不同来源的数据进行分析
MapReduce 自身具有很高的稳定性,对外部只提供Map 和Reduce接口
Hadoop 为我们提供了一个可靠地共享和分析系统
Hadoop 实现了数据的存贮, MapReduce 实现数据的分析与处理。
Hadoop 虽然还有其他的功能,但是HDFS 和 MapReduce 是他的核心价值
Hadoop 相对于其他的系统的优势
每个查询需要处理整个数据集或至少一个数据集的绝大部分,但是反过来这个也是他的能力。
关系型数据库管理系统/为什么要 MapReduce
计算机硬件发展趋势:寻址时间的提升远远不敌传输速率的提升,寻址是将磁头移动到特定的硬盘位置进行读写操作的过程,它是导致硬盘操作延迟的主要原因。而传输速率取决于硬盘的带宽。
如果数据访问模式中包含大量的硬盘寻址,那么读取大量的数据集必然会花更长的时间(相对于流数据读取模式,流数据读取主要取决于传输速率)。
另外一方面,如果数据库系统只更新一小部分系统,那么传统的B树就更有优势。但是如果有大量的数据更新时,B树的小路就明显落后与 MapReduce ,因为需要使用排序/合并来重建数据库
一般情况下, MapReduce 可以视为关系型数据库管理系统的补充
MapReduce 适合以批处理的方式处理需要分析的整个数据集的问题、尤其是动态分析
RDBMS适用于点查询和更新,数据集被索引之后,数据库能够提供低延时的数据检索和快速的少量数据更新
MapReduce 适合一次写入、多次读取数据的应用。
RDBMS更加合适持续更新的数据集
数据大小 GB PB
数据存取 交互式和批处理 批处理
更新 多次读写 一次写入多次读写
结构 静态模式 动态模式
完整性 高 低
横向扩展 非线性的 线性的
结构化数据 半结构化数据 非结构化数据 Mapredece对于半结构化数据 非结构化数据 非常有效,因为他是在数据处理的时候才对数据进行解释的,数据的键和值不是数据固有的属性,而是由分析人员来选定的
关系型数据往往是规范的 以保持数据的完整性切不含冗余
MapReduce 是一种现象的可伸缩的编程模型,开发人员需要编写两个函数 分别是map和reduce函数,每个函数定义一个从键值对到另一个键值对集合的映射。
这些函数不需要关注数据集及其所用的集群的大小,可以原封不动的应用于小规模数据集或大规模的数据集。更重要的是,如果输入的数据量是原来的两倍,则运行的时间也是需要两倍。
但是如果集群是原来的两倍,作业的运行速度却仍与原来一样快。Sql查询一般不具备该特性。
--------------------------------1.3.2
MapReduce 通过显示网络拓扑结构来保留网络带宽、
MapReduce 采取的是无共享框架 实现失败检测
MapReduce 设计的三大目标:
为只需要短短几分钟或者几个小时就可以完成的作业提供服务
运行于同一个内部由高速网络连接的数据中心内
数据中心内的计算机都是可靠地、定制的硬件
---------------------------------1.5
Hadoop项目
Commom:一些列组件和接口,用于分布式文件系统和通用I/O 序列化 RPC 持久化数据等等
Avro:一种序列化系统,用于高效、跨语言的RPC和持久化数据存储。
Mapreduce:分布式数据处理模型和执行环境、运行于大型商用机集群
HDFS:分布式文件系统,运行于大型商用机集群
Pig:数据流语言和运行环境,用于探究非常庞大的数据集
Hive:一种分布式的、按列存储的数据仓库。Hive管理HDFS中存储的数据,并提供基于Sql的查询语句(由运行时翻译成MapReduce作业)用以查询数据
Hbase:一种分布式的、按列存储的数据库。Hbase使用Hdfs作为底层存储,同时支持MNapReduce的批量试计算和点查询(随机读取)
ZooKeeper:一种分布式的、高可用的协调服务,ZooKeeper提供分布式锁之类的基本服务用于构建分布式应用。
Sqoop:该工具用于在结构化数据存储(如关系型数据库)和HDFS之间高效批量传递数据
Oozie:该服务用于运行和调度Hadoop作业。
----------------2.4.1
数据流
术语:
Job :客户端需要执行的一个数据单元:包括输入数据、MapReduce程序和配置信息。
Hadoop将作业分成若干个小任务Task来执行,其中包括两类任务 map 、reduce。
两类节点控制作业执行的过程:一个Jobtracker及一系列的tasktracker。jobtracker通过调度tasktracker上运行的任务来协调所有运行在系统上的作业。
tasktrac在运行任务的同时将运行进度报告发送给jobstracker,jobstracker由此此记录每个做个任务的整体进度情况,如果某个任务失败,
jobstracker可以在另一个tasktracker节点上重新调度该任务。
Hadoop将Mapre输入的数据划分成等长的小数据块,成为输入分片或者分片,Hadoop为每个分片构建一个map任务,并由该任务来运行用户自定义的map函数,从而处理该分片中的每条记录。
---------3.1
HDFS设计
超大文件:
流式数据访问:
商用硬件:
不适用场景
低时间延迟的数据访问
大量的小文件
多用户写入、任意修改文件
-----3.2
数据块
hadoop fsck / -file -blocks 列出文件系统中各个文件是由哪些块构成
---------------------3.2.2
datanode 和 namenode
管理者工作者模式运行:一个namenode 和多个DataNode
namenode管理文件系统的命名空间,它维护着文件系统树及整棵树内所有的文件和目录,
这些信息以两个文件形式永久的保存在本地的磁盘上:命名空间镜像文件和编辑日志文件;
它还记录着每个文件中各个块所在的数据节点信息,但是并不永久的保存快的位置信息,
因为这些信息会在系统重新启动的时候有数据节点重建。
客户端client
代表用户通过与namenode和DataNode交互来访问整个文件系统
DataNode是文件系统的工作节点,它们根据需要存储并检索数据块(受客户端或者namenode调度),并且定期向namenode发送他们所存储的块的列表
没有namenode,文件系统将无法使用,如果运行namenode服务的机器坏掉,文件系统上的所有文件将会丢失,因为我们不知道如何根据datanode的块重建文件。
所以需要对namenode实现容错非常重要。
1、备份那些组成文件系统元数据持久状态的文件,可以通过配置namenode在多个文件系统上保存元数据的持久状态,这些写操作是实时同步的,是原子操作。
一般配置是,将持久状态写入本地磁盘的同时,写入一个远程挂在的文件系统NFS。
2、Seconderaynamenode:不能作为namenode,通过定期编辑日志文件合并命名空间静香,以防止编辑日志过大。
----------------------------3.2.3
邦联HDFS
namenode在内存中保存每个文件和每个数据块的引用关系,对于拥有大量文件的超大集群来说,内存将成为限制系统横向扩展的瓶颈。
2.x后引入了联邦HDFS,其中每个namenode管理文件系统命名空间中的一部分。
联邦环境下,每个namenode维护着一个命名空间卷,包括命名空间的源数据和在该命名空间下的文件的所有数据块的数据池。
命名空间卷支架你是相互独立的,两两之间并不互相通信,甚至其中一个namenode失效也不会影响其他的namenode维护的命名空间的可用性。
整个数据块池不再进行切分,所以集群中的datanode需要注册到每个namenode,并且存储着来自多个数据块池的数据块。
访问联邦HDFS集群,客户端需要使用客户端挂载数据表将文件路径银蛇到namenode,ViewFileSystem 、viewfs进行配置管理。
------------------------3.2.4
HDFS的高可用性
新的namenode相应服务条件:
1、将命名空间的映像导入内存中
2、重做编辑日志
3、收到足够多的来自DataNode的数据块报告并且推出安全模式
对于一个大型并且拥有大量文件和数据块的集群,namenode的冷却启动需要30分钟,甚至更长时间。
HA:高可用
namenode之间需要通过高可用的共享存储实现编辑日志的共享,当备用namenode接管工作后,它将通过读取共享编辑日志直至末尾,
以实现与活动namenode的状态步,并继续读取有活动namenode写入的新条目。
DataNode西药同时向两个namenode发送数据块处理报告,因为数据块的映射信息存储在namenode的内存中,而不是磁盘。
客户端需要使用特定的机制来处理namenode失效的问题。
在活动namenode失效后,备用的namenode能够快速的实现任务的接管,因为最新的状态存储在内存中,包括最新的编辑日志条目和最新的数据块映射信息。
实际时间可能会略长,因为系统需要保守确定活动namenode是否真的失效了
当活动namenode和备用namenode都失效的时候,管理员依旧可以申明一个备用namenode实现冷启动。
故障切换和规避:
namenode 轻量级故障转移控制器 监控namenode状态 心跳机制
规避:杀死namenode进程,收回共享存储目录的访问权限,通过远程命令屏蔽相应的网络端口
------------------3.3
命令行接口
hadoop fs -copyFromLocal input/..... hdfs://localhost/...
hadoop fs -mkdir books
hadoop fs -ls
hadoop fs -ls file:///
文件模式 备份数量 所有者 组别 问价你大小 修改日期 修改时间 绝对路径
super-user
--------------------------3.4
Hadoop文件系统
接口:
HTTP
1、直接访问,hdfs后台进程直接服务于来自客户端的请求;由namenode内嵌的web服务器50070提供目录服务,
目录列表以及XML或者JSON格式存储,并且文件数据由DataNode的web服务器50075以数据流的形式传输。
2、通过代理(一个对多个)访问,客户端通常使用DFS API来访问HDFS
用户空间文件系统:Fuse-DFS
Java接口
从Hadoop Url读取数据
Url.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory())
IOUtils.copyBytes(in,System.out,4096,false):page:91
------------------------3.5.2page:92
通过FileSystem API 读取数据
public static FileSystem get(Configuration conf )
public static FileSystem get(URI uro,Configuration conf )
public static FileSystem get(URI uro,Configuration conf,String user )
Configuration 对象封装了客户端或者服务器的配置,通过配置读取类路径来实现。
第一个方法返回的是模仁文件系统,在/conf/core-site.xml指定的 如果没有指定,则是同默认的本地文件系统
第二个方法通过给定的URI方案和权限来确定需要使用的文件系统,如果给定的URI中没有指定方案,则返回默认的文件系统;
第三个方案作为给定用户来访问系统文件,对安全来说至关重要
FSDataInputStream 对象不是标准的java.io类
随机读取数据 Seekable接口 seek() getPos()
----------------------3.5.3写入数据
1、public FSdataOutoutStream create(Path f)//此方法重载众多方法,可以指定各种参数
虽然可以在不存在父目录的情况下建立父目录但是也可以先通过exists()方法判断父目录是否存在
2、在一有文件末尾追加数据
public FSdataOutoutStream append(Path f)
--------------------------------3.5.4
FileSystem创建目录
public boolean mkdir(Path f)
一般不用这样创建,在调用creat的时候就会创建父目录
-----------------------3.5.5
查询文件系统
1、文件元数据:FileStatus
2、列出文件:listStatus()
public FileStatus[] listS tatus(Path f)
3、文件模式,通配符
public FileStatus[] globStatus(Path pathPattern)
public FileStatus[] globStatus(Path pathPattern,Pathfilter filter)
String str = "/2017/12/31";
String str2 = "^.*/2017/12/31$";
boolean matches = str.matches(str2);
System.out.println(matches);
true
---------------------------3.5.6
删除数据:
public boolean delete(Path f,boolean recursive)
-------------------------3.6-----
数据流
-----------------3.6.1
文件读取
1、客户端调用FileSystem对象的open()方法打开希望读取的文件(HDFS来说就是分布式文件系统)
2、DFS通过使用RPC来调用namenode,确定文件的起始块,
对于每一个块namenode会返回有该副本的datanode地址
(datanode根据它们与客户端的距离来排序,集群网络拓扑),此时还会有数据本地性原则。
3、DFS返回一个 FSDataInputStream 给客户端并读取数据,
FSDataInputStream转而封装 DFSDataInputStream对象,该对象管理者datanode和namenode的I/O。
4、客户端岁这个输入流调用read()方法,记录块对应 DataNode 信息的 DFSDataInputStream 开始连接距离最近的datanode
用过对数据流反复调用read()方法,可以将数据从datanode传递到客户端。
5、当读取到快的末端时,DFSDataInputStream 关闭与该块的所在DataNode的链接,然后寻找下一块最佳的datanode。
6、客户端只需要读取连续的流。块石按照打开DFSDataInputStream 与DataNode新建链接的顺序读取的,他也会根据需要
询问namenode来检索下一批数据块的datanode位置。
7、客户端完成读取,就对 DFSDataInputStream 调用close()方法
这个过程会有数据检验 还有记录故障DataNode
----------------------------3.6.2
文件写入
1、客户端调用FileSystem对象的create()新建文件
2、FileSystem对namenode创建一个RPC调用,在文件系统的命名空间中新建一个文件,
此时文件中还没有相应的数据块。namenode执行检查算法判断文件是否存在以及用户是否有建立文件的权限。
如果有namenode就会为创建新文件记录一条记录,否则文件创建失败并且向客户端返回一个IO异常
3、DFS会向客户端返回一个FSDataOutputStream对象,此时客户端可以开始写入数据,
FSDataOutputStream会封装一个DFSDataOutputStream 负责处理namenode和Datanode之间的通信。
4、客户端向FSDataOutputStream写入数据是,会把数据分成一个个数据包,形成一个数据队列。
DataStreamer处理数据队列、他会根据DataNode表的信息向namenode要求分配合适的新块来存储数据副本。
这一组DataNode会构成一个管线,根据我们副本个数,管线会有相应的节点。
DtatStreamer将数据包以流式传输到管线的第一个datanode,该DataNode会将数据包储存并发给笑一个datanode。。。。。
5、FSDataOutputStream还维护这一个内部数据包队列来等待DataNode的收到确认回执,确认队列
收到管线中所有DataNode确认消息后,数据包才会从确认队列中删除
。
6、客户端完成数据写入后、用close()关闭数据流
DataNode在写入数据期间发生故障
1、关闭管线,把队列的所有数据库包收回到数据队列最前端。
2、为存储在另一个正常datanode的当前数据块制定一个新的标志,将该标志传递给namenode。
2、3、管线删除数据故障节点,把余下的数据块写入管线的另外两个正常的datanode中。dsa
--------------3.6.3
一致性模型:描述了文件读写的可见性
FSDataOutputStream.sync() 是所有缓存与数据节点强行同步
FSDataOutputStream.hflush()
FSDataOutputStream.hflush()
----------------------------3.7
通过Flume和Sqoop导入数据
Flume:一个将大规模数局导入HDFS的工具
Sqoop:将数据从结构化存储设备批量导入HDFS设计的
--------------------------------------------------------------3.8
通过distcp并行复制,源路径必须是绝对路径。
hadoop distcp hdfs://namenode1/foo hadoop://namenode/bar
默认distcp回跳过目标路径下已经存在的文件,可以通过overwrite选项覆盖现有的文件。
也可以通过-update来选择有改动的文件
hadoop distcp -update hdfs://namenode1/foo hdfs://namenode2/bar/foo
不同版本的HDFS
hadoop distcp hftp://namenode1:50070 hdfs://namenode2/bar
hadoop distcp webhdfs://namenode1:50070/foo webhdfs://namenode2:50070/bar
-----------------------------------3.9
Hadoop存档
hadoop fs -lsr /my/file
hadoop archive -archiveName files.har /my/files /my
hadoop fs -lsr har:///my/files.har
在其他文件系统中引用HAR文件
hadoop fs -lsr har:///my/files.har/my/files/dir
hadoop fs -lsr har://hdfs-localhost/file.har/my/files/dir
---------------------------------------------Hadoop的I/O操作
数据完整性
校验和
客户端写数据的时候回发送数据和检验和,管线最后一个DataNode负责校验,如果有错返回校验异常
datanode保存了数据块最后一次验证的时间,保存这些统计信息对于检测损坏的磁盘很有价值。
setVerifyChecksum(false);关闭校验和
命令解释器中 -get 、-ignoreCrc
-----------------------------------------------------------4.1.2
LocalFileSystem
RawLocalFileSystem禁用校验和
FileSystem fs = new RawLocalFileSystem
---------------------------------------------------4.1.3
FileSystem fs = new ChecksumFileSystem(new FileSystem())
getChecksumFile()
ChecksumFileSystem读取检测到错误的时候,调用自己的reportChecksumFileSystem()空方法
LocalFileSystem会将这个出错的文件及其检验和移动到存储设备上一个名为bad_files的边际文件夹中
-----------------------------------------------------4.2
压缩
文件压缩的好处:
1、节省空间
2、加快数据在网络和磁盘上的传输
压缩工具9个不用选项控制压缩时候考虑的权衡
-1 优化压缩速递 -9优化压缩空间
gzip -1 file 最快压缩方法建立file.gz文件
gzip 性能居中
bzip2压缩能力强于gzip 但是速度慢
------------------------------codec
CompressionCode 对数据流进行压缩和解压缩
CompressionCodeFactory 推断CompressionCodec
原生类库
CodePool
压缩格式:
容器文件格式:顺序文件 RCFile Avro
支持切分的压缩格式:bzip2 、
应用中将文件分块
大文件 不要使用不支持切分整个文件的压缩格式
----------------------------4.2.3
在MapReduce中使用压缩
---------------------------------------------4.3
序列化
将结构话对象转化成字节流以便在网络上传输还或者写到磁盘进行永久存储过程
反序列化 将字节流转回结构化对象的过程
序列化在分布式数据处理的两大领域出现:进程间通信和永久存储
Hadoop系统中多个节点省的进程之间的通信是通过 远程过程调用 RPC
RPC序列化格式:
1、紧凑:充分利用网络带宽
2、快速:进程间通信形成了分布式系统的骨架,要尽可能的减少序列化、反序列化的性能开销
3、可扩展性:满足新的需求
4、支持互操作,不同语言实现的客户端与服务器交互
------------------------------------------------4.3.1
Writable
WritableComparable 和comparator
Text
索引 UTF-8
find()
Writable集合类
-------------------------4.3.3
实现定制的Writebale集合
-------------------------------------4.3
序列化框架
Writable
Java的序列化
序列化IDL
Apache Thrift
Google Protocol Buffers
Apache Avro
------------------------------4.4.1
Avro数据类型和模式
java 映射
-----------------------------4.4.2
内存中的序列化和反序列化
-----------------------------4.43
Avro数据文件
元数据 数据块
-----------------------------4.5
基于文件的数据结构
SequenceFile
通过命令行接口显示 SequenceFile
SequenceFile的排序和合并
SequenceFile的格式
--------------------------------4.5.2
MapFile的读写
data index
io.mao.indec.skip
MapFile的变种
SetFile
ArrayFile
BloomMapFile
将SequenceFile 转换成MapFile
------------------------------------------5 MapReduce应用开发
-----------------5.1配置API
Configuration cof = new Configuration();
conf.addResource("")
-------------------------------5.1.1资源合并
后添加覆盖先前的
但是有final的不会被覆盖
守护进程站点中的属性一般标记为final
-----------------------5.1.2 可变的扩展
系统属性的优先级高于济源文件中定义的属性
注意,虽然配置属性可以通过系统属性来定义,但是除非系统属性使用配置属性重新定义,否则他们是无法通过配置API进行访问的
------------------------------------5.2.1 配置管理
hadoop fs -conf conf/hadoop-localhost.xml -ls .
----------------------------5.2.2
辅助类GenericOptionParser,Tool和ToolRunner
-------------------------------5.3 用MRUnit来写单元测试
-------------------------------------5.4 本地运行测试数据
----------------------------------5.5 在集群上运行
hadoop job -history
hadoop fs -getmerge max-temp max-temp-local
sort max-temp-local | tail
hadoop fs -cat max-temp/*
-------------5,5,7 远程调试
---------------------------5.6 作业调优
1、HPROF 分析工具
---------------------------------5.7 Mapreduce 的工作流
Ozzie工作流
-------------------------------6 Mapreduce 的工作机制
-------------6.1.1 经典的 Mapredece Mapredece1
客户端:提交作业
jobtracker:协调作业的运行,事宜个Java应用程序,他的主类是TaskTracker
tasktracher:运行作业规划后的任务,tasktracker是java应用程序,他的主类是TaskTracker
分布式文件系统:用来在其他实体之间共享作业
------------------------------10,1,2
进入和离开安全模式
查看:hadoop dfsadmin -safemode get
hadoop dfsadmin safemode wait
hadoop dfsadmin -safemode enter
hadoop dfsadmin -safemode leave
fsck 工具
hadoop fsck /
start-balancer.sh