说到mapreduce,Accumulo平板电脑如何映射到HDFS块

时间:2012-12-04 22:08:43

标签: hadoop mapreduce accumulo

如果我的环境设置如下:
-64MB HDFS块
-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的所有数据都将转到一个平板电脑,其中可能包含或不包含有关其他行的数据,即全部或全部。所以我的问题是:

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

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

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

提前感谢您提出任何建议。

2 个答案:

答案 0 :(得分:3)

直接回答您的问题:

  

平板电脑如何映射到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 - &gt; + inf),那么您将获得一些等于平板电脑数量的地图制作者(由disableAutoAdjustRanges警告)。如果您定义了特定范围,则会根据您是否调用InputFormatBase.disableAutoAdjustRanges(Configuration)来获得不同的行为:

  1. 如果您调用了此方法,则每个范围定义一个映射器。重要的是,如果您的范围从一个平板电脑开始并以另一个平板电脑结束,那么您将获得一个映射器来处理整个范围
  2. 如果您没有调用此方法,并且您的范围超出平板电脑范围,那么您将为每个平板电脑获取一个映射器

答案 1 :(得分: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并在您感兴趣的行范围内启动扫描程序(或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!

}