5

私の環境が次のように設定されている場合:
-64MBHDFSブロック
-5タブレットサーバー-
タブレットサーバーごとにサイズ1GBの10タブレット

以下のようなテーブルがある場合:
rowA | f1 | q1 | v1
rowA | f1 | q2 | v2

rowB | f1 | q1 | v3

rowC | f1 | q1 | v4
rowC | f2 | q1 | v5
rowC | f3 | q3 | v6

小さなドキュメントから、rowAに関するすべてのデータが1つのタブレットに送られ、他の行に関するデータが含まれる場合と含まれない場合があります。つまり、すべてまたはまったく含まれていません。だから私の質問は:

タブレットはどのようにDatanodeまたはHDFSブロックにマッピングされますか?明らかに、1つのタブレットは複数のHDFSブロック(この場合は8)に分割されているので、それらは同じまたは異なるデータノードに保存されますか、それとも重要ではありませんか?

上記の例では、RowC(またはAまたはB)に関するすべてのデータが同じHDFSブロックまたは異なるHDFSブロックに送られますか?

マップリデュースジョブを実行するとき、何人のマッパーを取得しますか?(hdfsブロックごとに1つ?またはタブレットごとに?またはサーバーごとに?)

ありとあらゆる提案を事前に感謝します。

4

2 に答える 2

3

質問に直接答えるには:

タブレットはどのようにDatanodeまたはHDFSブロックにマッピングされますか?明らかに、1つのタブレットは複数のHDFSブロック(この場合は8)に分割されているので、それらは同じまたは異なるデータノードに保存されますか、それとも重要ではありませんか?

タブレットは、HDFSの他のすべてのファイルと同様にブロックに保存されます。通常、少なくとも1つのデータノードで1つのファイルのすべてのブロックが表示されます(これは常に当てはまるわけではありませんが、大きなファイルのブロックの場所を調べた場合はほとんど当てはまるようです)

上記の例では、RowC(またはAまたはB)に関するすべてのデータが同じHDFSブロックまたは異なるHDFSブロックに送られますか?

タブレットのブロックサイズによって異なります(dfs.block.sizeまたは、Accumuloプロパティが構成されている場合table.file.blocksize)。ブロックサイズがタブレットサイズと同じサイズの場合、明らかに同じHDFSブロックになります。そうでなければ、ブロックサイズがタブレットサイズよりも小さい場合、それらが同じブロックにあるかどうかについては持ち寄りです。

マップリデュースジョブを実行するとき、何人のマッパーを取得しますか?(hdfsブロックごとに1つ?またはタブレットごとに?またはサーバーごとに?)

これは、指定する範囲によって異なりますInputFormatBase.setRanges(Configuration, Collection<Ranges>)

テーブル全体をスキャンすると(-inf-> + inf)、タブレットの数に等しい数のマッパーが表示されます(disableAutoAdjustRangesによって作成されます)。特定の範囲を定義すると、呼び出したかどうかに応じて異なる動作が得られますInputFormatBase.disableAutoAdjustRanges(Configuration)

  1. このメソッドを呼び出した場合は、定義された範囲ごとに1つのマッパーを取得します。重要なのは、あるタブレットで始まり別のタブレットで終わる範囲がある場合、1つのマッパーでその範囲全体を処理できるようにすることです。
  2. このメソッドを呼び出さず、タブレットにまたがる範囲がある場合、範囲がカバーするタブレットごとに1つのマッパーを取得します
于 2012-12-05T01:31:33.780 に答える
1

Accumulo(データの取り込み)に書き込むには、MapReduceジョブを実行するのが理にかなっています。ここで、マッパー入力はHDFS上の入力ファイルです。基本的に、Accumuloのドキュメントから次の例に従います。

http://accumulo.apache.org/1.4/examples/mapred.html

(このペーパーのセクションIVは、Accumuloにデータを取り込むための手法に関する背景情報を提供します:http://ieee-hpec.org/2012/index_htm_files/byun.pdf

Accumulo(データクエリ)からの読み取りには、MapReduceは使用しません。Accumulo / Zookeeperは、クエリをタブレットサーバー間で自動的に分散します。行をアトミックレコードとして使用している場合は、WholeRowIteratorを使用(または拡張)して、目的の行の範囲でスキャナー(またはBatchScanner)を起動します。スキャナーはタブレットサーバー間で並行して実行されます。HDFSまたはMapReduceから直接Accumuloデータにアクセスする必要はありません。

始めるのに役立つサンプルコードを次に示します。

//some of the classes you'll need (in no particular order)...

import org.apache.accumulo.core.client.Connector;
import org.apache.accumulo.core.client.Instance;
import org.apache.accumulo.core.client.ZooKeeperInstance;
import org.apache.accumulo.core.Constants;
import org.apache.accumulo.core.client.Scanner;
import org.apache.accumulo.core.client.IteratorSetting;
import org.apache.accumulo.core.data.Key;
import org.apache.accumulo.core.data.Range;
import org.apache.accumulo.core.data.Value;
import org.apache.hadoop.io.Text;

//Accumulo client code...

//Accumulo connection
Instance instance = new ZooKeeperInstance( /* put your installation info here */ );
Connector connector = instance.getConnector(username, password);

//setup a Scanner or BatchScanner
Scanner scanner = connector.createScanner(tableName, Constants.NO_AUTHS);
Range range = new Range(new Text("rowA"), new Text("rowB"));
scanner.setRange(range);

//use a WholeRowIterator to keep rows atomic
IteratorSetting itSettings = new IteratorSetting(1, WholeRowIterator.class);
scanner.addScanIterator(itSettings);

//now read some data!
for (Entry<Key, Value> entry : scanner) {
    SortedMap<Key,Value> wholeRow = WholeRowIterator.decodeRow(entry.getKey(), entry.getValue());

    //do something with your data!

}
于 2012-12-04T23:51:11.293 に答える