목차
人脸识别的例子
倒排索引的例子
常见的Mapreduce设计陷阱
?? 当map任务中对数据分片的时候。要确保没有创建过多(通常情况下,mapper的数量应该在数百,而不是数千)或者过少的分片。正确数量的mapper对应用程序有以下优势:
?? 为应用程序配置Reducer的数量是另一个重要因素,reducer太多(通常是成千)或太少都会使效率降低。
?? 合理利用作业计数器
?? 对应用程序的输出,选择一个合适的压缩机制来改善写性能(压缩速度vs压缩效率)。
?? 为mapreduce作业的输出选择一个合适的文件格式。利用序列化文件通常是最好的选择,因为它们可以被压缩和分片。
?? 当单个输入/输出文件很大的时候,考虑使用更大的输出块大小(多个千兆字节大小)。
데이터 베이스 MySQL 튜토리얼 MR总结(二)-Mapreduce程序设计

MR总结(二)-Mapreduce程序设计

Jun 07, 2016 pm 04:41 PM
요약 프로그램 작성

导读:尽管很多著作描述了mapreduce的API的使用,很少描述用实际的方法来设计一个MapReduce应用。 mapreduce的功能主要来自于它的简单性。除了准备输入数据之外,程序员只需要操作mapper和reducer。现实中的很多问题都可以利用这种方法解决。 在大多数情况下

导读:尽管很多著作描述了mapreduce的API的使用,很少描述用实际的方法来设计一个MapReduce应用。

mapreduce的功能主要来自于它的简单性。除了准备输入数据之外,程序员只需要操作mapper和reducer。现实中的很多问题都可以利用这种方法解决。

在大多数情况下, MapReduce可以作为一个通用的并行执行框架,充分利用数据的本地性。但是这种简单性是有代价的,设计者必须从以特定的方式组合在一起的一小部分组件的角度决定如何表达他的业务问题。

重新制定MapReduce的初始问题,通常有必要回答以下问题:

1. 怎么把一个大问题分解成多个小任务?更具体地说,你怎么分解问题以至于这些小任务可以并行执行?

2.你会选择哪对key/value作为每个任务的输出/输出?

3. 你如何汇总计算所需要的所有数据?更具体地说, 你怎么安排处理的方式,使所有必要的计算中的数据都同时在内存中?

我们要认识到,很多算法不能很容易地表示为一个单一的MapReduce作业。它往往需要把复杂的算法分解成一系列的作业,把其中一个作业的数据输出成为下一个作业的输入。

本节将会探讨在几个设计不同的实际MapReduce应用问题的例子(从简单到复杂)。所有的例子都会被描述为以下形式:

  • 对问题简单的描述
  • Mapreduce作业的描述,包括:

1.Mapper的描述

2.Reducer的描述

这种情况下的mapreduce实施是非常简单的――唯一需要的就是mapper,单独的处理每个记录然后输出结果。在这个例子中,Mapreduce控制mappers的分布,提供调度和错误处理的所有支持。下面的例子展示了如何设计这种类型的应用程序。

人脸识别的例子

虽然不是经常作为Hadoop-related问题讨论,但是图像处理应用在mapreduce范例中是非常合适的。假设有一个人脸识别算法的应用,需要一个图像,识别一系列想要的特性,并产生一组识别结果。再假设需要在百万图片上做人脸识别。如果所有的图片以序列文件的形式存放在hadoop中,那么你可以用一个简单的map作业就可以实现并行处理。在这个例子中,输入的key/value是ImageID/Image,输出的key/value是ImageID/可特征识别列表。此外,一组可特征识别必须分布到所有的mapper(例如,利用分布式缓存)。

人脸识别作业

Mapper 在这个作业中,mapper首先以可识别特征集进行初始化,对于每一个图像,一个map函数通过它的图像本身,以及可识别的列表来调用的人脸识别算法。识别的结果连同原来imageID一起从map中输出。
Result 这个作业执行的结果是所有包含在原始图片中识别出来的图片。

注意:要实现完全独立的mappers/reducers。在mapreduce应用中的每一个mapper/reducer需要创建独自的输出文件。这意味着,人脸识别的作业的执行结果将是一组文件(相同目录下的),每一个包含了各自mapper的输出。如果需要把他们放入到一个单个的文件中。必须在人脸识别作业中添加一个单独的reducer。这个reducer是非常简单的。因为在这个例子中,每一个作为reduce的输入的key只有一个单独的value(这里假设图像的ID是唯一的),reducer只是把输入的key/value直接写入到输出文件。我们要知道在这个例子中尽管一个reducer极其简单,但是这种额外的作业明显的增加了作业的整体运行时间。这是因为额外的reducer分为shuffle和sort(不单单在map作业中出现),当图像的数量非常大时,将花费大量的时间。

这种情况的一个例子就是构建倒排索引。这种类型的问题需要所有的mapreduce步骤进行执行,需要shuffle和sort把所有的结果集合在一起。下面的例子展示了如何设计这种类型的应用。

倒排索引的例子

在计算机科学中,倒排索引是一个数据框架,用来存放了从内容(例如单词或者数字)到它在一个文档或一组文档里的位置的映射,如表3-6所示。倒排索引的目的是实现快速的全文搜索,在文档增加的时候增加处理成本为代价,倒排索引式的数据结构是典型搜索引擎的关键部分,优化了查找某些单词出现的文档的速度。

文档
ID Title Content
1 Popular Football is Popular in US
2 Common Sport Soccer is commonly played in Europe
3 National Sport Cricket is played all over India

表2-1:文档结构

倒排索引
Term value Document Document Document
Title popular 1
Title sport 1 2 3
Title common 2
Title national 3
Content football 1
Content is 1 2 3
Content popular 1

表2-2:倒排索引

要创建倒排索引,可以把每个文档(或者文档里行)给mapper。mapper可以解析出文档里的多个单词,然后输出[单词,词频]键值对。reducer可以只是一个识别,输出列表或者可以执行每个单词的一些统计汇总的功能。

注释在第九章你将学会更多关于如何利用Hbase来存储倒排的索引。

表2-3里展示了这个例子中mapreduce作业的实现。

表2-3 倒排索引的计算

处理阶段 描述
Mapper 作业中,mapper的任务是构建一个包含一个单词索引的独特的记录和描述在文档里单词出现的信息。它读取每个输入的文档,解析,然后为文档里的每一个独特的单词创建一个索引描述符。该描述符包含文档的ID,文档里索引出现的次数,和任何附件的信息(比如从文档的开头索引位置的偏移量) ,每一个所以描述符被写出。
Shuffle和sort Mapreduce的shuffle和sort过程会把所有的记录都按照索引值排序,确保reducer接受到所有相同key值的索引。
Reducer 这项工作中,reducer的作用是构建一个倒排索引结构。根据系统的要求,可能有一个或多个reducer。Reducer得到所有给定索引的描述符,并生成一个索引记录,并写入到指定的索引存储。
Result 该作业执行的结果是一组原始文档的倒排索引。

表2-3:倒排索引的计算

更多复杂的mapreduce应用需要将来自多个获取的数据(就是说连接数据)进行处理。

什么场景下用MapReduce

为了能使Mapreduce可以应用,下面必须符合:

1、? 要运行的计算必须可以组合,它指的是必须能对数据集下的小数据集进行计算。然后对部分结果合并。

2、? 数据集的大小要足够大(或者计算时间要足够长),当基础设施? 为独立的计算和合并结果不会对整体性能造成影响。

3、? 计算主要取决于于正在处理的数据集。用Hbase可以额外添加小的数据集。分布式缓存或者一些其他的技术。

然而,当数据集必须能随机的被访问去执行操作(例如,如果一个给定的数据集记录必须加上额外的记录来执行操作),在这种情境中,mapreduce是不适用的。然后在这种情况下,可以运行额外的mapreduce作业来为计算“准备”数据。

另外一些不适用mapreduce的问题是递归问题(例如,斐波那契问题)。在这种情况下,mapreduce不适用是因为当前value值的计算需要前一个的知识。这就意味着你不能把它们分解成为可以单独运行的子计算(sub computation)。

如果一个数据足够的小,小到可以放到一个机器的内存里,作为一个独立的应用程序可能会处理的更快。在这种情况下,使用mapreduce,会使执行变得不必要的复杂,通常会更慢。

注意,(keep it in mind),虽然一大类的算法不能直接应用在mapreduce的实施上。但是对于同样的基本问题,往往存在可以通过利用mapreduce解决的替代解决方案。这种情况下,使用mapreduce通常是有利的,因为mapreduce是在有丰富的hadoop生态系统中执行的(支持更容易的改进的实施),并与其它应用程序的集成。

最后 你应该记住Mapreduce本质上是一个批处理实现。决不能用于在线计算(比如在线用户请求的实时计算)。

常见的Mapreduce设计陷阱

当你设计mapreduce应用的时候,下面列举的是需要注意和避免的。

?? 当map任务中对数据分片的时候。要确保没有创建过多(通常情况下,mapper的数量应该在数百,而不是数千)或者过少的分片。正确数量的mapper对应用程序有以下优势:

1、? 拥有过多的mapper会造成调度和基础设施的开销,在极端情况下,甚至会杀死一个Jobtracker。另外,过多的mapper通常会提高整体资源的利用率(因为创建过多的JVM)和执行时间(因为执行slot的数量是有限的)。

2、? Mapper太少会导致集群不能充分利用,给一些节点(实现运行mapper的节点)造成过度负载。此外,在有大型map任务情况下,重试和推测执行的情况会变得非常昂贵的代价且会花费更长的时间。

3、? 大量小型的mapper会造成大量的寻求,shuffle map输出给reducer的结果时。当把map的输出结果传递给reducer时,它也会造成过多的连接。

?? 为应用程序配置Reducer的数量是另一个重要因素,reducer太多(通常是成千)或太少都会使效率降低。

1、? 除了调度和基础设施的开销外,大量的reducer会创建太多的输出文件(记住,每个reducer创建自己的输出文件),对namenode有负面的影响。当有其他作业利用该mapreduce作业的结果时,它会变得更为复杂。

2、? 太少的reducer和太少的mapper一样,造成同样的负面影响-不能充分利用集群和非常昂贵(代价)的回调。(retry)

?? 合理利用作业计数器

1、? 计数器在跟踪少量的,重要的,全局的信息是适用的(在Chapter 5了解更多关于使用计数器的详情)。他们绝对不是只是整合非常细粒度统计的应用程序。

2、? 计数器的代价非常高,因为Jobtracker在应用程序的整个持续时间内,必须维持每个map/reduce任务的每一个计数器。

?? 对应用程序的输出,选择一个合适的压缩机制来改善写性能(压缩速度vs压缩效率)。

?? 为mapreduce作业的输出选择一个合适的文件格式。利用序列化文件通常是最好的选择,因为它们可以被压缩和分片。

?? 当单个输入/输出文件很大的时候,考虑使用更大的输出块大小(多个千兆字节大小)。

1、? 尽量避免在map和reduce方法中添加新的类的实例。这些方法在执行过程中会循环执行多次。也就是说类的创建和处理将增加执行的时间,为垃圾收集器增加额外的工作。比较好的方法是在相应的set()方法中创建大量的中间类,然后重写map和reduce方法。

2、? 不要用分布式缓存来移动大数量的工件或者非常大的工件(每个百兆字节)。分布式缓存的设计是用来分布小部分中等大小的工件,几兆到几十兆大小。

3、? 处理少量的数据时,不要创建成百上千个小作业式的工作流。

4、? 不直接从reducer或者mapper直接写入用户自定义的文件。Hadoop中当前实现文件写的功能是单线程的,这意味着当多个mapper/reducer试图写文件时,这个执行将被序列化。

5、? 不要创建这样的mapreduce功能,扫描一个Hbase表来创建一个新的Hbase表(或者写入同样的表中)? 。TableInputFormat是为基于具有时间敏感性的表扫描的Hbase和Mapreduce的实现。? 另一方面,Hbase写功能会因为Hbase表的分割而产生一定的写延迟。 结果是Region服务器会挂掉,然后你会失去一些数据。最好的解决方案是把作业分割成两个作业。一个扫描表并想HDFS中写入中间结果。另一个从HDFS读取数据并写入到HBase中。

来自:

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Linux 시스템에서 system() 함수의 사용법을 요약합니다. Linux 시스템에서 system() 함수의 사용법을 요약합니다. Feb 23, 2024 pm 06:45 PM

Linux에서의 system() 함수 요약 Linux 시스템에서 system() 함수는 명령줄 명령을 실행하는 데 사용할 수 있는 매우 일반적으로 사용되는 함수입니다. 이 기사에서는 system() 함수를 자세히 소개하고 몇 가지 구체적인 코드 예제를 제공합니다. 1. system() 함수의 기본 사용법은 다음과 같습니다. intsystem(constchar*command) 여기서 명령 매개변수는 문자입니다.

최고의 프론트엔드 엔지니어가 되기 위한 필수과정! 최고의 프론트엔드 엔지니어가 되기 위한 필수과정! Mar 25, 2024 pm 04:30 PM

최고의 프론트엔드 엔지니어가 되기 위한 필수과정! 인터넷의 급속한 발전과 대중화로 인해 프런트엔드 개발 산업이 점점 더 대중화되고 있습니다. 프론트엔드 엔지니어는 사용자와 제품을 이어주는 연결고리로서 기술 분야에서 중요한 역할을 담당하고 있으며, 탄탄한 기술력도 필요하지만, 산업 경쟁력을 유지하기 위해서는 끊임없이 학습하고 발전해야 합니다. 최고의 프론트 엔드 엔지니어가 되려면 기본 기술을 갖추는 것 외에도 일련의 필수 과정을 마스터해야 합니다. 1. HTML, CSS, JavaScript의 기본을 마스터하세요

설계라고 불리는 명령어 설계 및 디버깅 프로세스는 무엇입니까? 설계라고 불리는 명령어 설계 및 디버깅 프로세스는 무엇입니까? Jan 20, 2021 pm 03:44 PM

명령어 설계 및 디버깅 프로세스를 "프로그래밍"이라고 합니다. 특정 문제를 해결하기 위해 설계된 일련의 명령을 프로그램이라고 하며 프로그래밍은 특정 문제를 해결하기 위해 프로그램을 제공하는 프로세스이며 소프트웨어 구축 활동의 중요한 부분입니다. 프로그래밍 프로세스에는 문제 분석, 알고리즘 설계, 프로그램 작성, 테스트 및 디버깅과 같은 다양한 단계가 포함되어야 합니다.

C 언어 프로그래밍에는 어떤 소프트웨어가 사용됩니까? C 언어 프로그래밍에는 어떤 소프트웨어가 사용됩니까? Jan 27, 2024 pm 02:36 PM

C 언어 프로그래밍 소프트웨어: 1. Visual Studio 코드, 2. Dev-C++, 5. CLion, 7. Xcode; 자세한 소개: 1. Microsoft에서 개발한 무료 오픈 소스 코드 편집기인 Visual Studio Code는 C 언어를 포함한 여러 프로그래밍 언어를 지원하며 다양한 플러그인을 설치하여 C 언어 개발에 맞게 VS Code를 쉽게 구성할 수 있습니다.

C 언어 프로그래밍에 권장되는 필수 소프트웨어 C 언어 프로그래밍에 권장되는 필수 소프트웨어 Feb 19, 2024 pm 12:58 PM

컴퓨터 과학 분야에서 C 언어는 높은 효율성과 유연성을 지닌 프로그래밍 언어로 널리 사용됩니다. 따라서 C 언어 프로그래밍을 배우고 마스터하는 것은 많은 컴퓨터 전공자와 프로그래밍 매니아에게 필수 과정이 되었습니다. 그러나 C 언어를 효과적으로 배우고 사용하려면 몇 가지 필요한 소프트웨어 도구가 필수적입니다. 이 기사에서는 C 언어 프로그래밍에 권장되는 몇 가지 필수 소프트웨어를 소개합니다. 먼저 강력한 통합 개발 환경(IDE)인 Code::Blocks를 추천해 보겠습니다. 코드::블록

10가지 PHP 프레임워크 및 장점 분석 10가지 PHP 프레임워크 및 장점 분석 May 26, 2023 am 08:10 AM

PHP 기술의 지속적인 개발로 인해 점점 더 많은 PHP 프레임워크가 등장했습니다. PHP 프레임워크는 개발자가 웹 애플리케이션을 보다 빠르고 효율적으로 구축하는 데 도움이 될 수 있습니다. 그러나 다양한 프레임워크는 다양한 프로젝트에 적합하므로 각 프레임워크의 장점과 단점을 이해하는 것이 중요합니다. 이번 글에서는 PHP 프레임워크 10가지와 주요 장점을 소개하겠습니다. Laravel Laravel은 웹 애플리케이션을 구축하는 간단하고 우아한 방법을 제공하는 가장 인기 있는 PHP 프레임워크 중 하나입니다. 라라벨은 엄청난

C 언어 프로그래밍을 배우고 마스터하는 방법 C 언어 프로그래밍을 배우고 마스터하는 방법 Mar 18, 2024 pm 06:06 PM

C 언어 프로그래밍을 배우고 익히려면 구체적인 코드 예제가 필요합니다. C 언어는 효율적이고 유연합니다. 프로그래밍 분야에 종사하려는 사람들에게는 C 언어 프로그래밍을 배우고 익히는 것이 중요합니다. 이 기사에서는 독자의 이해를 돕기 위해 구체적인 코드 예제와 함께 C 언어 프로그래밍을 배우고 마스터하는 방법을 소개합니다. 1. 입문 단계에서 기본 구문 익히기: C 언어를 배우기 전에 변수, 데이터 유형, 연산자 등 기본적인 프로그래밍 개념을 숙지해야 합니다. C 언어의 구문은 비교적 간단합니다.

C 언어 프로그래밍: 프로그래밍의 문을 여는 열쇠 C 언어 프로그래밍: 프로그래밍의 문을 여는 열쇠 Feb 20, 2024 pm 06:39 PM

C 언어 프로그래밍: 프로그래밍의 문을 여는 열쇠 프로그래밍은 현대 사회에서 중요한 기술이며, C 언어는 프로그래밍 학습을 위한 최고의 진입점으로 인식됩니다. C 언어는 간단하고 배우기 쉬우며 운영 체제, 임베디드 시스템, 과학 컴퓨팅 및 기타 분야에서 널리 사용됩니다. - 다른 프로그래밍 언어에 대한 심층 학습. 이번 글에서는 C언어 프로그래밍의 중요성과 C언어를 배우는 방법을 소개하겠습니다. 첫째, C 언어 프로그래밍에는 광범위한 실제 응용 프로그램이 있습니다.

See all articles