Hadoop的Secondary Sorting

Jun 07, 2016 pm 04:35 PM
hadoop

这几天项目中使用Hadoop遇到一个问题,对于这样key-value的数据集合:id-biz object,对id进行partition(比如根据某特定的hash算法P),分为a份;使用数量为b的reducer,在reducer里面要使用第三方组件进行批量上传;上传成文件,文件数量为c,但是有两个要

Hadoop的Secondary Sorting 这几天项目中使用Hadoop遇到一个问题,对于这样key-value的数据集合:id-biz object,对id进行partition(比如根据某特定的hash算法P),分为a份;使用数量为b的reducer,在reducer里面要使用第三方组件进行批量上传;上传成文件,文件数量为c,但是有两个要求:

  • 上述a、b、c都相等,从而使得每个partition的数据最终都通过同一个reducer上传到同一个文件中去;
  • 每个reducer中上传的数据要求id必须有序。

最开始,想到的办法是,为了保证reducer中的批量上传,需要使得传入reducer的key变成一个经过hash算法A计算得到的index,这样就使得reducer中的value是一个包含了数个biz boject的集合的iterator,从而实现在一次reducer调用中批量上传并且提交。在批量上传提交的过程中,按照每上限个(例如1000个)文件提交一次的办法进行,以保证内存占用控制在一定范围内。

如何保证有序?

Hadoop在Reduce之前会自动对key排序,但是上述的情况实际是要根据id来给value排序(因为在map之后key已经变成index了),凡是涉及到要给value排序的,都要使用Hadoop的Secondary Sorting(见stackoverflow链接)。

Hadoop的Secondary Sorting

这张图其实已经可以说明,把value要排序的关键属性放到key里面去,这样key就变成了natural key(上述的index)和secondary key(上述的id)这样两部分组成的一个composite key。

1. Partition:Partition的时候仅使用natural key,保证所有index的数据都分在同一个partition;

JobConf.setPartitionClass(...);
ログイン後にコピー

2. Sort:真正给key排序的比较算法要对natural key和secondary key两部分进行排序,从而保证了key在id维度上是有序的,而id和value是一一对应的,因此value也就是有序的。

JobConf.setOutputKeyComparatorClass(...);
ログイン後にコピー

3. Group:grouping的比较算法忽略掉secondary key,只对natural keygrouping,使得属于同一index的数据都走到同一个reducer中去。

JobConf.setOutputValueGroupingComparatorClass(...);
ログイン後にコピー

总结一下,这样一来,在reducer中,input key是上述这样一个composite key对象,包含了index和id,input value是一个可以遍历的元素为原始biz object类型的对象。

后话:这是Secondary Sorting的过程,可以解决我的问题,但是后来发现,实际上,我的问题并不需要要用这样啰嗦的方式来解决:

  • 进入reducer的key只需要是id,Hadoop会对key自动排序;
  • partition策略不变,但是是在partitioner中计算index并根据它来partition;
  • 不需要单独指定Grouping和Sorting的算法;
  • 在reducer中建立一个大小为上限(如1000个)的容器对象p。

这样,既然对于每个partition的数据,都在同一个reducer中得到处理,而reducer中每次reduce方法彼此之间是根据id有序进行,那么就可以在每次调用时把数据放到p中,在p放满时提交一次即可。

测试通过。回头看看,真是刚开始的时候把问题想复杂了。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接《四火的唠叨》

你可能也喜欢:

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java エラー: Hadoop エラー、処理方法と回避方法 Java エラー: Hadoop エラー、処理方法と回避方法 Jun 24, 2023 pm 01:06 PM

Java エラー: Hadoop エラー、対処方法と回避方法 Hadoop を使用してビッグ データを処理する場合、タスクの実行に影響を与え、データ処理の失敗を引き起こす可能性のある Java 例外エラーが頻繁に発生します。この記事では、一般的な Hadoop エラーをいくつか紹介し、それらに対処および回避する方法を示します。 Java.lang.OutOfMemoryErrorOutOfMemoryError は、Java 仮想マシンのメモリ不足によって発生するエラーです。 Hadoop の場合

ビッグデータ処理に PHP と Hadoop を使用する方法 ビッグデータ処理に PHP と Hadoop を使用する方法 Jun 19, 2023 pm 02:24 PM

データ量が増加し続けるにつれて、従来のデータ処理方法ではビッグデータ時代がもたらす課題に対処できなくなります。 Hadoop は、ビッグ データ処理において単一ノード サーバーによって引き起こされるパフォーマンスのボトルネック問題を、分散ストレージと大量のデータの処理を通じて解決する、オープン ソースの分散コンピューティング フレームワークです。 PHP は、Web 開発で広く使用されているスクリプト言語であり、迅速な開発と容易なメンテナンスという利点があります。この記事では、ビッグデータ処理に PHP と Hadoop を使用する方法を紹介します。 HadoopとはHadoopとは

ビッグデータの分野での Java の応用を探る: Hadoop、Spark、Kafka、その他のテクノロジー スタックについて理解する ビッグデータの分野での Java の応用を探る: Hadoop、Spark、Kafka、その他のテクノロジー スタックについて理解する Dec 26, 2023 pm 02:57 PM

Java ビッグ データ テクノロジ スタック: Hadoop、Spark、Kafka などのビッグ データ分野における Java のアプリケーションを理解します。データ量が増加し続けるにつれて、今日のインターネット時代ではビッグ データ テクノロジが注目のトピックになっています。ビッグデータの分野では、Hadoop、Spark、Kafka などのテクノロジーの名前をよく耳にします。これらのテクノロジーは重要な役割を果たしており、広く使用されているプログラミング言語である Java もビッグデータの分野で大きな役割を果たしています。この記事では、Java のアプリケーション全般に​​焦点を当てます。

Beego で Hadoop と HBase を使用してビッグ データ ストレージとクエリを実行する Beego で Hadoop と HBase を使用してビッグ データ ストレージとクエリを実行する Jun 22, 2023 am 10:21 AM

ビッグデータ時代の到来に伴い、データの処理と保存の重要性がますます高まっており、大量のデータをいかに効率的に管理、分析するかが企業にとっての課題となっています。 Apache Foundation の 2 つのプロジェクトである Hadoop と HBase は、ビッグ データのストレージと分析のためのソリューションを提供します。この記事では、ビッグデータのストレージとクエリのために Beego で Hadoop と HBase を使用する方法を紹介します。 1. Hadoop と HBase の概要 Hadoop は、オープンソースの分散ストレージおよびコンピューティング システムです。

Linux に Hadoop をインストールする方法 Linux に Hadoop をインストールする方法 May 18, 2023 pm 08:19 PM

1: JDK1のインストール 以下のコマンドを実行して、JDK1.8のインストールパッケージをダウンロードします。 wget--no-check-certificatehttps://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-x64.tar.gz2. 次のコマンドを実行して、ダウンロードした JDK1.8 インストール パッケージを解凍します。 。 tar-zxvfjdk-8u151-linux-x64.tar.gz3. JDK パッケージを移動して名前を変更します。 mvjdk1.8.0_151//usr/java84. Java 環境変数を設定します。エコー'

PHP のデータ処理エンジン (Spark、Hadoop など) PHP のデータ処理エンジン (Spark、Hadoop など) Jun 23, 2023 am 09:43 AM

現在のインターネット時代において、大量のデータの処理は、あらゆる企業や機関が直面する必要がある問題です。 PHP は広く使用されているプログラミング言語であるため、データ処理の面でも時代に対応する必要があります。大量のデータをより効率的に処理するために、PHP 開発には Spark や Hadoop などのビッグ データ処理ツールが導入されています。 Spark は、大規模なデータ セットの分散処理に使用できるオープン ソース データ処理エンジンです。 Spark の最大の特徴は、高速なデータ処理速度と効率的なデータ ストレージです。

PHP を使用して大規模なデータ処理を実現します: Hadoop、Spark、Flink など。 PHP を使用して大規模なデータ処理を実現します: Hadoop、Spark、Flink など。 May 11, 2023 pm 04:13 PM

データ量が増加し続けるにつれ、大規模なデータ処理が企業が直面し、解決しなければならない問題となっています。従来のリレーショナル データベースではもはやこの需要を満たすことができず、大規模データの保存と分析には、Hadoop、Spark、Flink などの分散コンピューティング プラットフォームが最適な選択肢となっています。データ処理ツールの選択プロセスでは、開発と保守が簡単な言語として、PHP が開発者の間でますます人気が高まっています。この記事では、大規模なデータ処理に PHP を活用する方法とその方法について説明します。

RedisとHadoopの比較と適用シナリオ RedisとHadoopの比較と適用シナリオ Jun 21, 2023 am 08:28 AM

Redis と Hadoop はどちらも一般的に使用される分散データ ストレージおよび処理システムです。ただし、デザイン、パフォーマンス、使用シナリオなどの点で、この 2 つには明らかな違いがあります。この記事では、Redis と Hadoop の違いを詳細に比較し、適用可能なシナリオを検討します。 Redis の概要 Redis は、複数のデータ構造と効率的な読み取りおよび書き込み操作をサポートするオープンソースのメモリベースのデータ ストレージ システムです。 Redis の主な機能は次のとおりです。 メモリ ストレージ: Redis

See all articles