HADOOP HDFS/MR计算框架 博客分类: Hadoop
程序员文章站
2024-03-22 22:31:10
...
1.Hadoop两大核心: HDFS/MapReduce HDFS(Hadoop Distributed File System) :是可扩展、容错、高性能的分布式文件系统,异步复制,一次写入多次读取,主要负责存储。 MapReduce :为分布式计算框架,包含map(映射)和 reduce(归约)过程,负责在 HDFS 上进行计算。 2.Hadoop 是一个能够让用户轻松架构和使用的分布式计算的平台。用户可以轻松地在 Hadoop发布和运行处理海量数据的应用程序。其优点主要有以下几个: (1) 高可靠性: Hadoop 按位存储和处理数据的能力值得人们信赖。 (2) 高扩展性: Hadoop 是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以干计的节点中。 (3) 高效性: Hadoop能够在节点之间动态地移动数据, 并保证各个节点的动态平衡,因此处理速度非常快。 (4) 高容错性: Hadoop能够自动保存数据的多个副本, 并且能够自动将失败的任务重新分发。 (5) 低成本: 与一体机、商用数据仓库以及 QlikView、 Yonghong Z- Suites 等数据集市相比,Hadoop 是开源的,项目的软件成本因此会大大降低。 (6) Hadoop 带有用Java语言编写的框架,因此运行在 linux 生产平台上是非常理想的, Hadoop 上的应用程序也可以使用其他语言编写,比如 C++。 3. NameNode 作用: 管理文件系统的命名空间 记录每个文件数据块在各个DataNode的位置和副本 协调客户端对文件的访问 记录命名空间内的改动或空间本身属性的改动 HDFS 2.x 解决了HDFS单点NameNode故障和内存受限问题, 支持多个NameNode, 所有NameNode共享所有DataNode存储资源. 4. DataNode 负责所在物理节点的存储管理 一次写入,多次读取 文件由数据块组成, 典型的块大小是64MB 5.YARN Hadoop 2.x 资源调度管理系统, 在Hadoop1.x中资源管理和作业管理均是由JobTracker实现的。 作业管理由ApplicationMaster实现,资源由新增系统YARN完成。 6.HDFS设计目标 存储非常大的文件 采用流失的数据访问方式 运行于商业硬件上 7.HDFS不适合的应用类型 低延时的数据访问 大量小文件 多方读写, 需要任意的文件修改 (HDFS采用追加(append-only)的方式写入数据。不支持文件任意offset的修改。不支持多个写入器(writer)。) 8.HDFS核心概念 8.1 Blocks 物理磁盘中有块的概念,磁盘的物理Block是磁盘操作最小的单元,读写操作均以Block为最小单元,一般为512 Byte。 文件系统在物理Block之上抽象了另一层概念, 文件系统Block物理磁盘Block的整数倍。通常为几KB。 HDFS的Block块比一般单机文件系统大得多, 默认为128M。HDFS的文件被拆分成block-sized的chunk, chunk作为独立单元存储。比Block小的文件不会占用整个Block,只会占据实际大小 8.2 HDFS的Block为什么这么大? 是为了最小化查找(seek)时间,控制定位文件与传输文件所用的时间比例 8.3 Block抽象的好处 block的拆分使得单个文件大小可以大于整个磁盘的容量,构成文件的Block可以分布在整个集群 Block的抽象也简化了存储系统,对于Block,无需关注其权限,所有者等内容(这些内容都在文件级别上进行控制)。 Block作为容错和高可用机制中的副本单元,即以Block为单位进行复制。 9.HDFS Federation HDFS Federation提供了一种横向扩展NameNode的方式。在Federation模式中, 每个NameNode管理命名空间的一部分, 例如一个NameNode管理/user目录下的文件, 另一个NameNode管理/share目录下的文件 10.HDFS 命令行接口 HDFS提供了各种交互方式,例如通过Java API、HTTP、shell命令行的。命令行的交互主要通过hadoop fs来操作。例如: hadoop fs -copyFromLocal // 从本地复制文件到HDFS hadoop fs mkdir // 创建目录 hadoop fs -ls // 列出文件列表 Hadoop中,文件和目录的权限类似于POSIX模型,包括读、写、执行3种权限: 读权限(r):用于读取文件或者列出目录中的内容 写权限(w):对于文件,就是文件的写权限。目录的写权限指在该目录下创建或者删除文件(目录)的权限。 执行权限(x):文件没有所谓的执行权限,被忽略。对于目录,执行权限用于访问器目录下的内容。 每个文件或目录都有owner,group,mode三个属性,owner指文件的所有者,group为权限组。 mode由所有者权限、文件所属的组中组员的权限、非所有者非组员的权限组成。 hadoop fs -ls // 列出文件列表 drwxr-xr-x 2 root supergroup 1410 2016-07-14 21:09 hdfs-site.xml 返回结果类似于Unix系统下的ls命令, 第一栏为文件的mode, d表示目录, 紧接着三种权限9位。第二栏是指文件的副本数, 这个数量是通过dfs.replication配置, 目录使用-则表示没有副本一说。其他诸如所有者、组、更新时间、文件大小跟Unix系统中ls命令一致。 说明, 文件权限是否开启通过dfs.permissions.enabled属性来控制,这个属性默认为false,没有打开安全限制, 因此不会对客户端做授权校验,如果开启安全限制,会对操作文件的用户做权限校验 11.HDFS 文件系统 Local: 本地文件系统的抽象 HDFS: Hadoop的分布式文件系统, 被设计用来高效的MapReduce处理 WebHDFS/swebhdfs: 通过HTTP协议认证读/写访问HDFS har: 压缩文件, 当文件多时压缩成一个大文件, 有效减少元数据的数量. FTP: FTP协议实现, 对文件的操作转化为ftp协议. Viewfs: 客户端使用mount table将文件路径映射到NameNode, 用来在客户端屏蔽多个NameNode的底层细节. 12.剖析文件写入 客户端通过DistributedFileSystem对象调用create()新建文件,DistributedFileSystem对namenode创建一个RPC调用, namenode执行各种检查包括文件是否已存在及是否由权限。 客户的写入数据时,DFSOutputStream将数据分成一个个数据包,并写入内部队列,DataStreamer处理数据队列, 它的责任是挑选适合存储数据副本的一组datenode,并要求namenode分配新的数据块。 这一组datanode构成一个管线,假设有三个节点,DataStreamer将数据包流式传输到管线中的第一个datanode, 第一个datanode存储并将它发送到第二个datanode,第二个datanode存储并将它发送给第三个datanode。 同时DFSOutputStream维护一个内部数据包队列等待datanode的收到确认回执,收到所有datanode确认信息后, 该数据包才会从确认队列中删除。 剖析文件读取 DistributedFileSystem通过远程调用RPC来调用namenod,以确定文件起始快位置,对于每一个块,namenode返回存有该块副本 的datanode地址,这些datanode根据它们与客户端的距离来排序,如果客户端本身就是一个datanode,该客户端将会从保存 有相应数据块副本的本地datanode读取数据。 DistributedFileSystem对象返回一个FSDataInputStream对象(支持文件定位的输入流)给客户端以便读取数据, FSDataInputStream类封装DFSInputStream对象,该对象管理datanode和namenode的I/O。 客户端对这个输入流调用read()方法,存储着文件起始几个数据块的datanode地址的DFSInputStream随机连接距离 最近的文件第一个块所在datanode。 通过对数据流反复调用read方法,可以将数据从datanode传输到客户端,到达块末端时,DFSInputStream关闭与该datanode 的连接,然后寻找下一个块的最佳datanode。 MAP-REDUCE 1. 分片: Hadoop将MapReduce的输入数据划分等长的小数据块, 成为输入分片(input split)。Hadoop为每个分片构建一个Map任务, 并由该任务来运行用户自定义的Map函数处理分片中的每条数据。 一般情况下,一个合理的分片大小趋向于HDFS的一个块大小,默认是128MB,不过可以针对集群调整这个默认值, 或在每个文件创建时指定。如果分片跨越两个数据块,那么对于任何一个HDFS节点,基本上都不可能同时存储这两个数据块, 因此分片中的数据要通过网络传输到Map任务运行节点。 InputSplit是一个Java类,它会计算出块中第一个完整记录的开始位置和最后一个记录的结束位置。在最后一个记录不完整的情况下, InputSplit 包括下一个块的位置信息和完成该记录所需的数据的字节偏移。 2. 数据本地化优化: Hadoop在存储有输入数据的节点上运行Map任务,可以获得最佳性能,因为它无需使用宝贵的集群带宽资源。这就是所谓的 "数据本地化优化"。但有时候对于一个Map任务的输入分片来说,存储该分片的HDFS数据复本的所有节点可能正在运行 其他Map任务,此时作业调度需要从某一数据块所在机架中的一个节点寻找一个空闲的Map槽(slot)来运行该map任务分片。 非常偶然情况下,会使用其他机架中的节点运行该Map任务,这将导致机架与机架之间的网络传输。 3. MAP任务: 输入KEY参数为每行所在文件的偏移量,输入VALUE参数为每个内容。此步骤主要是做数据的预处理,挑选出需要处理的数据。 输出Key/Value。 Map任务将输出写入本地硬盘,而非HDFS,因为Map的输出是中间结果,该中间结果由reduce任务处理后才产生最终输出结果, 一旦作业完成,map输出结果就可以删除。 4. COMBINER: 减少MAP节点到REDUCER节点的传输数据量,而在MAP之后进行的分片内的数据计算处理 5. REDUCER: 输入参数为MAP的输出参数,对数据进行加工处理。 Reduce任务不具备数据本地化优势,单个reduce任务输入通常来自于所有mapper输出,排过序的map输出需要通过网络传输 发送到运行reduce任务的节点,数据在reduce端合并,然后由用户自定义reduce函数处理。 对于reduce输出的每个HDFS快,第一个副本存储在本地节点,其他副本出于可靠性考虑存储在其他机架的节点中。 因此,将reduce的输出写入HDFS确实需要占用网络带宽,这与正常的HDFS管线写入的消耗一样。 6.partition分区 reduce任务的数据量并非由输入数据的大小决定的,相反是独立指定的。 若有多个reduce任务,每个Map任务就会针对输出进行分区(partition),即为每个reduce任务建一个分区,每个分区 有许多key及value值,但每个key对应的key-value对记录都在同一分区中。 分区可由用户自定义class类控制,通常用默认的哈希函数(key)来分区,很高效。 7.shuffle过程 MapReduce确保每个reducer的输入都是按key排序的,系统执行排序、将map输出作为输入传给reducer的过程 成为shuffle。分为Map端和Reduce端 Map端: Map输出时,并不是简单将它写到磁盘,它利用缓冲方式写到内存并基于效率的考虑进行与排序, 一旦缓冲区(默认100MB,mapreduce.task.io.sort.mb)达到阀值(默认80%,mapreduce.map.sort.spill.percent),一个 后台线程开始把内容溢出到磁盘,溢出写过程按轮询方式将缓冲区内容写到mapreduce.cluster.local.dir属性指定目录。 在写磁盘前,线程首先根据最终要传的reducer把数据划分相应的分区(partition)。在每个分区中,后台线程在内存中 排序,如果有一个combiner函数,它就在排序后的输出上运行。 reduce端: reduce任务需要集群上若干个map任务的map输出作为分区文件,每个map任务完成时间不同,因此在每个任务完成时, reduce任务就开始复制其输出。随着磁盘上副本增多,后台线程会将它们合并成更大的,排好序的文件。 复制完所有map输出后,reduce任务将合并map输出,维持其排序顺序。 此阶段的输出直接写入HDFS文件系统。
推荐阅读
-
HADOOP HDFS/MR计算框架 博客分类: Hadoop
-
HDFS文件系统操作文件或文件夹 博客分类: hadoop HDFS
-
社会化海量数据采集爬虫框架搭建 博客分类: java架构hadoop 反监控海量数据抓取爬虫采集
-
JAVA线程池管理及分布式HADOOP调度框架搭建 博客分类: java架构hadoopjeetask 分布式线程池java架构hadoop
-
Hadoop学习总结之二:HDFS读写过程解析 博客分类: Hadoop学习总结 HadoopSocket数据结构IElucene
-
Hadoop学习总结之二:HDFS读写过程解析 博客分类: Hadoop学习总结 HadoopSocket数据结构IElucene
-
大数据框架hadoop的文件系统(HDFS)命令大全 博客分类: 开源项目专题hadoop 大数据hadoop文件系统(HDFS)命令大全
-
The Design of HDFS 博客分类: hadoop hadoophdfsdesign
-
ZooKeeper的配置 博客分类: ZooKeeper云计算 ZooKeeper云计算集群伪分布式Hadoop
-
ZooKeeper的运行 博客分类: ZooKeeperHadoop云计算 ZooKeeper云计算Hadoop集群伪分布式