Hadoop-Mapreduce(四)

複数のアプリケーションに参加する

  • マップ結合(分散キャッシュ分散キャッシュ)

    • 使用シナリオ:テーブルが非常に小さく、テーブルが非常に大きい。

    • 解決

      マップ側で複数のテーブルをキャッシュし、ビジネスロジックを事前に処理して、マップ側のビジネスを増やし、リデュース側のデータプレッシャーを減らし、データの偏りを可能な限り減らします。

    • 特定の方法:distributedcacheを使用する

      (1)マッパーのセットアップフェーズで、ファイルをキャッシュコレクションに読み込みます。

      (2)ドライバ関数にキャッシュをロードします。

      job.addCacheFile(new URI( "file:/ e:/mapjoincache/pd.txt")); //通常のファイルをタスク実行ノードにキャッシュします

      参加を減らす

  • 原理

    マップ側の主なタスクは、さまざまなテーブル(ファイル)のキーと値のペアにラベルを付けて、さまざまなソースのレコードを区別することです。次に、接続フィールドをキーとして使用し、残りと新しく追加されたフラグを値として使用して、最後に出力します。

    リデュース側の主な作業:リデュース側のキーとして接続フィールドを使用したグループ化が完了しました。各グループの異なるファイル(マップステージでマーク)からレコードを分離し、最後にマージするだけで済みます。 。

  • この方法のデメリット

    この方法の欠点は、明らかに、マップ上で大量のデータ送信を引き起こし、サイド、つまりシャッフルステージを減らし、効率が非常に低いことです。

    データクリーニング(ETL)

  • 概要概要

コアビジネスのMapreduceプログラムを実行する前に、ユーザーの要件を満たしていないデータをクリーンアップするために、最初にデータをクリーンアップする必要があることがよくあります。クリーニングプロセスは通常、reduceプログラムではなく、mapperプログラムを実行するだけで済みます。

カウンターアプリケーション

Hadoopは、複数のインジケーターを記述するために、ジョブごとにいくつかの組み込みカウンターを維持します。たとえば、一部のカウンタは処理されたバイト数とレコード数を記録し、ユーザーが処理された入力データの量と生成された出力データの量を監視できるようにします。

  • API
    • 列挙によるカウントカウント
enum MyCounter{
    
    MALFORORMED,NORMAL}

//对枚举定义的自定义计数器加1

context.getCounter(MyCounter.MALFORORMED).increment(1);

カウンターグループとカウンター名を使用してカウントします

context.getCounter("counterGroup", "countera").increment(1);
  • グループ名とカウンター名は自由に始めることができますが、意味を持っている方が良いです。
  • カウント結果は、プログラムの実行後にコンソールで確認されます。

MapReduce開発の概要

mapreduceプログラムを作成するときに考慮する必要があるいくつかの側面:

  • 入力データインターフェイス:InputFormat
默认使用的实现类是:TextInputFormat 

TextInputFormat的功能逻辑是:一次读一行文本,然后将该行的起始偏移量作为key,行内容作为value返回。

KeyValueTextInputFormat每一行均为一条记录,被分隔符分割为key,value。默认分隔符是tab(\t)。

NlineInputFormat按照指定的行数N来划分切片。

CombineTextInputFormat可以把多个小文件合并成一个切片处理,提高处理效率。

用户还可以自定义InputFormat。
  • 論理処理インターフェース:マッパー

    ユーザーは、ビジネス要件に応じて3つのメソッドを実装します。map()setup()cleanup()

  • パーティショナー

    HashPartitionerのデフォルトの実装があります。ロジックは、キーとnumReducesのハッシュ値に基づいてパーティション番号を返すことです; key.hashCode()&Integer.MAXVALUE%numReduces

    ビジネスに特別なニーズがある場合は、パーティションをカスタマイズできます。

  • 同等の並べ替え

    カスタムオブジェクトを出力のキーとして使用する場合は、WritableComparableインターフェイスを実装し、compareTo()メソッドを書き直す必要があります。

    部分的な並べ替え:最終出力で各ファイルを並べ替えます。

    すべての並べ替え:すべてのデータを並べ替えます。通常、Reduceは1つだけです。

    二次ソート:2つのソート条件があります。

  • コンバイナー

コンバイナは、プログラム実行の効率を改善し、io送信を減らすことができます。ただし、使用時に元のビジネス処理結果に影響を与えてはなりません。

  • エンドグループ化を減らす:Groupingcomparator

    reduceTaskが入力データ(パーティション内のすべてのデータ)を取得した後、最初にデータをグループ化する必要があります。デフォルトのグループ化の原則は同じキーであり、次にreduce()メソッドがkvデータのグループごとに1回呼び出され、このグループkvの最初のkvのキーは、reduceのキーにパラメーターとして渡され、このデータセットの値のイテレーターはreduce()のvaluesパラメーターに渡されます。

    上記のメカニズムを使用して、最大値を取得するためにグループ化するための効率的なロジックを実装できます。

    Beanオブジェクトをカスタマイズしてデータをカプセル化し、compareToメソッドを書き直して逆ソート効果を生成します。次に、Groupingcomparatorをカスタマイズして、Beanオブジェクトのグループ化ロジックをビジネスグループ化ID(注文番号など)に従ってグループ化に変更します。このように、取得したい最大値は、reduce()メソッドで渡されたキーです。

  • 論理処理インターフェース:レデューサー

    ユーザーはビジネスニーズに応じて3つのメソッドを実装します:reduce()setup()cleanup()

  • 出力データインターフェイス:OutputFormat

    デフォルトの実装クラスはTextOutputFormatであり、機能ロジックは次のとおりです。ターゲットテキストファイルに面する各KVを行として出力します。

SequenceFileOutputFormatは、その出力をシーケンスファイルとして書き込みます。出力を後続のMapReduceタスクの入力として使用する必要がある場合、その形式はコンパクトで簡単に圧縮できるため、これは適切な出力形式です。

ユーザーは、OutputFormatをカスタマイズすることもできます。

おすすめ

転載: blog.csdn.net/qq_45092505/article/details/105419171