如果我的环境设置如下:
-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块一个?还是每个平板电脑?或每个服务器?)
提前感谢您提出任何建议。
答案 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 :(得分: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!
}