当谈到mapreduce时,Accumulo平板电脑是如何映射到HDFS块的



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

如果我有一个如下表:
rowA|f1|q1|v1
rowA|f1 |q2|v2

rowB|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作业时,我会得到多少个mapper?(每个hdfs块一个?或者每个平板电脑一个?还是每个服务器一个?)

提前感谢您的任何建议。

直接回答您的问题:

平板电脑如何映射到Datanode或HDFS块?显然,一个平板电脑被拆分为多个HDFS块(本例中为8个),所以它们会存储在相同或不同的数据节点上吗?

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

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

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

执行映射减少作业时,我会得到多少个映射程序?(每个hdfs块一个?或者每个平板电脑一个?还是每个服务器一个?)

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

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

  1. 如果您调用了此方法,那么每个定义的范围将获得一个映射器。重要的是,如果你有一个从一个平板电脑开始到另一个平板的范围,你会得到一个映射器来处理整个范围
  2. 如果你不调用这个方法,并且你有一个跨越平板电脑的范围,那么你会为这个范围覆盖的每个平板电脑获得一个映射器

对于写入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,并在您感兴趣的行范围上启动扫描仪(或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!
}

最新更新