• 1. Hadoop---------------分布式开发框架
  • 2. 目录
  • 3. 数据纽约证券交易所每天产生1TB的交易数据 社交网站facebook的主机存储着约10亿张照片,占据PB级存储空间 互联网档案馆存储着约2PB数据,并以每月至少20TB的速度增长。 瑞士日内瓦附近的大型强子对撞机每年产生约15PB的数据。 这样的数据该怎么存储和读取?
  • 4. 传统关系型数据库(oracle)的成本 Facebook的服务器大概1万台,按照oracle的标准10g版本计算大约需要21亿元
  • 5. Hadoop简介Hadoop 一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储 。 Hadoop是项目的总称,主要是由分布式存储(HDFS)、分布式计算(MapReduce)组成 。 Hadoop程序目前只能运行在Linux系统上,window上运行需要安装其他插件,安装过程见《hadoop安装说明.docx》 。
  • 6. Hadoop优点可扩展:不论是存储的可扩展还是计算的可扩展都是Hadoop的设计根本。 经济:框架可以运行在任何普通的PC上。 可靠:分布式文件系统的备份恢复机制以及MapReduce的任务监控保证了分布式处理的可靠性。(元数据磁盘错误,心跳测试,副本数,快照(目前还没实现)) 高效:分布式文件系统的高效数据交互实现以及MapReduce结合Local Data处理的模式,为高效处理海量的信息作了基础准备。
  • 7. Hadoop基本架构
  • 8. Hadoop基本架构在Hadoop的系统中,会有一台Master,主要负责NameNode的工作以及JobTracker的工作。JobTracker的主要职责就是启动、跟踪和调度各个Slave的任务执行。还会有多台Slave,每一台Slave通常具有DataNode的功能并负责TaskTracker的工作。TaskTracker根据应用要求来结合本地数据执行Map任务以及Reduce任务。名称节点( NameNode):管理文件系统的命名空间,记录文件系统树及这个树内所有的文件和索引目录,同时也记录每个文件的每个块,所在的数据节点。 数据节点( DataNode ):文件系统的工作者,存储并提供定位块的服务,并定时向名称节点发送块的存储列表 JobTracker:协调作业的运行。 TaskTracker:运行作业划分后的任务。
  • 9. HDFS
  • 10. HDFS适应条件超大文件 指的是几百MB,几百GB,几百TB,甚至几百PB 流式数据访问 HDFS建立的思想是:一次写入、多次读取模式是最高 效的。 商用硬件 hadoop不需要运行在昂贵并且高可靠的硬件上。HDFS:为以流式数据访问模式存储超大文件而设计的文件系统。
  • 11. HDFS不适应条件低延迟数据访问 HDFS是为了达到高数据吞吐量而优化的,这是以延迟为代价的,对于低延迟访问,可以用Hbase(hadoop的子项目)。 大量的小文件 多用户写入,任意修改
  • 12. HDFS的基本单元储存基本单元 Block(块):HDFS基本储存单元,是个逻辑单元,和os中的页类似。 一个文件有可能包含多个块,一个块有可以包含多个文件,由文件的大小和块大小的参数决定。 dfs.block.size参数。Hdfs中Block的大小,默认64MB, 如果设置大,就会有可能导致Map运行慢,设置小,有可能导致Map个数多,所有一定要设置适当。(目前主流机器建议设置为128M)
  • 13. Hdfs集群框架图
  • 14. Hdfs集群框架图文件写入: Client向NameNode发起文件写入的请求。 NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。 Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。 文件读取: Client向NameNode发起文件读取的请求。 NameNode返回文件存储的DataNode的信息。 Client读取文件信息。
  • 15. Hdfs集群框架NameNode记录着每个文件的元数据。每个文件在那个块中,每个数据节点包含哪些块。(不储存原始文件) DataNode是文件的工作者,它们存储文件并提供定位块的服务,并且定时向名称节点发送它们的存储块的列表。 (储存原始文件) 3. 重要参数 dfs.replication.min参数。最小为1,表示每个块在HDFS中的副本个数。
  • 16. Hdfs文件读取图
  • 17. Hdfs文件写入图
  • 18. HDFS的几个设计特点Block的放置:默认不配置。一个Block会有三份备份,一份放在NameNode指定的DataNode,另一份放在与指定DataNode非同一Rack上的DataNode,最后一份放在与指定DataNode同一Rack上的DataNode上。备份无非就是为了数据安全,考虑同一Rack的失败情况以及不同Rack之间数据拷贝性能问题就采用这种配置方式。 心跳检测DataNode的健康状况,如果发现问题就采取数据备份的方式来保证数据的安全性。 数据复制(场景为DataNode失败、需要平衡DataNode的存储利用率和需要平衡DataNode数据交互压力等情况):这里先说一下,使用HDFS的balancer命令,可以配置一个Threshold来平衡每一个DataNode磁盘利用率。例如设置了Threshold为10%,那么执行balancer命令的时候,首先统计所有DataNode的磁盘利用率的均值,然后判断如果某一个DataNode的磁盘利用率超过这个均值Threshold以上,那么将会把这个DataNode的block转移到磁盘利用率低的DataNode,这对于新节点的加入来说十分有用。
  • 19. HDFS的几个设计特点数据交验:采用CRC32作数据交验。在文件Block写入的时候除了写入数据还会写入交验信息,在读取的时候需要交验后再读入。 NameNode是单点:如果失败的话,任务处理信息将会纪录在本地文件系统和远端的文件系统中。 数据管道性的写入:当客户端要写入文件到DataNode上,首先客户端读取一个Block然后写到第一个DataNode上,然后由第一个DataNode传递到备份的DataNode上,一直到所有需要写入这个Block的NataNode都成功写入,客户端才会继续开始写下一个Block。
  • 20. HDFS的几个设计特点安全模式:在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
  • 21. I/O操作
  • 22. I/O操作Writable接口 序列化:指的是将结构化对象转换为字节流以便网络进行传输 或者写入存储的过程。 反序列化:指的是将字节流转为一系列结构化对象的过程。 (java定义的序列化和反序列化工具不够紧凑,高效) 在hadoop中,常规JAVA数据类型是不能表示Hdfs的数据类型的, 例如hdfs中的字符串不是string类表示,而是Text类,这些 数据类型都必须实现一个writable接口 。 Writable是Hadoop的核心(MapReduce程序使用他来序列化 键/值对): void write(DataOutput out) throws IOException; void readFields(DataInput in) throws IOException; 分别实现对数据的序列化和反序列化。
  • 23. Writable接口的子类
  • 24. Writable接口的子类 1.对Java中的int型进行封装那么就是hadoop中的IntWritable类 在写程序时可以把IntWritable可以看着是int 类型,它实现 了WritableComparable接口。 WritableComparable又是 Writable、 java.lang.comparable接口的子接口。 2.Writable类对所有的Java基本类型进行封装: 如:boolean -> BooleanWritable ; Byte -> ByteWritable 3.我们可以自定义Writable接口,来编写更复杂的结构的类。 核心:hadoop有自己一套的I/O机制。I/O类都必须实现Writable接口。
  • 25. MapReduce
  • 26. MapReduce 程序1:run jobJobClient客户端JVMJobTrackerTaskTrackerChildMapTask或者 ReduceTaskJobtracker节点子JVMTasktracker 节点HDFS2:get new job ID3:copy Job rescouce4:submit job5:initialize job6:retrieve Input splits7:returns task8:retrieve job resources10:run9:launch客户端: 提交MapReduce作业, 即一个job。 jobTracker: 协调作业的运行。 taskTracker:作业划分后的任务 (一个job对应多个task, 一个task对应一个 或者多个MapReduce线程)。 MapReduce数据流MapReduce的工作原理
  • 27. MapReduce数据流
  • 28. MapReduce数据流2.1 根据输入数据的大小和参数的设置把数据分成splits, 每个split对于一个map线程。 2.2 Split中的数据作为Map的输入, Map的输出一定在Map端。 2.3 Map的输出到Reduce的输入的过程(shuffle过程): 第一阶段:在map端完成 内存->排序->写入磁盘->复制 分区->排序->分区合并->合并后分区->复制 第二阶段:在reduce端完成 映射到reduce端分区->合并->排序 2.4 Reduce的输入到Reduce的输出 最后排好序的key/value作为Reduce的输入,输出不一定 是在reduce端。
  • 29. MapReduce数据流MapReduce是 Hadoop程序的体现。框架极其简单:首先是对MapReduce程序运行前的参数配置,然后编写Map类(实现Map方法),最后是Reduce类(实现Reduce方法)。 MapReduce程序的每个细节都与设置的参数有很大的关系,参数设置的好,程序的效率肯定得到提高。 Map方法:Map(k1,v1) ->list(k2,v2) ,并行应用于每一个输入的数据集,每一次调用都会产生一个(k2,v2)的队列 。 Reduce方法:Reduce(k2,list(v2)) -> list(k3,v3)。收集map端输出队列list(k2,v2)中有相同key的数据对,把它们聚集在一起,输出时形成目的数据 list(k3,v3)。
  • 30. Hadoop优化优化内容最佳实践mapper的数量运行mapper需要多长时间?reducer的数量为了达到最高性能,reducer的数目应该比reducer槽(由内存和tasktracker槽决定)的数目稍微少一点,这将reducer使reducer能够在同一波中完成任务。combiner作业能否充分利用combiner来减少通过shuffle传输的数据中间值的产生对map输出进行压缩能使作业执行更快自定义序列如果正在使用自定义的writable对象或自定义的comparator,则必须确保已实现RawComparatorshuffleShuffle可以对一些内存管理的参数进行调整,弥补性能不足。
  • 31. Hadoop相关子项目子项目作用ZooKeeper为分布式提供高一致性服务Avro序列化,提高分布式传输效率HBase分布式数据库Hive提供类似oracle的数据添加,查询,修改,删除方法。Mahout提供一些可扩展的机器学习领域经典算法的实现Pig一种用于探索大型数据集的脚本语言
  • 32. 参考文献http://hadoop.apache.org/ Apress - Pro Hadoop