5

如果我的环境设置如下:
-64MB HDFS 块
-5 个平板服务器
-10 个平板,每个平板服务器大小为 1GB

如果我有如下表:
rowA | f1 | q1 | v1
行 A | f1 | q2 | v2

行 B | f1 | q1 | v3

行C | f1 | q1 | v4
行C | f2 | q1 | v5
行C | f3 | q3 | v6

从小文档中,我知道有关 rowA 的所有数据都将进入一个平板电脑,该平板电脑可能包含也可能不包含有关其他行的数据,即全部或不包含。所以我的问题是:

平板电脑如何映射到 Datanode 或 HDFS 块?显然,一个平板电脑被分成多个 HDFS 块(在这种情况下为 8 个),所以它们将存储在相同或不同的数据节点上还是无关紧要?

在上面的示例中,关于 RowC(或 A 或 B)的所有数据会进入同一个 HDFS 块还是不同的 HDFS 块?

在执行 map reduce 作业时,我会得到多少个映射器?(每个 hdfs 块一个?或每个平板电脑?或每个服务器?)

提前感谢您的任何和所有建议。

4

2 回答 2

3

直接回答您的问题:

平板电脑如何映射到 Datanode 或 HDFS 块?显然,一个平板电脑被分成多个 HDFS 块(在这种情况下为 8 个),所以它们将存储在相同或不同的数据节点上还是无关紧要?

平板电脑像 HDFS 中的所有其他文件一样存储在块中。您通常会在至少一个数据节点上看到单个文件的所有块(并非总是如此,但当我查看较大文件的块位置时似乎大部分情况都是如此)

在上面的示例中,关于 RowC(或 A 或 B)的所有数据会进入同一个 HDFS 块还是不同的 HDFS 块?

取决于您的平板电脑的块大小(dfs.block.size或者如果配置了 Accumulo 属性table.file.blocksize)。如果块大小与平板电脑大小相同,那么显然它们将位于同一个 HDFS 块中。否则,如果块大小小于平板电脑大小,那么它们是否在同一个块中就是运气。

在执行 map reduce 作业时,我会得到多少个映射器?(每个 hdfs 块一个?或每个平板电脑?或每个服务器?)

这取决于您给出的范围InputFormatBase.setRanges(Configuration, Collection<Ranges>)

如果您扫描整个表(-inf -> +inf),那么您将获得与平板电脑数量相等的映射器数量(由 disableAutoAdjustRanges 提供)。如果您定义特定范围,您将获得不同的行为,具体取决于您是否调用过InputFormatBase.disableAutoAdjustRanges(Configuration)

  1. 如果您调用了此方法,那么您将在每个定义的范围内获得一个映射器。重要的是,如果您有一个从一个平板电脑开始并在另一个平板电脑结束的范围,您将获得一个映射器来处理整个范围
  2. 如果您不调用此方法,并且您有一个跨越平板电脑的范围,那么您将为范围涵盖的每个平板电脑获得一个映射器
于 2012-12-05T01:31:33.780 回答
1

对于写入 Accumulo(数据摄取),运行 MapReduce 作业是有意义的,其中映射器输入是您在 HDFS 上的输入文件。您基本上会遵循 Accumulo 文档中的这个示例:

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

(本文的第四部分提供了有关将数据摄取到 Accumulo 的技术的更多背景信息:http: //ieee-hpec.org/2012/index_htm_files/byun.pdf

对于从 Accumulo 读取(数据查询),我不会使用 MapReduce。Accumulo/Zookeeper 将自动将您的查询分布在平板服务器上。如果您将行用作原子记录,请使用(或扩展)WholeRowIterator 并在您感兴趣的行范围内启动 Scanner(或 BatchScanner)。Scanner 将在您的平板电脑服务器上并行运行。您真的不想直接从 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 回答