当前位置:首页 » 存储配置 » hadoop图片存储

hadoop图片存储

发布时间: 2022-06-16 01:12:25

① 基于hadoop的云存储实例

基于Hadoop平台的云存储应用实践

http://cio.itxinwen.com/case_studies/2012/0327/402100.html

云计算(CloudComputing)是一种基于因特网的超级计算模式,在远程的数据中心里,成千上万台电脑和服务器连接成一片电脑云。用户通过电脑、笔记本、手机等方式接人数据中心,按自己的需求进行运算。目前,对于云计算仍没有普遍一致的定义。结合上述定义,可以总结出云计算的一些本质特征,即分布式计算和存储特性、高扩展性、用户友好性、良好的管理性。

1云存储架构图

橘色的作为存储节点(StorageNode)负责存放文件,蓝色作为控制节点((ControlNode)则是负责文件索引,并负责监控存储节点间容量及负载的均衡,这两个部分合起来便组成一个云存储。存储节点与控制节点都是单纯的服务器,只是存储节点的硬盘多一些,存储节点服务器不需要具备RAID的功能,只要能安装Linux即可,控制节点为了保护数据,需要有简单的RAIDlevelO1的功能。

云存储不是要取代现有的盘阵,而是为了应付高速成长的数据量与带宽而产生的新形态存储系统,因此云存储在设计时通常会考虑以下三点:

(1)容量、带宽的扩容是否简便

扩容是不能停机,会自动将新的存储节点容量纳入原来的存储池。不需要做繁复的设定。

图1云存储架构图


(2)带宽是否线形增长

使用云存储的客户,很多是考虑未来带宽的增长,因此云存储产品设计的好坏会产生很大的差异,有些十几个节点便达到饱和,这样对未来带宽的扩容就有不利的影响,这一点要事先弄清楚,否则等到发现不符合需求时,已经买了几百TB,后悔就来不及了。

(3)管理是否容易。

2云存储关键技术

云存储必须具备九大要素:①性能;②安全性;③自动ILM存储;④存储访问模式;⑤可用性;⑥主数据保护;⑦次级数据保护;⑧存储的灵活;⑨存储报表。

云计算的发展离不开虚拟化、并行计算、分布式计算等核心技术的发展成熟。下面对其介绍如下:

(1)集群技术、网格技术和分布式文件系统

云存储系统是一个多存储设备、多应用、多服务协同工作的集合体,任何一个单点的存储系统都不是云存储。

既然是由多个存储设备构成的,不同存储设备之间就需要通过集群技术、分布式文件系统和网格计算等技术,实现多个存储设备之间的协同工作,使多个的存储设备可以对外提供同一种服务,并提供更大更强更好的数据访问性能。如果没有这些技术的存在,云存储就不可能真正实现,所谓的云存储只能是一个一个的独立系统,不能形成云状结构。

(2)CDN内容分发、P2P技术、数据压缩技术、重复数据删除技术、数据加密技术

CDN内容分发系统、数据加密技术保证云存储中的数据不会被未授权的用户所访问,同时,通过各种数据备份和容灾技术保证云存储中的数据不会丢失,保证云存储自身的安全和稳定。如果云存储中的数据安全得不到保证,也没有人敢用云存储了。

(3)存储虚拟化技术、存储网络化管理技术

云存储中的存储设备数量庞大且分布多在不同地域,如何实现不同厂商、不同型号甚至于不同类型(例如FC存储和IP存储)的多台设备之间的逻辑卷管理、存储虚拟化管理和多链路冗余管理将会是一个巨大的难题,这个问题得不到解决,存储设备就会是整个云存储系统的性能瓶颈,结构上也无法形成一个整体,而且还会带来后期容量和性能扩展难等问题。

② hadoop是怎么存储大数据的

Hadoop中有很多方法可以加入多个数据集。MapRece提供了Map端和Rece端的数据连接。这些连接是非平凡的连接,并且可能会是非常昂贵的操作。Pig和Hive也具有同等的能力来申请连接到多个数据集。Pig提供了复制连接,合并连接和倾斜连接(skewed join),并且Hive提供了map端的连接和完整外部连接来分析数据。

一个重要的事实是,通过使用各种工具,比如MapRece、Pig和Hive等,数据可以基于它们的内置功能和实际需求来使用它们。至于在Hadoop分析大量数据,Anoop指出,通常,在大数据/Hadoop的世界,一些问题可能并不复杂,并且解决方案也是直截了当的,但面临的挑战是数据量。在这种情况下需要不同的解决办法来解决问题。

一些分析任务是从日志文件中统计明确的ID的数目、在特定的日期范围内改造存储的数据、以及网友排名等。所有这些任务都可以通过Hadoop中的多种工具和技术如MapRece、Hive、Pig、Giraph和Mahout等来解决。这些工具在自定义例程的帮助下可以灵活地扩展它们的能力。

③ 我要用hadoop来实现海量图片的存储,到底应该用raid来保证数据可靠性,还是用HDFS的冗余机制呢

图片这样比较小的文件,不建议使用hadoop来做,用fastdfs之类的布置简单,效果也比较好。raid5对于单点故障可以做到恢复,一旦多台机器同时出现问题,是没办法恢复的,单个图片文件较小,一般也不能分成多块,用raid5有点无力的感觉。当然如果你图片经过打包司马的,文件比较大(500MB以上),还是可以用的。

④ hadoop存储方式

传统化集中式存储存在已有一段时间。但大数据并非真的适合集中式存储架构。Hadoop设计用于将计算更接近数据节点,同时采用了HDFS文件系统的大规模横向扩展功能。虽然,通常解决Hadoop管理自身数据低效性的方案是将Hadoop数据存储在SAN上。但这也造成了它自身性能与规模的瓶颈。现在,如果你把所有的数据都通过集中式SAN处理器进行处理,与Hadoop的分布式和并行化特性相悖。你要么针对不同的数据节点管理多个SAN,要么将所有的数据节点都集中到一个SAN。但Hadoop是一个分布式应用,就应该运行在分布式存储上,这样存储就保留了与Hadoop本身同样的灵活性,不过它也要求拥抱一个软件定义存储方案,并在商用服务器上运行,这相比瓶颈化的Hadoop自然更为高效。大数据培训这么火的原因有很多。注意不要混淆超融合与分布式。某些超融合方案是分布式存储,但通常这个术语意味着你的应用和存储都保存在同一计算节点上。这是在试图解决数据本地化的问题,但它会造成太多资源争用。这个Hadoop应用和存储平台会争用相同的内存和CPU。Hadoop运行在专有应用层,分布式存储运行在专有存储层这样会更好。之后,利用缓存和分层来解决数据本地化并补偿网络性能损失。

⑤ 在中国有谁在用Hadoop

国内,有网络(集群的规模已经是千台了吧)、淘宝(有自己的文件处理系统TFS),中国移动、搜狗、华为(是社区排名靠前的贡献者)等企业; hadoop的应用场景,给你美国着名科技博客GigaOM的专栏作家Derrick Harris的文章吧,他一直跟踪云计算和Hadoop技术,在最近的一篇文章中总结了10个Hadoop的应用场景:(1)在线旅游:你知道吗,目前全球范围内80%的在线旅游网站都是在使用Cloudera公司提供的Hadoop发行版,其中SearchBI网站曾经报道过的Expedia也在其中。 (2)移动数据:Cloudera运营总监称,美国有70%的智能手机数据服务背后都是由Hadoop来支撑的,也就是说,包括数据的存储以及无线运营商的数据处理等,都是在利用Hadoop技术。(3)电子商务:这一场景应该是非常确定的,eBay就是最大的实践者之一。国内的电商在Hadoop技术上也是储备颇为雄厚的。(4)能源开采:美国Chevron公司是全美第二大石油公司,他们的IT部门主管介绍了Chevron使用Hadoop的经验,他们利用Hadoop进行数据的收集和处理,其中这些数据是海洋的地震数据,以便于他们找到油矿的位置。(5)节能:另外一家能源服务商Opower也在使用Hadoop,为消费者提供节约电费的服务,其中对用户电费单进行了预测分析。(6)基础架构管理:这是一个非常基础的应用场景,用户可以用Hadoop从服务器、交换机以及其他的设备中收集并分析数据。(7)图像处理:创业公司Skybox Imaging 使用Hadoop来存储并处理图片数据,从卫星中拍摄的高清图像中探测地理变化。(8) 诈骗检测:这个场景用户接触的比较少,一般金融服务或者政府机构会用到。利用Hadoop来存储所有的客户交易数据,包括一些非结构化的数据,能够帮助机构发现客户的异常活动,预防欺诈行为。(9) IT安全:除企业IT基础机构的管理之外,Hadoop还可以用来处理机器生成数据以便甄别来自恶意软件或者网络中的攻击。(10)医疗保健:医疗行业也会用到Hadoop,像IBM的Watson就会使用Hadoop集群作为其服务的基础,包括语义分析等高级分析技术等。医疗机构可以利用语义分析为患者提供医护人员,并协助医生更好地为患者进行诊断。

⑥ 1g的文件在hadoop是怎么存储的

hdfs是按块进行存储的。1GB文件会划分成若干块(默认64MB一个块,也可以自己配置),然后分配到不同的存储节点上存储。
nameserver会记录哪些块存储在哪个节点上,等读的时候需要访问nameserver,获取到不同的数据节点,然后再访问数据即可。

⑦ hadoop 中文件是怎么存储的

1、存储文件的时候需要指定存储的路径,这个路径是HDFS的路径。而不是哪个节点的某个目录。比如./hadoop fs -put localfile hdfspat
一般操作的当前路径是/user/hadoop比如执行./hadoop fs -ls .实际上就相当于./hadoop fs -ls /user/hadoop
2、HDFS本身就是一个文件系统,在使用的时候其实不用关心具体的文件是存储在哪个节点上的。如果需要查询可以通过页面来查看,也可以通过API来实现查询。

⑧ 海量图片存储用hadoop是否合适存储在哪个节点上能否由我们自己决定

hadoop可以实现海量数据的存储,它包含分布式文件系统HDFS,所以您说的一部分存在节点1,一部分存在节点2上肯定可行
当你需要存储比较大的文件时,HDFS会把它分成多个小块(块的大小可以自己定)来进行分布式存储,而且名字节点会记录存的位置,当应用程序请求计算时,会将计算移到相应的数据附近,所以用hadoop,就相信它好了,当然你也可以在它上面附加一些自己的安全管理模块,或其它中间件等,毕竟hadoop也有不尽人意的地方,还需要改进。
目前facebook,淘宝,yahoo!等都用hadoop构建了自己的数据中心来支持海量数据的存储

⑨ hadoop的文件存储方式与传统的文件有什么区别

1、存储文件的时候需要指定存储的路径,这个路径是hdfs的路径。而不是哪个节点的某个目录。比如./hadoop fs -put localfile hdfspat
一般操作的当前路径是/user/hadoop比如执行./hadoop fs -ls .实际上就相当于./hadoop fs -ls /user/hadoop
2、hdfs本身就是一个文件系统,在使用的时候其实不用关心具体的文件是存储在哪个节点上的。如果需要查询可以通过页面来查看,也可以通过api来实现查询。

⑩ hadoop中存储文件系统hdfs的冗余机制是怎么进行的有什么特点

可以只用一行代码来运行MapRece作业:JobClient.runJon(conf),Job作业运行时参与的四个实体:


1.JobClient 写代码,配置作业,提交作业。

2.JobTracker:初始化作业,分配作业,协调作业运行。这是一个java程序,主类是JobTracker。

3.TaskTracker:运行作业划分后的任务,即分配数据分配上执行Map或Rece任务。

4.HDFS:保存作业数据、配置信息等,保存作业结果。


Map/Rece 作业总体执行流程:

代码编写 ----> 作业配置 ---->作业提交---->Map任务分配和执行---->处理中间结果----> Rece任务分配与执行----> 输出结果

而对于每个作业的执行,又包含:

输入准备---->任务执行---->输出结果

作业提交JobClient:

JobClient的runJob方法产生一个Jobclient实例并调用其submitJob方法,然后runJob开始循环吗,并在循环中调用getTaskCompetionEvents方法,获得TaskCompletionEvent实例,每秒轮询作业进度(后面有介绍进度和状态更新),把进度写到控制台,作业完成后显示作业计数器,若失败,则把错误记录到控制台。


submitJob方法作业提交的过程:

1.向JobTracker请求一个新的JobId。

2.检查作业相关路径,如果路径不正确就会返回错误。

3.计算作业输入分片及其划分信息。

4.将作业运行需要的资源(jar文件、配置文件等)复制到Shared HDFS,并

复制多个副本(参数控制,默认值为10)供tasktracker访问,也会将计算的分片复制到HDFS。

5.调用JobTracker对象的submitJob()方法来真正提交作业,告诉JobTracker作业准备执行。


作业的初始化JobTracker:

JobTracker收到submitJob方法调用后,会把调用放入到一个内部队列,由作业调度器(Job scheler)进行调度并对其初始化。Job初始化即创建一个作业对象。

当作业被调度后,JobTracker会创建一个代表这个作业的JobInProgress对象,并将任务和记录信息封装在这个对象中,以便跟踪任务状态和进程。

初始化过程就是JobInProgress对象的initTasks方法进行初始化的。


初始化步骤:

1.从HDFS中读取作业对应的job.split信息,为后面的初始化做好准备。

2.创建并初始化map和rece任务。根据数据分片信息中的个数确定map task的个数,然后为每个map task生成一个TaskInProgress对象来处理数据分片,先将其放入nonRunningMapCache,以便JobTracker分配任务的时候使用。接下来根据JobConf中的mapred.rece.tasks属性利用setNumReceTasks()方法设置rece task的数量,然后同map task创建方式。

3.最后就是创建两个初始化task,进行map和rece的初始化。


任务的分配JobTracker:

消息传递HeartBeat: tasktracker运行一个简单循环定期发送心跳(heartbeat)给JobTracker。由心跳告知JobTracker自己是否存活,同时作为消息通道传递其它信息(请求新task)。作为心跳的一部分,tasktracker会指明自己是否已准备好运行新的任务,如果是,jobtracker会分配它一个任务。


分配任务所属于的作业:在Jobtracker分配任务前需先确定任务所在的作业。后面会介绍到各种作业调度算法,默认是一个FIFO的作业调度。


分配Map和Rece任务:tasktracker有固定数量的任务槽,一个tasktracker可以同时运行多个Map和Rece任务,但其准确的数量由tasktracker的核的数量和内存大小决定。默认调度器会先填满Map任务槽,再填Rece任务槽。jobtracker会选择距离离分片文件最近的tasktracker,最理想情况下,任务是数据本地化(data-local)的,当然也可以是机架本地化(rack-local),如果不是本地化的,那么他们就需要从其他机架上检索数据。Rece任务分配很简单,jobtracker会简单的从待运行的rece任务列表中选取下一个来执行,不用考虑数据本地化。


任务的执行TaskTracker:

TaskTracker收到新任务后,就要在本地运行任务了,运行任务的第一步就是通过localizedJob将任务本地化所需要的注入配置、数据、程序等信息进行本地化。


1.本地化数据:从共享文件系统将job.split 、job.jar (在分布式缓存中)复制本地,将job配置信息写入job.xml。

2.新建本地工作目录:tasktracker会加压job.jar文件到本工作目录。

3.调用launchTaskForJob方法发布任务(其中会新建TaskRunner实例运行任务),如果是Map任务就启用MapTaskRunner,对于Rece就是ReceTaskRunner。

在这之后,TaskRunner会启用一个新的JVM来运行每个Map/Rece任务,防止程序原因而导致tasktracker崩溃,但不同任务间重用JVM还是可以的,后续会讲到任务JVM重用。


对于单个Map,任务执行的简单流程是:

1.分配任务执行参数

2.在Child临时文件中添加map任务信息(Child是运行Map和Rece任务的主进程)

3.配置log文件夹,配置map任务的通信和输出参数

4.读取input split,生成RecordReader读取数据

5.为Map生成MapRunnable,依次从RecordReader中接收数据,并调用Map函数进行处理。

6.最后将map函数的输出调用collect收集到MapOutputBuffer(参数控制其大小)中。


Streaming和Pipes:

Streaming和Pipes都运行特殊的Map和Rece任务,目的是运行用户提供的可执行程序并与之通信。


Streaming:使用标准输入输出Streaming与进程进行通信。


Pipes:用来监听套接字,会发送一个端口号给C++程序,两者便可建立链接。

进度和状态更新:

一个作业和它的任务都有状态(status),其中包括:运行成功失败状态、Map/Rece进度、作业计数器值、状态消息。


状态消息与客户端的通信:

1.对于Map任务Progress的追踪:progress是已经处理完的输入所占的比例。

2.对于Rece:稍复杂,rece任务分三个阶段(每个阶段占1/3),复制、排序和Rece处理,若rece已执行一半的输入的话,那么任务进度便是1/3+1/3+1/6=5/6。

3.任务计数器:任务有一组计数器,负责对任务运行各个事件进行计数。

4.任务进度报告:如果任务报告了进度,便会设置一个标记以表明状态将被发送到tasktracker。有一个独立线程每隔三秒检查一次此标记,如果已设置,则告知tasktracker当前状态。

5.tasktracker进度报告:tasktracker会每隔5秒(这个心跳是由集群大小决定,集群越大时间会越长)发送heartbeat到jobtracker,并且tasktracker运行的所有状态都会在调用中被发送到jobtracker。

6.jobtracker合并各任务报告:产生一个表明所有运行作业机器所含任务状态的全局视图。

前面提到的JobClient就是通过每秒查询JobTracker来接收最新状态,而且客户端JobClient的getJob方法可以得到一个RunningJob的实例,其包含了作业的所以状态信息。

作业的完成:

当jobtracker收到作业最后一个任务已完成的通知后,便把作业状态设置成成功。JobClient查询状态时,便知道任务已成功完成,于是JobClient打印一条消息告知用户,然后从runJob方法返回。


如果jobtracker有相应设置,也会发送一个Http作业通知给客户端,希望收到回调指令的客户端可以通过job.end.notification.url属性来进行设置。


jobtracker情况作业的工作状态,指示tasktracker也清空作业的工作状态,如删除中间输出。

失败

实际情况下,用户的代码存在软件错误进程会崩溃,机器也会产生故障,但Hadoop能很好的应对这些故障并完成作业。


1.任务失败

子任务异常:如Map/Rece任务中的用户代码抛出异常,子任务JVM进程会在退出前向父进程tasktracker发送错误报告,错误被记录用户日志。tasktracker会将此次task attempt标记为tailed,并释放这个任务槽运行另外一个任务。


子进程JVM突然退出:可能由于JVM bug导致用户代码造成的某些特殊原因导致JVM退出,这种情况下,tasktracker会注意到进程已经退出,并将此次尝试标记为failed。


任务挂起:一旦tasktracker注意一段时间没有收到进度更新,便会将任务标记为failed,JVM子进程将被自动杀死。任务失败间隔时间通常为10分钟,可以以作业或者集群为基础设置过期时间,参数为mapred.task.timeout。注意:如果参数值设置为0,则挂起的任务永远不会释放掉它的任务槽,随着时间的推移会降低整个集群的效率。


任务失败尝试次数:jobtracker得知一个tasktracker失败后,它会重新调度该任务执行,当然,jobtracker会尝试避免重新调度失败过的tasktracker任务。如果一个任务尝试次数超过4次,它将不再被重试。这个值是可以设置的,对于Map任务,参数是mapred.map.max.attempts,对于rece任务,则由mapred.rece.max.attempts属性控制。如果次数超过限制,整个作业都会失败。当然,有时我们不希望少数几个任务失败就终止运行的整个作业,因为即使有些任务失败,作业的一些结果可能还是有用的,这种情况下,可以为作业设置在不触发作业失败情况下的允许任务失败的最大百分比,Map任务和Rece任务可以独立控制,参数为mapred.max.map.failures.percent 和mapred.max.rece.failures.percent。


任务尝试中止(kill):任务终止和任务失败不同,task attempt可以中止是因为他是一个推测副本或因为它所处的tasktracker失败,导致jobtracker将它上面的所有task attempt标记为killed。被终止的task attempt不会被计入任务运行尝试次数,因为尝试中止并不是任务的错。


2.tasktracker失败

tasktracker由于崩溃或者运行过慢而失败,他将停止向jobtracker发送心跳(或很少发送心跳)。jobtracker注意已停止发送心跳的tasktracker(过期时间由参数mapred.tasktracker.expiry.interval设置,单位毫秒),并将它从等待调度的tasktracker池中移除。如果是未完成的作业,jobtracker会安排次tasktracker上已经运行成功的Map任务重新运行,因为此时rece任务已无法访问(中间输出存放在失败的tasktracker的本地文件系统上)。


即使tasktracker没有失败,也有可能被jobtracker列入黑名单。如果tasktracker上面的失败任务数量远远高于集群的平均失败任务次数,他就会被列入黑名单,被列入黑名单的tasktracker可以通过重启从jobtracker黑名单中移除。


3.jobtracker失败

老版本的JobTracker失败属于单点故障,这种情况下作业注定失败。


作业调度:

早期作业调度FIFO:按作业提交顺序先进先出。可以设置优先级,通过设置mapred.job.priority属性或者JobClient的setJobPriority()方法制定优先级(优先级别:VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW)。注意FIFO调度算法不支持抢占(preemption),所以高优先级作业仍然会被那些已经开始的长时间运行的低优先级作业所阻塞。


Fair Scheler:目标是让每个用户公平地共享集群能力。当集群存在很多作业时,空闲的任务槽会以”让每个用户共享集群“的方式进行分配。默认每个用户都有自己的作业池。FairScheler支持抢占,所以,如果一个池在特定的一段时间未得到公平地资源共享,它会终止池中得到过多的资源任务,以便把任务槽让给资源不足的池。FairScheler是一个后续模块,使用它需要将其jar文件放在Hadoop的类路径下。可以通过参数map.red.jobtracker.taskScheler属性配置(值为org.apache.hadoop.mapred.FairScheler)


Capacity Scheler:

集群由很多队列组成,每个队列都有一个分配能力,这一点与FairScheler类似,只不过在每个队列内部,作业根据FIFO方式进行调度。本质上说,Capacity Scheler允许用户或组织为每个用户模拟一个独立使用FIFO的集群。


shuffle和排序:

MapRece确保每个Recer的输入都是按键排序的。系统执行排序的过程-将map输出作为输入传给recer的过程称为shuffle。shuffle属于不断被优化和改进的代码库的一部分,从许多方面来看,shuffle是MapRece的心脏。


整个shuffle的流程应该是这样:

map结果划分partition 排序sort 分割spill 合并同一划分 合并同一划分 合并结果排序 rece处理 输出


Map端:

写入缓冲区:Map函数的输出,是由collector处理的,它并不是简单的将结果写到磁盘。它利用缓冲的方式写到内存,并处于效率的考虑进行预排序。每个map都有一个环形的内存缓冲区,用于任务输出,默认缓冲区大小为100MB(由参数io.sort.mb调整),一旦缓冲区内容达到阈值(默认0.8),后台进程边开始把内容写到磁盘(spill),在写磁盘过程中,map输出继续被写到缓冲区,但如果缓冲区被填满,map会阻塞知道写磁盘过程完成。写磁盘将按照轮询方式写到mapred.local.dir属性制定的作业特定子目录中。


写出缓冲区:collect将缓冲区的内容写出时,会调用sortAndSpill函数,这个函数作用主要是创建spill文件,按照key值对数据进行排序,按照划分将数据写入文件,如果配置了combiner类,会先调用combineAndSpill函数再写文件。sortAndSpill每被调用一次,就会写一个spill文件。


合并所有Map的spill文件:TaskTracker会在每个map任务结束后对所有map产生的spill文件进行merge,merge规则是根据分区将各个spill文件中数据同一分区中的数据合并在一起,并写入到一个已分区且排序的map输出文件中。待唯一的已分区且已排序的map输出文件写入最后一条记录后,map端的shuffle阶段就结束了。


在写磁盘前,线程首先根据数据最终要传递到的recer把数据划分成响应的分区(partition),在每个分区中,后台线程按键进行内排序,如果有一个combiner,它会在排序后的输出上运行。


内存达到溢出写的阈值时,就会新建一个溢出写文件,因为map任务完成其最后一个输出记录之后,会有几个溢出写文件。在任务完成前,溢出写文件会被合并成一个已分区且已排序的输出文件。配置属性io.sort.facor控制一次最多能合并多少流,默认值是10。


如果已经指定combiner,并且写次数至少为3(通过min.mum.spills.for.combine设置)时,则combiner就会在输出文件写到磁盘之前运行。运行combiner的意义在于使map输出更紧凑,舍得写到本地磁盘和传给recer的数据更少。


写磁盘时压缩:写磁盘时压缩会让写的速度更快,节约磁盘空间,并且减少传给recer的数据量。默认情况下,输出是不压缩的,但可以通过设置mapred.compress.map.output值为true,就可以启用压缩。使用的压缩库是由mapred.map.output.compression.codec制定。


recer获得文件分区的工作线程:recer通过http方式得到输出文件的分区,用于文件分区的工作线程数量由tracker.http.threads属性指定,此设置针对的是每个tasktracker,而不是每个map任务槽。默认值为40,在大型集群上此值可以根据需要而增加。


Rece端:

复制阶段:rece会定期向JobTracker获取map的输出位置,一旦拿到输出位置,rece就会从对应的TaskTracker上复制map输出到本地(如果map输出很小,则会被复制到TaskTracker节点的内存中,否则会被让如磁盘),而不会等到所有map任务结束(当然这个也有参数控制)。


合并阶段:从各个TaskTracker上复制的map输出文件(无论在磁盘还是内存)进行整合,并维持数据原来的顺序。


Rece阶段:从合并的文件中顺序拿出一条数据进行rece函数处理,然后将结果输出到本地HDFS。


Map的输出文件位于运行map任务的tasktracker的本地磁盘,现在,tasktracker要为分区文件运行rece任务。每个任务完成时间可能不同,但是只要有一个任务完成,rece任务就开始复制其输出,这就是rece任务的复制阶段( phase)。rece任务有少量复制线程,因此能够并行取得map输出。默认值是5个线程,可以通过mapred.rece.parallel.copies属性设置。


Recer如何得知从哪个tasktracker获得map输出:map任务完成后会通知其父tasktracker状态已更新,tasktracker进而通知(通过heart beat)jobtracker。因此,JobTracker就知道map输出和tasktracker之间的映射关系,recer中的一个线程定期询问jobtracker以便获知map输出位置。由于recer有可能失败,因此tasktracker并没有在第一个recer检索到map输出时就立即从磁盘上删除它们,相反他会等待jobtracker告示它可以删除map输出时才删除,这是作业完成后最后执行的。


如果map输出很小,则会被直接复制到rece tasktracker的内存缓冲区(大小由mapred.job.shuffle.input.buffer.percent控制,占堆空间的百分比),否则,map输出被复制到磁盘。一旦内存缓冲区达到阈值大小(由mapred.iob.shuffle.merge.percent)

或达到map输出阈值大小(mapred.inmem.threadhold),则合并后溢出写到磁盘中。


随着磁盘上副本增多,后台线程会将他们合并为更大的、排好序的文件。注意:为了合并,压缩的map输出必须在内存中被解压缩。


排序阶段:复制阶段完成后,rece任务会进入排序阶段,更确切的说是合并阶段,这个阶段将合并map输出,维持其顺序排列。合并是循环进行的,由合并因子决定每次合并的输出文件数量。但让有可能会产生中间文件。


rece阶段:在最后rece阶段,会直接把排序好的文件输入rece函数,不会对中间文件进行再合并,最后的合并即可来自内存,也可来自磁盘。此阶段的输出会直接写到文件系统,一般为hdfs。


细节:这里合并是并非平均合并,比如有40个文件,合并因子为10,我们并不是每趟合并10个,合并四趟。而是第一趟合并4个,后三趟合并10,在最后一趟中4个已合并的文件和余下6个未合并会直接并入rece。

热点内容
谷歌解压版 发布:2025-01-08 19:35:27 浏览:738
c语言找零钱 发布:2025-01-08 19:35:25 浏览:999
压缩大声音 发布:2025-01-08 19:32:08 浏览:526
yy易语言源码 发布:2025-01-08 19:24:42 浏览:882
4g怎么设置服务器 发布:2025-01-08 19:24:09 浏览:889
安卓如何使用messager 发布:2025-01-08 19:14:47 浏览:126
电脑服务器的终端 发布:2025-01-08 19:14:46 浏览:828
电脑系统的密码文件是什么 发布:2025-01-08 19:14:11 浏览:359
ppt加密如何解密 发布:2025-01-08 19:14:11 浏览:964
简单c语言编程 发布:2025-01-08 19:14:10 浏览:51