hbase scan 的一个奇怪问题

shibbin 2014-01-14 10:25:48

Scan s = new Scan();
System.out.print(s.getMaxResultSize()+" ");
s.setMaxResultSize(100);
System.out.println(s.getMaxResultSize());
ResultScanner ss = table.getScanner(s);
int i =0;
for(Result r:ss){
//....
i++;
}
ss.close();
System.out.println("result :" + i);


输出是:
-1 100
result: 34556

为什么呢,scan设置了结果大小最多为100,但是遍历ResultScanner却远远超过了100??
...全文
726 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zippooooo 2014-01-16
  • 打赏
  • 举报
回复
引用 6 楼 hqshaozhu 的回复:
[quote=引用 5 楼 shibbin 的回复:] 嗯,这个办法我想过,可能是现在唯一可行的了,不足是无法自定义大小,因为rowkey是随机数 [quote=引用 4 楼 tntzbzc 的回复:] [quote=引用 3 楼 shibbin 的回复:] 我是要把scan作为mapreduce的输入,但是我的表太大,20亿+条数据,所以需要限制大小 这个怎么搞呢...setCaching有用吗?
用StartRow key和StopRow key控制大小

			String StartRow = "XXXXXXXXXXXXX";
			String StopRow = "YYYYYYYYYYYYY";
			Scan MyScan = new Scan(StartRow.getBytes(), StopRow.getBytes());
......................................................................................
			TableMapReduceUtil.initTableMapperJob(table, MyScan, mapper, outputKeyClass, outputValueClass, job)
[/quote][/quote] 你的rowkey是随机数的话那就没法确定起始点了吧,那么你是想从表中随意取出固定量的数据吗? 不然的话你肯定是根据一个规则来取数据的吧,那么就利用那个规则使用endpoint在region层过滤数据,也可使用filter在客户端层过滤,但是在客户端层过滤会加大网络传输消耗,在regionserver层过滤会加大regionserver的负担,权衡下吧[/quote] filter是客户端过滤?呵呵,笑抽了
少主无翼 2014-01-16
  • 打赏
  • 举报
回复
引用 5 楼 shibbin 的回复:
嗯,这个办法我想过,可能是现在唯一可行的了,不足是无法自定义大小,因为rowkey是随机数 [quote=引用 4 楼 tntzbzc 的回复:] [quote=引用 3 楼 shibbin 的回复:] 我是要把scan作为mapreduce的输入,但是我的表太大,20亿+条数据,所以需要限制大小 这个怎么搞呢...setCaching有用吗?
用StartRow key和StopRow key控制大小

			String StartRow = "XXXXXXXXXXXXX";
			String StopRow = "YYYYYYYYYYYYY";
			Scan MyScan = new Scan(StartRow.getBytes(), StopRow.getBytes());
......................................................................................
			TableMapReduceUtil.initTableMapperJob(table, MyScan, mapper, outputKeyClass, outputValueClass, job)
[/quote][/quote] 你的rowkey是随机数的话那就没法确定起始点了吧,那么你是想从表中随意取出固定量的数据吗? 不然的话你肯定是根据一个规则来取数据的吧,那么就利用那个规则使用endpoint在region层过滤数据,也可使用filter在客户端层过滤,但是在客户端层过滤会加大网络传输消耗,在regionserver层过滤会加大regionserver的负担,权衡下吧
撸大湿 2014-01-15
  • 打赏
  • 举报
回复
引用 3 楼 shibbin 的回复:
我是要把scan作为mapreduce的输入,但是我的表太大,20亿+条数据,所以需要限制大小 这个怎么搞呢...setCaching有用吗?
用StartRow key和StopRow key控制大小

			String StartRow = "XXXXXXXXXXXXX";
			String StopRow = "YYYYYYYYYYYYY";
			Scan MyScan = new Scan(StartRow.getBytes(), StopRow.getBytes());
......................................................................................
			TableMapReduceUtil.initTableMapperJob(table, MyScan, mapper, outputKeyClass, outputValueClass, job)
shibbin 2014-01-15
  • 打赏
  • 举报
回复
我是要把scan作为mapreduce的输入,但是我的表太大,20亿+条数据,所以需要限制大小 这个怎么搞呢...setCaching有用吗?
引用 2 楼 tntzbzc 的回复:
getMaxResultSize应该是0.96后的新功能 我的0.94没有这个方法 在0.94中,最简单的办法是设置Caching = 返回行数
		
		final int MaxRowCount = 100;
		int RowCount = 0;
		Scan s = new Scan();
		s.setCaching(MaxRowCount);
		ResultScanner ss = table.getScanner(s);
		for (int i = 0; i < MaxRowCount; i++) {
			Result r = ss.next();
			System.out.println("result :" + new String(r.getRow()));
			RowCount++;
		}
		ss.close();
		System.out.println("result :" + RowCount);
或者用endpoint解决限制行数scan的问题,以及scan性能问题 可以参考我的博客http://blog.csdn.net/tntzbzc/article/details/8918463 [quote=引用 1 楼 hqshaozhu 的回复:] s.setMaxResultSize(100);这个方法存在吗,应该是这个setMaxVersions()吧
setMaxVersion控制的是单行最大TS版本数,不是行数[/quote]
撸大湿 2014-01-15
  • 打赏
  • 举报
回复
getMaxResultSize应该是0.96后的新功能 我的0.94没有这个方法 在0.94中,最简单的办法是设置Caching = 返回行数
		
		final int MaxRowCount = 100;
		int RowCount = 0;
		Scan s = new Scan();
		s.setCaching(MaxRowCount);
		ResultScanner ss = table.getScanner(s);
		for (int i = 0; i < MaxRowCount; i++) {
			Result r = ss.next();
			System.out.println("result :" + new String(r.getRow()));
			RowCount++;
		}
		ss.close();
		System.out.println("result :" + RowCount);
或者用endpoint解决限制行数scan的问题,以及scan性能问题 可以参考我的博客http://blog.csdn.net/tntzbzc/article/details/8918463
引用 1 楼 hqshaozhu 的回复:
s.setMaxResultSize(100);这个方法存在吗,应该是这个setMaxVersions()吧
setMaxVersion控制的是单行最大TS版本数,不是行数
少主无翼 2014-01-15
  • 打赏
  • 举报
回复
s.setMaxResultSize(100);这个方法存在吗,应该是这个setMaxVersions()吧
shibbin 2014-01-15
  • 打赏
  • 举报
回复
嗯,这个办法我想过,可能是现在唯一可行的了,不足是无法自定义大小,因为rowkey是随机数
引用 4 楼 tntzbzc 的回复:
[quote=引用 3 楼 shibbin 的回复:] 我是要把scan作为mapreduce的输入,但是我的表太大,20亿+条数据,所以需要限制大小 这个怎么搞呢...setCaching有用吗?
用StartRow key和StopRow key控制大小

			String StartRow = "XXXXXXXXXXXXX";
			String StopRow = "YYYYYYYYYYYYY";
			Scan MyScan = new Scan(StartRow.getBytes(), StopRow.getBytes());
......................................................................................
			TableMapReduceUtil.initTableMapperJob(table, MyScan, mapper, outputKeyClass, outputValueClass, job)
[/quote]

20,848

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧