hadoopファイルのシーケンス化


目次
    1、なぜシーケンス化するのですか.
    2、シーケンス化とは?
    3、なぜJavaのシーケンス化をしないのですか?
    4、なぜシーケンス化がHadoopにとって重要なのか.
    5、Hadoopでどのようなシーケンス化関連インタフェースを定義しますか?
    6、HadoopカスタムWritableインタフェース
 
1、なぜシーケンス化するのですか.
     一般的に、「生きている」オブジェクトはメモリにしか存在せず、電源を切ると電源が切れます.また、「アクティブ」オブジェクトはローカルのプロセスでのみ使用でき、ネットワーク上の別のコンピュータに送信できません.しかし、シーケンス化は「アクティブ」オブジェクトを格納し、「アクティブ」オブジェクトをリモートコンピュータに送信することができる.
2、シーケンス化とは?
     シーケンス化とは、オブジェクト(インスタンス)をバイトストリーム(文字配列)に変換することです.逆シーケンス化とは、バイトストリームをオブジェクトに変換する逆プロセスです.そこで、「生きている」オブジェクトをファイルに格納したい場合は、このバイトを格納すればよいし、「生きている」オブジェクトをリモートホストに送信したい場合は、このバイトを送信すればよい.オブジェクトが必要な場合は、逆シーケンス化をして、オブジェクトを「復活」させることができる.
     オブジェクトをファイルにシーケンス化して保存し、用語は「永続化」とも呼ばれます.オブジェクトをリモートコンピュータにシーケンス化して送信します.用語は「データ通信」です.
3、なぜJavaのシーケンス化をしないのですか?
     Javaのシーケンス化メカニズムの欠点は,計算量のオーバーヘッドが大きく,シーケンス化の結果体積が大きすぎて,オブジェクトサイズの数倍から10倍に達することがあることである.その参照メカニズムは、大きなファイルが分割できないという問題も発生します.これらの欠点はJavaのシーケンス化メカニズムがHadoopにとって不適切であることをもたらした.そこでHadoopは独自のシーケンス化メカニズムを設計した.
4、なぜシーケンス化がHadoopにとって重要なのか.
Hadoopがクラスタ間で通信やRPC呼び出しを行う場合は,シーケンス化が必要であり,シーケンス化が速く,体積が小さく,占有帯域幅が小さいことが要求されるからである.だからHadoopのシーケンス化機構を理解しなければならない.
シーケンス化と逆シーケンス化は、分散型データ処理の分野でよく見られる:プロセス通信と永続的なストレージ.しかしながら、Hadoopにおける各ノードの通信は、リモートコール(RPC)によって実現されるので、RPCシーケンス化には以下のような特徴が要求される. コンパクト:コンパクトなフォーマットにより、ネットワーク帯域幅を十分に活用できます.帯域幅はデータセンターで最も希少なリソースです. 高速:プロセス通信は分散システムのスケルトンを形成するため、シーケンス化と逆シーケンス化のパフォーマンスオーバーヘッドを最小限に抑えることが基本です. 拡張性:プロトコルは新しいニーズの変化を満たすために、クライアントとサーバを制御する過程で、直接相応のプロトコルを導入する必要があります.これらは新しいプロトコルで、元のシーケンス化方式は新しいプロトコルメッセージをサポートすることができます. 相互運用:異なる言語で書かれたクライアントとサービス側のインタラクションをサポート
5、Hadoopでどのようなシーケンス化関連インタフェースを定義しますか?
  Hadoopでは、WritableインタフェースとComparableインタフェースの2つのシーケンス化関連インタフェースが定義されています.この2つのインタフェースは、1つのインタフェースWritable Comparableに統合できます.
  次に、この2つのシーケンス化インタフェースについて説明します.
  • Writableインタフェース
  • Writableインタフェースを実装したすべてのクラスをシーケンス化および逆シーケンス化できます.Writableインタフェースには、write(DataOutput out)とreadFields(DataInput in)の2つのメソッドが定義されています.writeは、オブジェクトの状態をバイナリ形式のDataOutputストリームに書き込むために使用され、readFieldsは、バイナリ形式のDataInputストリームからオブジェクトの状態を読み出すために使用されます.
     1 package org.apache.hadoop.io;
     2 
     3 import java.io.DataOutput;
     4 
     5 import java.io.DataInput;
     6 
     7 import java.io.IOException;
     8 
     9 import org.apache.hadoop.classification.InterfaceAudience;
    10 
    11 import org.apache.hadoop.classification.InterfaceStability;
    12 
    13 public interface Writable {
    14     /**
    15 
    16     *                 out 
    17 
    18     */
    19 
    20     void write(DataOutput out) throws IOException;
    21     
    22     /**
    23     
    24     *     in             
    25     
    26     */
    27 
    28     void readFields(DataInput in) throws IOException;
    29 }

    特定のWritableについて、どのような操作を行うことができますか?
    2つの一般的な操作があります.値の割り当てと値の取得です.ここでは、IntWritableを例に挙げて説明します(IntWritableはJavaのintタイプのパッケージです).
    1)set()関数でIntWritableの値を設定する
      IntWritable value = new IntWritable();
      value.set(588)
      同様に、コンストラクション関数を使用して値を割り当てることもできます.
      IntWritable value = new IntWritable(588);
    2)get()関数でIntWritableの値を取得します.
     int result = value.get();//ここで取得した値は588です.
  • Comparableインタフェース
  • Comparableが実装されているすべてのオブジェクトは、同じタイプのオブジェクトとサイズを比較できます.インタフェースは次のように定義されます.
     1 package java.lang;
     2 
     3 import java.util.*;
     4 
     5 public interface Comparable<T> {
     6     /**
     7     *  this     o    ,  :       ,    ,     
     8     */
     9     public int compareTo(T o);
    10 }

    6、HadoopカスタムWritableインタフェース
    Hadoopは、IntWritable、LongWritableなどの一連のWritable実装を備えていますが、簡単なデータ型を満たすことができます.ただし、複雑なデータ型では、独自のカスタムインプリメンテーションが必要になる場合があります.Writableをカスタマイズすることで、バイナリ表示とソート順を完全に制御できます.
    既存のHadoop Writableアプリケーションは最適化されていますが、より複雑な構造に対処するためには、既存のタイプではなく新しいWritableタイプを作成することが望ましいです.次に、以下に示すように、Writableタイプをカスタマイズする方法を学びます.
     1 import java.io.*;
     2 
     3 import org.apache.hadoop.io.*;
     4 
     5 /** 
     6 * @ProjectName Serialize
     7 * @ClassName TextPair
     8 * @Description    Writable  TextPair
     9 * @Author    
    10 * @Date 2016-04-16 23:59:19
    11 */
    12 public class TextPair implements WritableComparable<TextPair> {
    13     // Text        
    14     private Text first;
    15     // Text        
    16     private Text second;
    17     
    18     public TextPair() {
    19         set(new Text(), new Text());
    20     }
    21 
    22     public TextPair(String first, String second) {
    23         set(new Text(first), new Text(second));
    24     }
    25 
    26     public TextPair(Text first, Text second) {
    27         set(first, second);
    28     }
    29 
    30     public void set(Text first, Text second) {
    31         this.first = first;
    32         this.second = second;
    33     }
    34 
    35     public Text getFirst() {
    36         return first;
    37     }
    38 
    39     public Text getSecond() {
    40         return second;
    41     }
    42     
    43     @Override
    44     //                 out 
    45     public void write(DataOutput out) throws IOException {
    46         first.write(out);
    47         second.write(out);
    48     }
    49     
    50     @Override
    51     //     in             
    52     public void readFields(DataInput in) throws IOException {
    53         first.readFields(in);
    54         second.readFields(in);
    55     }
    56 
    57     @Override
    58     public int hashCode() {
    59         return first.hashCode() * 163 + second.hashCode();
    60     }
    61 
    62     @Override
    63     public boolean equals(Object o) {
    64         if (o instanceof TextPair) {
    65             TextPair tp = (TextPair) o;
    66             return first.equals(tp.first) && second.equals(tp.second);
    67         }
    68         return false;
    69     }
    70 
    71     @Override
    72     public String toString() {
    73         return first + "\t" + second;
    74     }
    75 
    76     //   
    77     @Override
    78     public int compareTo(TextPair tp) {
    79         int cmp = first.compareTo(tp.first);
    80         if (cmp != 0) {
    81             return cmp;
    82         }
    83         return second.compareTo(tp.second);
    84     }
    85 }

    TextPairオブジェクトには、2つのTextインスタンス変数(firstおよびsecond)、関連するコンストラクション関数、getメソッド、setメソッドがあります.すべてのWritableインプリメンテーションには、MapReduceフレームワークがインスタンス化され、readFields()メソッドがフィールドに埋め込まれるようにデフォルトのコンストラクション関数が必要です.Writableインスタンスは変更しやすく、頻繁に再利用されるため、write()またはreadFields()メソッドでオブジェクトを割り当てることはできるだけ避けるべきです.
    各Textオブジェクト自体に委任することにより,TextPairのwrite()メソッドは出力ストリーム中の各Textオブジェクトを順次シーケンス化する.同様に、Textオブジェクト自体に委任することによって、readFields()は入力ストリームのバイトを逆シーケンス化する.DataOutputインタフェースとDataInputインタフェースには、Javaの基本タイプをシーケンス化および逆シーケンス化するための豊富な方法があるため、一般的にはWritableオブジェクトのデータ転送フォーマットを完全に制御することができる.
    Java用に書かれた任意の値オブジェクトと同様に、java.lang.ObjectのhashCode()メソッド、equals()メソッド、toString()メソッドが書き換えられます.HashPartitionerはhashcode()メソッドを使用してreduceパーティションを選択するので、reduce関数のパーティションがサイズ的に相当することを決定するために良いハッシュ関数を書くことを確保する必要があります.
    TextPairはWritableComparableの実装なので、comparareTo()メソッドの実装を提供し、私たちが望んでいるソートを追加します.Stringを1つずつソートします.
    もし、このブログを読むと少し収穫があると思ったら、右下の「お勧め」をクリックしてみてください.もし、私の新しいブログをもっと簡単に見つけたいなら、左下の「私に注目」をクリックしてみてください.もし、私のブログの内容に興味があれば、引き続き私の後続のブログに注目してください.私は【劉超★ljc】です.
    本文の著作権は著者とブログ園に共有され、転載を歓迎するが、著者の同意を得ずにこの声明を保留し、文章のページの明らかな位置で原文の接続を与えなければならない.そうしないと、法律責任を追及する権利を保留する.