快乐学习
前程无忧、中华英才非你莫属!

大数据读书笔记

1、在古时候,人们用牛来拉重物。当一头牛拉不动一根圆木时,人们从来没有考虑过要培育更强壮的牛。同理,我们也不该想方设法打造超级计算机,而应该千方百计综合利用更多计算机来解决问题。 ——格蕾斯·霍珀(Grace Hopper)

                                                                                

2、为什么不能用数据库来对大量硬盘上的大规模数据进行批量分析呢?我们为什么需要MapReduce?

这两个问题的答案来自于计算机硬盘的另一个发展趋势寻址时间的提升远远不敌于传输速率的提升。寻址是将磁头移动到特定硬盘位置进行读写操作的过程。它是导致硬盘操作延迟的主要原因,而传输速率取决于硬盘的带宽。如果数据访问模式中包含大量的硬盘寻址,那么读取大量数据集就必然会花更长的时间(相较于流数据读取模式,流读取主要取决干传输速率)。另方面,如果数据库系统只更新一小部分记录,那么传统的B树就更有优型(关系型数据库中使用的一种数据结构,受限于寻址的比例)。但数据库系勾如果有大量数据更新时,B树的效率就明显落后于MapReduce,因为需要使用“排序/合并”,来重建数据库。

 

3、关系型数据库和MapReduce的比较

 

4、1998年 Jim Gray 在2003年3月发表 (分布式计算经济学一文中),提出:“数据处理应该在离数据本身比较近的地方进行,因为这样有利于降低成本,尤其是网络带宽消费所造成的成本。”

 

5、MapReduce有三大设计目标

 (1)为只需要短短几分钟或几个小时就可以完成的作业提供服务

 (2)运行于同一个内部有高速网络连接的数据中心内;

 (3)数据中心内的计算机都是可靠的、定制的硬件。

 

6、hadoop发展简史:

Hadoop是Apache Lucene创始人Doug Cutting创建的,Lucene是一个应用广泛的文本搜索系统库。Hadoop起源于开源的网络搜索引擎Apache

Nutch,它本身也是Lucene项目的一部分。Hadoop的得名Hadoop不是缩写,它是一个生造出来的词。Hadoop之父Doug Cutting这样解释Hadoop的来历这个名字是我的小孩给他的毛绒象玩具取的。我的命名标准是好拼读,含义宽泛,不会被用于其他地方。

Hadoop的子项目及后续模块所使用的名称也往往与其功能不相关,通常也以大象或其他动物为主题取名(例如pig)。较小一些的组件,名称通常都有较好的描述性(因此也更流俗)。这个原则很好,意味着我们望文知义,例如jobtracker,一看就知道它是用来跟踪MapReduce作业的。

 

7、Hadoop大事记

2004年Doug Cutting和Mike Cafarella实现了HDFS和MapReduce的初版

2005年12月Nutch移植到新框架,Hadoop在20个节点上稳定运行

2006年1月Doug Cutting加入雅虎

2006年2月Apache Hadoop项目正式启动,支持MapReduce和HDFS独立发展

2006年2月雅虎的网格计算团队采用Hadoop

2006年4月在188个节点上(每节点10 G8)运行排序测试集需要47.9个小时)

2006年5月雅虎建立了一个300个节点的Hadoop研究集群

2006年5月在500个节点土运行排序测试集需要42个小时

2006年11月研究集群增加到600个节点

2006年12月排序测试集在20个节点上运行1.8个小时,100个节点上运行3.3小

时,500个节点上运行5.2小时,900个节点上运行7.8个小时

2007年1月研究集群增加到900个节点

2007年4月研究集群增加到两个集群1000个节点

2008年4月在900个节点上运行1 TB排序测试集仅需209秒,成为全球最快

2008年10月研究集群每天装载10 TB的数据

2009年3月17个集群共24 000个节点

2009年4月在每分钟排序中胜出,59秒内排序500 GB(在1400个节点上)和173

分钟内排序100 TB数据(在3400个节点上)

 

8、LongWriteable 相当于 java的Long类型。Text 类型相当于java 的String类型,IntWritable相当于java里的Interge类型

 

9、reduce函数输入类型必须匹配map函数的输出类型(Context.write(为map函数的输出类型))

 

10、Mapper<LongWriteable ,Text ,Text ,IntWritable > 泛型类四个行参:代表(输入键、输入值、输出键、输出值)定义一个Mapper类要继承MapRuduceBase并实现Mapper泛型接口。

 

11、job.setOutPutKeyClass(Text.class); job.setOutPutValueClass(IntWritable.class); 这两个方法,控制map和reduce函数的输出类型,来保证输出的结果准确。

 

12、运行测试:采样的小数据集,用独立的本机的hadoop去运行,来排除代码问题。

 

13、map的输出文件名:part-m-nnnnn  。reduce的 输出文件名为:part-r-nnnnn(其中n是从零开始的表示分块序号的整数)

 

 

14、控制台输出的信息

            作业标识:job_local_0001

            map任务标识:attempt_local_0001_m_000000_0

            reduce任务标识:attempt_local_0001_r_000000_0

            counters:17 (map和ruduce所产生的记录。5个map输入+5个map输出 +5个reduce输入+2个reduce输出)

            在调试mapreduce任务时候,知道他们的ID是非常有用的。

 

15、有两类节点控制着作业执行过程:

一个jobtracker 及一系列 tasktracker。

jobtracker通过调度tasktracker上运行的任务来协调所有运行在系统上的作业。

tasktracker在运行任务的同时,将运行进度报告发送给jobtracker,jobtracker由此记录每项作业任务的整体进度情况,如果其中一个任务失败,jobtracker可以在另外一个tasktracker 节点上重新调度该任务。

 

16、hadoop将MapReduce 的输入数据划分成等长的小数据块,成为输入分片简称:“分片”。hadoop为每个分片构建一个map任务,并由该任务来运行用户自定义的map函数从而处理分片中的每条记录、hadoop在存储有输入数据的节点上运行map任务,可以获得最佳性能,这就是所谓的“数据本地化优化”一个合理的分片=HDFS一个块的大小=64MB.(要不,分片要过多于大于hdfs的块,就会产生分片中的部分数据需要通过网络传输到map任务节点,势必会产生不必要的集群宽带资源,)

 

17、Map将其输出写入本地硬盘保存为中间结果一旦作业执行完毕,map输出的结果就会被删除),该中间结果由reduce任务处理后,最终存储在hadoop上,然后实现备份。

如果还没有传给reduce之前,map任务发生失败,hadoop就会在另一个节点上重新运行这个map任务,再次构建map中间结果。

 

18、Reduce任务并不具备数据本地化的优势,单个reduce任务的输入通常来自于所有mapper的输出。

 

19、一个reduce任务的MapReduce数据流:

20、reduce 任务的数量并非由输入数据的大小决定,而事实上是独立指定的。

 

21、如果有好多个reduce任务,每个map任务就会针对输出进行分区,即为每个reduce任务建一个分区,分区由用户用partition函数来控制‘通常用默认的哈希函数来分区,很高效 

 

22、当有多个map和reduce任务的时候,每个reduce任务的输入都来自喜多map任务,  就会出现数据流的混洗(shuffle),调整混洗参数 对作业总执行时间的影响非常大。

       多个Reduce任务的数据流:

      

     

    

23、当数据处理完全并行,无需混洗时,可能会出现无reduce任务的情况,当这种情况,唯一的非本地节点数据传输是map任务将结果直接写入hdfs。

      

24、combiner 函数:hadoop允许用户 针对map任务的输出指定一个combiner(组合)函数作为reduce函数的输入,变相的在map任务节点上做计算并合并有效较少mapper和reducer之间的数据传输量。在MapReduce作业总使用commbiner 函数时需要慎重考虑。因为平均数就不适合用commbier函数

     计算1950年一段时期的平均温度:

     map(1950,0,20,10)   map(1950,25,15)

     正常:reduce(0,20,10,25,15)  =14

     利用组合函数combiner(avg):reduce(avg( map(0,20,10)), avg( map(25,15)) )=》avg(10,20) =15  ,结果就不对了!所以平均值就不适用组合函数了.

    

25、指定一个combiner:在setMapperClass(xxxx.calss)之后 设置job.setCombinerClass(xxxx.class);,它的设置与reduce函数相同。

 

26、Hadoop Streaming (hadoop数据传输技术)Hadoop提供了MapReduce的ApI,允许你使用非Java的其他语言来写自己的map和reduce函数。Hadoop Streaming使用Unix标准流作为Hadoop和应用程序之间的接口,所以我们可以使用任何编程语言通过标准输入/输出来MapReduce程序。Streaming天生适合用于文本处理。map的输入数据通过标准输入流传递给map函数,并且是一行一行地传输,最后将结果行写到标准输出。map输出的键/值对是以一个制表符分隔的行,并且写入标准输出reduce函数的输入格式与之相同(通过制表符来分隔的键/值对)并通过标准输入流进行传输。reduce函数从标准输入流中读取输入行,该输入已由Hadoop框架根据键排过序,最后将结果写入标准输出。

  

            

打赏
赞(0) 打赏
未经允许不得转载:同乐学堂 » 大数据读书笔记

特别的技术,给特别的你!

联系QQ:1071235258QQ群:710045715

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

error: Sorry,暂时内容不可复制!