HadoopのMapReduceの紹介

そして、典型的なバッチモードのMapReduce、地図の最後の機能を紹介し、説明した機能を削減します。

 

バッチモード

バッチモードは、大規模なデータ処理モードのパイオニアです。バッチの主要なオペレーティング・大規模な静的なデータセット、および処理されたデータ全体で結果を返します。バッチが完了するまでにデータセット全体のコンピューティング作業へのアクセスに最適です。

例えば、合計や平均値を算出する際に、データセットが全体として扱う必要があり、複数のコレクションとして記録することができません。これらの操作は、計算でその状態を維持するためのプロセスデータを必要とします。

タスクは、バッチモードでは、通常処理のために最も適している大量のデータを処理して、設計プロセスのバッチシステムは完全に十分な処理リソースを提供できるデータの量を考慮することが必要です。

極めて良好永続データの態様の多数に応じてバッチので、多くの場合、過去のデータを分析するために使用されます。

処理効率を向上させるために、大規模なデータセットのバッチ処理は、分散並列プログラムの助けを必要とします。

推奨読書の記事

ゼロベースのビッグデータクイックスタートチュートリアル

Javaの基礎コース

チュートリアルをWebベースのフロントエンド開発

ビッグデータ時代6つの事を知っている必要があります

ビッグデータフレームワークHadoopのトップ10の神話

ビッグデータ開発エンジニア給与30Kの概要を体験?

我々は問題が発生したビッグデータフレームワークのHadoop

伝統的な手順は、実質的に単一命令、単一データストリームが順次実行されます。与えられた時間内にタスクを完了することは困難であり、この手順は、心の人々の習慣に沿って、開発するのは比較的簡単ですが、パフォーマンスは、単一のコンピュータのパフォーマンスによって制限されます。

プログラムは、クラスタの多数からなる分散並列コンピュータ上で実行され、あなたは、データ処理タスクの完了と同じ時間同時に複数のコンピュータを使用して処理効率を改善し、新しいコンピュータ・クラスタ・コンピューティングパワーを追加することによって拡張することができることができます。

Googleは分散並列処理モードのMapReduceを達成した最初の、そして2004年には紙の仕方によって、その動作原理を発表し、HadoopのMapReduceは、それがオープンソース実装であるということです。HadoopのMapReduceはHDFS上で実行されています。

MapReduceの简释

我々はカードのかなり厚いスタックを知りたい場合は、図1に示すように、多くの心、最も直感的な方法は、これらのカードを一つずつチェックして、心がいくつあるかカウントする方法があります。このアプローチの欠点は、結果、非常に長い時間を取得し、特にカードケースの特に高い数で、遅すぎます。

どのように多くの心を見つけます
1どのように多くの心を見つけます

この方法は、ルールのMapReduceに従います。

  • ここでは、すべてのプレイヤーに割り当てられたカードのこのスタック。
  • 各プレイヤーという彼らの手にあるカードの枚数は、いくつかの心があるので、この番号までレポートを置きます。
  • 数字は最終的な結論を与えることを報告するすべてのプレイヤーを追加します。

明白な、MapReduceの方法は、すべてのプレイヤーが大幅に答えを得るためにスピードを加速することができ、心の数のカードの束を見つけるために、並行してカードをチェックするように。

MapReduceの方法は、分割のアイデアを使用する2つの古典的な機能をマージします。

1)マップ(地図)

同じ操作で要素のセットのそれぞれ。あなたは2を乗じた各セル内に形成するようにしたい場合は、この機能は別に操作マップ(地図)に属する各セルに適用されます。

2)単純化(低減)します

総合的な結果を返すために、コレクション内の要素をトラバース。フォーム内のすべての数字の合計を検索したい場合は、デジタルタスクの形式で出力の合計は(リデュース)、簡単に属します。

のは、データ分析の基本的な方法を用いて、全分散の心のMapReduceの例を見つけるためにカードの表面を再検討してみましょう。彼らは同時に動作するので、彼らはクラスターであるので、この場合、プレイヤーは、コンピュータを表します。

カードは、複数のプレイヤーに配布し、並列運転中に実行され、独自のカウント、同じ時間のカウントで、各プレーヤーを作ります。同じ問題を解決する過程でさまざまな人々の数は隣人がやっている知っている必要はありませんので、これは、分散に仕事をもたらします。

、実際には、各カードのマッピング作業の検査をカウントするために皆に知らせます。許可していない選手カードは、心を返還が、それらは数に簡素化wantedができます。

カードの配布があまりにも均一であることに注意してください。プレイヤーは他のプレイヤーよりもはるかに多くのカードに割り当てられている場合、彼はカードの数の全体の進捗に影響を与えるであろう、プロセスが他よりもはるかに遅いカードを数えることができます。

さらにまた、「何?。カードの束の平均値」として、より興味深い質問のいくつかを尋ねることができます 私たちは、「?すべてのカードの値であり、それが何であるかを」マージし、「どのように多くの私たちのカードの?」ことができ、これら二つの質問を回答します。この「および」「カードの数は、」平均値で除されていたであろうと。

MapReduceのアルゴリズムメカニズムは、カードの数よりもはるかに複雑であるために、しかし、主なアイデアは、すなわち分散計算によって大量のデータを分析するために、同じです。かどうかグーグル、Baiduは、テンセント、米航空宇宙局(NASA)、または小さなスタートアップ企業は、MapReduceは現在、インターネット・レベルのデータの分析の主流の方法です。

MapReduceのの基本的な考え方

基本的な考え方は、3つのレベルで構成され、大量のデータを処理するためのMapReduceを使用します。まず、大規模データのための分割統治のアイデアを取ります。互いに並列処理のビッグデータ・コンピューティングの依存関係を持っていない、最も自然な方法は、分割統治の戦略を取ることです。

第二に、イデオロギー分割統治は抽象モデルをバラ。この欠陥のためのMPI並列コンピューティングなどの高レベルの並列プログラミングモデルの不足を克服するために、MapReduceは地図で高レベルの並列プログラミングの抽象化モデルを提供し、二つの機能を削減し、関数型言語のLispのの考え方に描画します。

最後に、イデオロギー分割ルールレベル上昇アーキテクチャ、システムレイヤの実装の詳細を非表示にするプログラマのための統一アーキテクチャ。

このようユニファイドコンピューティングフレームワークのサポートの欠如としてMPI並列計算方法は、プログラマがプログラマは非表示、この目的のため、MapReduceの設計の結果、エラー回復、および他の多くの詳細を、収集、配布、データストレージ部門を考慮する必要があり、統一計算フレームワークを提供します取引のほとんどのシステム・レベルの詳細。

1.ビッグデータ処理のアイデア:分割統治

最初の重要な問題は、同時に計算分割サブタスクまたはデータブロックを計算するために、並列コンピューティング・タスクまたはデータを分割する方法です。しかし、フロントとリアのコンピューティング・データ項目との間に強く依存して存在する問題は、唯一のシリアル演算、分割できません。

タスクまたは不可分計算されたデータ間の依存性のために互いに並列計算することができません。大規模なデータが同じ計算プロセスとデータブロックに分割することができ、データ依存性は、これらのデータブロックの間に存在する場合、最良の方法は、並列演算の処理速度を増加させることです。

例えば、図に示すように、大きすぎるは、コンピュータメモリ内に配置されるようにしながら、巨大な二次元データが存在すると仮定する。2、今立方体の各要素の要求を。処置は、各要素について同じであり、データ要素間のデータ依存関係が存在しないため、これは、並列処理コンピュータのグループによって、サブアレイに分割考えることができます。

思考を分割し、征服のMapReduce
図2のMapReduceイデオロギー分割ルール

マップや関数の機能を削減します。2.抽象モデルを構築

関数型プログラミング言語Lispはリスト処理言語です。Lispは様々な処理操作、要素のリスト全体に対して実行することができる定義します。例えば、(#を追加(1 2 3 4)#(4 3 2 1))結果は、#(5555)です。

Lispはまた、提供し、操作が機能を削減地図機能に似ています。以下のような:

  • (map ‘vector #+ #(1 2 3 4 5) #(10 11 12 13 14)),通过定义加法 Map 运算将两个向量相加产生的结果为 #(11 13 15 17 19)。
  • (reduce #’ + #(11 13 15 17 19)) 通过加法归并产生的累加结果为 75。

Map 函数对一组数据元素进行某种重复式的处理,Reduce 函数对 Map 函数的中间结果进行某种进一步的结果整理。

MapReduce 通过借鉴 Lisp 的思想,定义了 Map 和 Reduce 两个抽象的编程接口,为程序员提供了一个清晰的操作接口抽象描述,由用户去编程实现。

1) Map:<k1,v1>List(<K2,V2>)

输入:键值对<k1,v1>表示的数据。

处理:数据记录将以“键值对”形式传入 Map 函数;Map 函数将处理这些键值对,并以另一种键值对形式输出中间结果 List(<K2,V2>)。

输出:键值对List(<K2,V2>)示的一组中间数据。

2) Reduce:<K2,List(V2)>→List(<K3,V3>)

输入:由 Map 输出的一组键值对 List(<K2,V2>)将被进行合并处理,同样主键下的不同数值会合并到一个列表List(V2)中,故 Reduce 的输入为<K2,List(V2)>。

处理:对传入的中间结果列表数据进行某种整理或进一步的处理,并产生最终的输出结果List(<K3,V3>)。

输出:最终输出结果List(<K3,V3>)。

基于 MapReduce 的并行计算模型如图 3 所示。各个 Map 函数对所划分的数据并行处理,从不同的输入数据产生不同的中间结果。

各个 Reduce 函数也各自并行计算,负责处理不同的中间结果。进行 Reduce 函数处理之前,必须等到所有的 Map 函数完成。

因此,在进入 Reduce 函数前需要有一个同步屏障;这个阶段也负责对 Map 函数的中间结果数据进行收集整理处理,以便 Reduce 函数能更有效地计算最终结果,最终汇总所有 Reduce 函数的输出结果即可获得最终结果。

モデルベースの並列コンピューティングのMapReduce
图 3  基于MapReduce的并行计算模型

3)上升到架构:并行自动化并隐藏底层细节

MapReduce 提供了一个统一的计算框架,来完成计算任务的划分和调度,数据的分布存储和划分,处理数据与计算任务的同步,结果数据的收集整理,系统通信、负载平衡、计算性能优化、系统结点出错检测和失效恢复处理等。

MapReduce 通过抽象模型和计算框架把需要做什么与具体怎么做分开了,为程序员提供了一个抽象和高层的编程接口和框架,程序员仅需要关心其应用层的具体计算问题,仅需编写少量的处理应用本身计算问题的程序代码。

与具体完成并行计算任务相关的诸多系统层细节被隐藏起来,交给计算框架去处理:从分布代码的执行,到大到数千个,小到单个的结点集群的自动调度使用。

MapReduce 计算架构提供的主要功能包括以下几点。

1)任务调度

提交的一个计算作业(Job)将被划分为很多个计算任务(Tasks)。

任务调度功能主要负责为这些划分后的计算任务分配和调度计算结点(Map 结点或 Reduce 结点),同时负责监控这些结点的执行状态,以及 Map 结点执行的同步控制,也负责进行一些计算性能优化处理。例如,对最慢的计算任务采用多备份执行,选最快完成者作为结果。

2)数据/程序互定位

为了减少数据通信量,一个基本原则是本地化数据处理,即一个计算结点尽可能处理其本地磁盘上分布存储的数据,这实现了代码向数据的迁移。

当无法进行这种本地化数据处理时,再寻找其他可用结点并将数据从网络上传送给该结点(数据向代码迁移),但将尽可能从数据所在的本地机架上寻找可用结点以减少通信延迟。

3)出错处理

在以低端商用服务器构成的大规模 MapReduce 计算集群中,结点硬件(主机、兹盘、内存等)出错和软件有缺陷是常态。因此,MapReduce 架构需要能检测并隔离出错结点,并调度分配新的结点接管出错结点的计算任务。

4)分布式数据存储与文件管理

海量数据处理需要一个良好的分布数据存储和文件管理系统作为支撑,该系统能够把海量数据分布存储在各个结点的本地磁盘上,但保持整个数据在逻辑上成为一个完整的数据文件。

为了提供数据存储容错机制,该系统还要提供数据块的多备份存储管理能力。

5)Combiner 和 Partitioner

为了减少数据通信开销,中间结果数据进入 Reduce 结点前需要进行合并(Combine)处理,即把具有同样主键的数据合并到一起避免重复传送。

一个 Reduce 结点所处理的数据可能会来自多个 Map 结点,因此,Map 结点输出的中间结果需使用一定的策略进行适当的划分(Partition)处理,保证相关数据发送到同一个 Reduce 结点上。

Map 函数和 Reduce 函数

MapReduce 是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由大规模通用服务器组成的大型集群上,并以一种可靠容错的方式并行处理 TB 级别的数据集。

MapReduce 将复杂的、运行在大规模集群上的并行计算过程高度地抽象为两个简单的函数:Map 函数和 Reduce 函数。

简单来说,一个 Map 函数就是对一些独立元素组成的概念上的列表的每一个元素进行指定的操作。

例如,对一个员工薪资列表中每个员工的薪资都增加 10%,就可以定义一个“加 10%” 的 Map 函数来完成这个任务,如图 4 所示。

事实上,每个元素都是被独立操作的,原始列表没有被更改,而是创建了一个新的列表来保存新的答案。这就是说,Map 函数的操作是可以高度并行的,这对高性能要求的应用,以及并行计算领域的需求非常有用。

HadoopのMapReduceの者とHDFSクラスタアーキテクチャ
图 4  Hadoop 的 MapReduce 与 HDFS 集群架构

在图 4 中,把 18 个员工的表分成 3 个模块,每个模块包括 6 个员工,由一个 Map 函数负责处理,这样就可以比顺序处理的效率提高 3 倍。而在每一个 Map 函数中,对每个员工薪资的处理操作都是完全相同的,即增加 10%。

Reduce 函数的操作指的是对一个列表的元素进行适当的合并。

例如,如果想知道员工的平均薪资是多少?就可以定义一个 Reduce 函数,通过让列表中的元素跟与自己相邻的元素相加的方式,可把列表数量减半,如此递归运算直到列表只剩下一个元素,然后用这个元素除以人数,就得到了平均薪资。

虽然 Reduce 函数不如 Map 函数那么并行,但是因为 Reduce 函数总是有一个简单的答案,并且大规模的运算相对独立,所以 Reduce 函数在高度并行环境下也很有用。

Map 函数和 Reduce 函数都是以 <key,value>作为输入的,按一定的映射规则转换成另一个或一批 <key,value> 进行输出,如表 1 所示。

函数 输入 输出 注解
Map Map<k1,V1> List(<k1,V2>) 将输入数据集分解成一批<key,value>对,然后进行处理;每一个<key,value>输入,Map 会输出一批<K2,V2>
Reduce <k2,List(V2)> <K3,V3> MapReduce 框架会把 Map 的输出,按 key 归类为 <K2,List(V2)>。List(V2) 是一批属于同一个 K2 的 value

Map 函数的输入数据来自于 HDFS 的文件块,这些文件块的格式是任意类型的,可以是文档,可以是数字,也可以是二进制。文件块是一系列元素组成的集合,这些元素也可以是任意类型的。

Map 函数首先将输入的数据块转换成 <key,Value> 形式的键值对,键和值的类型也是任意的。

役割の地図機能を1つにマッピングのそれぞれにキー入力するか、新しいキーの数です。キー内のキーのキー入力におけるキーの出力が異なっていてもよいです。

前者がリストされ、同じではないマップ関数の入力形式と出力形式は関数を減らしことに留意されたい(<K2、V2>)<K2、リスト(V2)>フォーマットであるフォーマット、。そのため、マップ関数の出力は、reduce関数として直接入力することはできません。

地図MapReduceの出力フレームは、すべての<K2、リスト(V2)>にマージ、フォーマットの同じキーを持つキー、ファンクションキーに従って分類され、リスト(V2)は同じにグループ属するされますK2の値。

関数は同じキー組み合わせ何らかの方法で入力の値、キー値、典型的には1つのファイルに結合された出力の出力処理と一連のタスクである減らします。

処理効率は、数を減らし改善するために、ユーザは、タスクを減らして指定することができ、即ち、完了するために複数の同時削減縮小操作があってもよいです。

ルールセットを減らしに従って処理各タスクへの各キー入力へのMapReduceフレームワーク。この場合には、MapReduceの意志を出力複数のファイル。

これらのファイルは次のMapRedueタスクへの入力として使用される可能性があるため、一般的に、これらは、出力ファイルをマージする必要はありません。

おすすめ

転載: blog.csdn.net/yuidsd/article/details/92010901