cha*_*ick 5 hadoop mapreduce accumulo
如果我的环境设置如下:
-64MB HDFS阻止
-5平板电脑服务器
- 每台平板电脑服务器大小为1GB的平板电脑
如果我有一个如下表:
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块一个?还是每个平板电脑?或每个服务器?)
提前感谢您提出任何建议.
为了写入 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!
}
Run Code Online (Sandbox Code Playgroud)