Hadoop权威指南复读(一)

     最近又重新回读权威指南,感觉曾经都只是浅显的略过,可能确实是学的多了就会看到事物不一样的那一面哈……所以这一遍争取记录下来一些心得和所学吧,也会在记录的同时查看很多前人的笔记,所以还是要感谢各位在网络上的分享!

    参考链接如下:http://www.zdingke.com/2019/08/27/schema-on-read%E4%B8%8Eschema-on-write/

                             https://blog.youkuaiyun.com/rokii/article/details/2137450

     一.摘要及重要信息记录

     1.数据集:

     Amazon Web Services

     Infochimps.org

     美国国家气候数据中心NCDC

     2.摘要:

          MapReduce作为一个批量查询处理器,其每个查询需要处理整个数据集或至少一个数据集的绝大部分。

          寻址时间的提升远远不敌于传输速率的提升。寻址是将磁头移动到特定硬盘位置进行读写操作的过程,而传输速率取决于硬盘的带宽

          MapReduce适合一次写入,多次读取数据的应用,关系型数据库适合持续更新的数据集。(RDBMS适用于索引后数据集的点查询和更新)

          结构化数据指有既定格式的实体化数据(XML)。半结构化数据指可能有格式,但经常只作为对数据结构的一般性指导(电子表格:存在表格结构,但是具体数据格式不固定)。非结构化数据指没有特定的内部数据结构。

          数据本地化特性是Hadoop数据处理的核心。

          处理海量数据时面临的问题是协调性和可靠性(任务完成时间与所有节点完成最长任务时间有关,即任务分配问题;任务结果聚合问题)

          Hadoop本身提供了一套可优化网络序列化传输的基本类型(org.apache.hadoop.io),而不直接使用Java内嵌的类型。

          Hadoop会再存储有输入数据的节点上运行map任务,即可不使用集群带宽资源,达成数据本地化的优化。

          reduce任务不具备数据本地化的优势,因为单个reduce任务的输入通常来自所有mapper的输出。排过序的map输出通过网络传输发送到运行的reduce任务的节点,而后在reduce端合并并处理。并且处于安全的考虑,reduce输出的每个HDFS块,第一个副本存储在本地节点,其他副本存储在其他机架节点中,所以将reduce的输出写入HDFS确实需要占用网络带宽。

          集群上的可用带宽限制了MapReduce作业的数量,因此尽量避免map和reduce任务之间的数据传输可以使用combiner作为优化。由于combiner属于优化方案,所以Hadoop无法确定要对一个指定map输出记录调用多少次combiner,即不管调用多少次,reducer的输出结果都是一样的。

     二.提及概念

     1.独立冗余磁盘阵列(RAID)

          独立冗余磁盘阵列是一种通过将相同数据同时存储在多个硬盘的不同地方上,从而提高存储系统的存储和读取数据的吞吐量的方法。也就可以达到单个磁盘驱动成倍数增加的传输速率。并且由于数据存储时还会使用数据校验,也大大提高了数据的容错能力。RAID0不具有冗余能力,RAID1,4,5等则通过增加磁盘数量的方式提高了校验和容错的能力。

     2.读时模式与写时模式

          读时模式:数据在此模式下,并不在加载时进行对数据的ETL工作等,直到进行查询操作才进行。适用于非结构化数据,如Hadoop对非结构化和半结构化的数据非常有效,因为其是在处理数据时才对数据进行解释,正是读时模式。

          写时模式:如同传统数据库中查询数据等操作所示,只要数据不符合模式,则拒绝加载数据并报错。适用于结构化数据。

     3.无共享框架(Shared Nothing Architecture)

          Shared Nothing Architecture(无分享架构)是一个分布式的架构,每个节点都是独立的。即通过将必要共享信息集中存储在数据库中或缓存中,使得各个节点保持无状态性,同时保证各节点之间的数据互通性,即均从集中存储的位置获取,一旦变更也能及时同步,提高性能和效率。

     4.Lucene和Nutch

          Lucene和Nutch的最大的区别在于前者是工具,是一个提供很多全文搜索方式的函数库,而后者是在前者的基础上的一个应用。后者在集成前者的功能的基础上还增加了数据采集等Web相关的内容。

          Lucene,Solr和Elasticsearch:

          Lucene仍然是是提供函数的工具包,Solr和Elasticsearch都是基于Lucene开发的产品级搜索引擎。

     5.awk

          awk是Linux系统下的一个文本分析工具,可以通过参数化的操作完成文本内数据的分析。

          其基本的书写格式为:awk   [options]   ' {[pattern] action} ' {filenames}

          options:标明用于分割的字符串或正则表达式,也可以是赋值一个用户定义的变量。

          {[pattern] action}:标明要做的动作

          {filenames}:要进行该操作的文件夹名称

          awk内存在很多内置变量,如-F实际上表示的就是内置变量中的FS(设置输入域分隔符),此外还有OFS(输出域分隔符),ORS(输出记录分隔符)等。

          eg. awk -F ',' '{print $1,$2}' test.txt(表示用','分割test.txt内字符串,并输出第一项和第二项)

     6.org.apache.hadoop.io

          这里我以Hadoop-2.7.4为例,其中常用的类型有ArrayWritable,BooleanWritable,BytesWritable,ByteWritable,DoubleWritable,FloatWritable,IntWritable,LongWritable,MapWritable,NullWritable,ObjectWritable,ShortWritable,Text等用于Map传输和Reduce接收。此外,其中很多类都是实现了WritableComparable接口。即在Writable的基础上添加了compareTo的方法,该方法可以用于判断key是否唯一。所以由于Hadoop数据传输过程中,key与value的数据类型的关系仍保持着K/V对的特性,所以能用作key的值同样可以作为value,相反则由于不唯一的关系不可使用。

     7.MapReduce main程序:输出路径应该是不存在的(防止长时间运行的作业结果被覆盖),默认情况下Reduce函数的输出和Map函数的输入类型相同,如果不同,则需要通过setMapOutputKeyClass和setMapOutputValueClass来设置Map函数的输出类型。

     8.MapReduce作业(job):客户端需要执行的一个工作单元,包括输入数据,MapReduce程序和配置信息。Hadoop将作业分成若干个任务(task),包括两类任务:map任务和reduce任务,通过YARN进行调度。如果一个任务失败,将在另一个不同的节点上自动重新调度运行(应注意的是前言提到的当reduce任务失败时可能需要重新获取mao任务的数据,即会同样导致相关map任务的重新运行)。

     9.分片:Hadoop将MapReduce的输入数据划分成等长的小数据块,即输入分片。Hadoop为每个分片构建一个map任务,并由该任务来运行用户定义的map函数从而处理分片的每条记录(一般而言,一个合理的分片大小趋向于HDFS的一个块大小:128M)。

     10.本地数据,本地机架,跨机架:机架感知(RackAwareness)是为了处理当某些特殊问题发生时避免不同节点之间的跨机架通信,而是尽可能发生在同一个机架之内,但与此同时,为了避免整体机架发生问题,各节点又会将数据块的副本放在多个机架上。考虑到副本的放置策略是使数据可靠并且开销更小,所以数据块被创建时,第一个副本放在本地节点中,第二个副本放在相同机架不同节点中,第三个副本放在不同机架的节点中。

     11.combiner:Combiner作为Map和Reduce的中间可选流程,能够减少Map发到Reducer上的数据量,提高Reducer的工作效率和处理效率,但是我们仍会需要Reducer作为最终数据处理的一个不可替代的流程。

     在我的理解中,如果有Combiner的存在,流程大致可以为(Map—>Combiner(数据预处理)—>Reducer(数据最终处理)),在这样的流程中减轻了大数据量从Map端输出,从而减少网络带宽和Reducer之上的负载。但是如果没有了Reducer,也就是用Combiner取代了Reducer,流程则可能为(Map—>Combiner(数据最终处理)—>Reducer(数据接收))那这样的话,Combiner就做了Reducer的工作,并且将所有的压力转移到了中间流程上,实际上与原有的Map直接到Reducer端的流程就没有本质的区别了,也就没有什么所谓的性能提升了。也就是说Combiner的核心是帮助削减Map的输出,而不是帮助Reducer做最终的数据处理。并且Combiner只处理单台机器生成的数据,也就是说Reducer是能处理多个Mapper的数据的,Combiner只能处理一个Mapper的输入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无语梦醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值