hadoop—说到mapreduce,accumulo平板电脑是如何Map到hdfs块的

ymdaylpp  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(366)

如果我的环境设置如下:
-64mb hdfs块
-5台平板服务器
-每个平板服务器10个1gb大小的平板电脑
如果我有一张如下的table:
世界其他地区| f1 | q1 | v1
世界其他地区| f1 | q2 | v2
B排| f1 | q1 | v3
世界其他地区| f1 | q1 | v4
世界其他地区| f2 | q1 | v5
世界其他地区| f3 | q3 | v6
从这个小文档中,我知道所有关于rowa的数据都会放在一个平板电脑上,这个平板电脑可能包含也可能不包含关于其他行的数据。所以我的问题是:
平板电脑如何Map到datanode或hdfs块?显然,一个平板电脑被分割成多个hdfs块(本例中为8个),因此它们会存储在相同或不同的datanode上还是无关紧要?
在上面的示例中,关于rowc(或a或b)的所有数据是放在同一个hdfs块上还是放在不同的hdfs块上?
在执行map reduce作业时,我会得到多少Map器(每个hdfs块一个?还是每片?或者每台服务器?)
提前感谢您的所有建议。

ws51t4hk

ws51t4hk1#

要直接回答您的问题:
平板电脑如何Map到datanode或hdfs块?显然,一个平板电脑被分割成多个hdfs块(本例中为8个),因此它们会存储在相同或不同的datanode上还是无关紧要?
平板电脑像hdfs中的所有其他文件一样存储在块中。通常,您会在至少一个数据节点上看到单个文件的所有块(情况并非总是这样,但当我查看了较大文件的块位置时,似乎大多数情况下都是这样)
在上面的示例中,关于rowc(或a或b)的所有数据是放在同一个hdfs块上还是放在不同的hdfs块上?
取决于平板电脑的块大小( dfs.block.size 或者如果配置了accumulo属性 table.file.blocksize ). 如果块大小与tablet大小相同,那么显然它们将位于同一hdfs块中。否则,如果块的大小小于平板电脑的大小,那么它们是否在同一块中就是运气。
在执行map reduce作业时,我会得到多少Map器(每个hdfs块一个?还是每片?或者每台服务器?)
这取决于你给出的范围 InputFormatBase.setRanges(Configuration, Collection<Ranges>) .
如果您扫描整个表(-inf->+inf),那么您将得到一个与平板电脑数量相等的Map器(由disableautoadjustranges生成)。如果您定义特定的范围,您将得到不同的行为,这取决于您是否调用了 InputFormatBase.disableAutoAdjustRanges(Configuration) 是否:
如果您已经调用了这个方法,那么您将得到一个Map器范围定义。重要的是,如果你有一个从一个平板电脑开始到另一个平板电脑结束的范围,你会得到一个Map器来处理整个范围
如果您不调用此方法,并且您有一个跨越平板电脑的范围,则该范围覆盖的每个平板电脑都将有一个Map器

dfuffjeb

dfuffjeb2#

对于写入acumulo(数据摄取),运行mapreduce作业是有意义的,其中mapper输入是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将自动在平板电脑服务器上分发您的查询。如果您使用行作为原子记录,请使用(或扩展)wholerowiiterator并在您感兴趣的行范围内启动一个scanner(或batchscanner)。扫描仪将在平板电脑服务器上并行运行。您并不想直接从hdfs或mapreduce访问acumulo数据。
下面是一些示例代码,可以帮助您开始:

//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!

}

相关问题