cld*_*ldo 49 hadoop hbase bigdata
现在我ResultScanner像这样实现行计数
for (Result rs = scanner.next(); rs != null; rs = scanner.next()) {
number++;
}
Run Code Online (Sandbox Code Playgroud)
如果数据达到数百万计算时间很大.我想实时计算我不想使用Mapreduce
如何快速计算行数.
小智 96
在HBase中使用RowCounter RowCounter是一个mapreduce作业,用于计算表的所有行.这是一个很好的实用程序,可用作健全性检查,以确保如果存在元数据不一致的问题,HBase可以读取表的所有块.它将在一个进程中运行mapreduce,但如果你有一个MapReduce集群可以利用它,它将运行得更快.
$ hbase org.apache.hadoop.hbase.mapreduce.RowCounter <tablename>
Usage: RowCounter [options]
<tablename> [
--starttime=[start]
--endtime=[end]
[--range=[startKey],[endKey]]
[<column1> <column2>...]
]
Run Code Online (Sandbox Code Playgroud)
Nee*_*thu 31
您可以使用hbase中的count方法来计算行数.但是,计算一个大表的行可以是slow.count'tablename'[interval]
返回值是行数.
此操作可能需要很长时间(运行'$ HADOOP_HOME/bin/hadoop jar hbase.jar rowcount'来运行计数mapreduce作业).默认情况下,每1000行显示当前计数.可以可选地指定计数间隔.默认情况下,计数扫描会启用扫描缓存.默认缓存大小为10行.如果行的大小很小,则可能需要增加此参数.
例子:
hbase> count 't1'
hbase> count 't1', INTERVAL => 100000
hbase> count 't1', CACHE => 1000
hbase> count 't1', INTERVAL => 10, CACHE => 1000
Run Code Online (Sandbox Code Playgroud)
也可以在表引用上运行相同的命令.假设您有对表't1'的引用,相应的命令将是:
hbase> t.count
hbase> t.count INTERVAL => 100000
hbase> t.count CACHE => 1000
hbase> t.count INTERVAL => 10, CACHE => 1000
Run Code Online (Sandbox Code Playgroud)
如果RowCounter由于某种原因无法使用,那么这两个过滤器的组合应该是获得计数的最佳方式:
FirstKeyOnlyFilter() AND KeyOnlyFilter()
Run Code Online (Sandbox Code Playgroud)
这FirstKeyOnlyFilter将导致扫描程序仅返回它找到的第一个列限定符,而不是扫描程序返回表中的所有列限定符,这将最小化网络带宽.如果只选择一个列限定符返回呢?如果您可以保证每行都存在列限定符,那么这将起作用,但如果不是这样,则会得到不准确的计数.
这KeyOnlyFilter将导致扫描程序仅返回列族,并且不会返回列限定符的任何值.这进一步降低了网络带宽,在一般情况下,网络带宽不会减少很多,但是可能存在边缘情况,其中前一个滤波器选择的第一列恰好是一个非常大的值.
我试过玩,scan.setCaching但结果到处都是.也许它会有所帮助.
我在开始和停止之间有1600万行,我做了以下伪经验测试:
With FirstKeyOnlyFilter and KeyOnlyFilter activated:
With caching not set (i.e., the default value), it took 188 seconds.
With caching set to 1, it took 188 seconds
With caching set to 10, it took 200 seconds
With caching set to 100, it took 187 seconds
With caching set to 1000, it took 183 seconds.
With caching set to 10000, it took 199 seconds.
With caching set to 100000, it took 199 seconds.
With FirstKeyOnlyFilter and KeyOnlyFilter disabled:
With caching not set, (i.e., the default value), it took 309 seconds
我没有费心去做这个适当的测试,但似乎很清楚,FirstKeyOnlyFilter并且KeyOnlyFilter很好.
此外,这个特定表格中的单元格非常小 - 所以我认为过滤器在不同的桌子上会更好.
这是一个Java代码示例:
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.filter.KeyOnlyFilter;
import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.filter.RegexStringComparator;
public class HBaseCount {
public static void main(String[] args) throws IOException {
Configuration config = HBaseConfiguration.create();
HTable table = new HTable(config, "my_table");
Scan scan = new Scan(
Bytes.toBytes("foo"), Bytes.toBytes("foo~")
);
if (args.length == 1) {
scan.setCaching(Integer.valueOf(args[0]));
}
System.out.println("scan's caching is " + scan.getCaching());
FilterList allFilters = new FilterList();
allFilters.addFilter(new FirstKeyOnlyFilter());
allFilters.addFilter(new KeyOnlyFilter());
scan.setFilter(allFilters);
ResultScanner scanner = table.getScanner(scan);
int count = 0;
long start = System.currentTimeMillis();
try {
for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
count += 1;
if (count % 100000 == 0) System.out.println(count);
}
} finally {
scanner.close();
}
long end = System.currentTimeMillis();
long elapsedTime = end - start;
System.out.println("Elapsed time was " + (elapsedTime/1000F));
}
}
这是一个pychbase代码示例:
from pychbase import Connection
c = Connection()
t = c.table('my_table')
# Under the hood this applies the FirstKeyOnlyFilter and KeyOnlyFilter
# similar to the happybase example below
print t.count(row_prefix="foo")
这是一个Happybase代码示例:
from happybase import Connection
c = Connection(...)
t = c.table('my_table')
count = 0
for _ in t.scan(filter='FirstKeyOnlyFilter() AND KeyOnlyFilter()'):
count += 1
print count
感谢@Tuckr和@KennyCason的提示.
在HBASE中计算行的简单,有效和高效的方法:
无论何时插入行触发此API,都会增加该特定单元格.
Htable.incrementColumnValue(Bytes.toBytes("count"), Bytes.toBytes("details"), Bytes.toBytes("count"), 1);
Run Code Online (Sandbox Code Playgroud)检查该表中存在的行数.只需对该特定行'计数'使用"获取"或"扫描"API即可.
通过使用此方法,您可以在不到一毫秒的时间内获得行计数.
小智 5
要在适当的 YARN 集群上计算 Hbase 表记录计数,您还必须设置 map reduce 作业队列名称:
hbase org.apache.hadoop.hbase.mapreduce.RowCounter -Dmapreduce.job.queuename= < Your Q Name which you have SUBMIT access>
< TABLE_NAME>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
95265 次 |
| 最近记录: |