Configuration config = HBaseConfiguration.create();
Job job = new Job(config, "ExampleRead");
job.setJarByClass(MyReadJob.class); // class that contains mapper
Scan scan = new Scan();
scan.setCaching(500); // 1 is the default in Scan, which will be bad for MapReduce jobs
scan.setCacheBlocks(false); // don't set to true for MR jobs
// set other scan attrs
...
TableMapReduceUtil.initTableMapperJob(
tableName, // input HBase table name
scan, // Scan instance to control CF and attribute selection
MyMapper.class, // mapper
null, // mapper output key
null, // mapper output value
job);
job.setOutputFormatClass(NullOutputFormat.class); // because we aren't emitting anything from mapper
boolean b = job.waitForCompletion(true);
if (!b) {
throw new IOException("error with job!");
}
2条答案
按热度按时间mgdq6dx11#
下面是hbase手册中关于如何运行从hbase表读取的mapreduce作业的示例代码。
当你说“扫描值”时,那不是真的。你不是说
scan.setCaching()
或者scan.setBatch()
或者scan.setMaxResultSize()
.setCaching
用于在将结果返回给客户端之前告诉服务器要加载多少行setBatch
如果表很宽,则用于限制每次调用中返回的列数setMaxResultSize
用于限制返回给客户端的结果数通常情况下,你不设置
MaxResultSize
在mapreduce工作中。所以你会看到所有的数据。以上信息请参考。
ifsvaxew2#
您编写的Map程序代码将被逐行提供数据。但是,Map程序运行时将通过缓存端读取记录(即在您的情况下,一次读取500行)。
如果扫描大小太小,执行效率就会非常低(io调用太多)