hbase对作业的多表扫描

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

我在看下面的场景。我每天都会收到一份数据文件。我以文件yyyymmdd格式将其添加到hbase中。所以在一段时间内我有很多数据库,例如。

tempdb-20121220
tempdb-20121221
tempdb-20121222
tempdb-20121223
tempdb-20121224
tempdb-20121225

现在我要做的是为一个特定的日期范围获取匹配该范围的表的列表,这样我就可以创建索引。我使用的是hbase-0.90.6
就我的研究而言,tablemapreduceutil.inittablemapperjob只需要1个表名。

TableMapReduceUtil.initTableMapperJob(
tableName,        // input HBase table name
scan,             // Scan instance to control CF and attribute selection
HBaseIndexerMapper.class,   // mapper
null,             // mapper output key
null,             // mapper output value
job
);

我已经能够得到表的列表并在循环中运行它,但是我的想法是我可以循环所有的表,扫描它(或者其他一些东西),这样最终我就可以得到合并/合并的结果,以便进行索引。
实现这一目标的任何方向都将是伟大和有益的。

yzuktlbb

yzuktlbb1#

好的,请检查一下 HBase 0.94.6 来源(看起来他们最接近你)。在那里,您将找到multitableinputformat类(按照链接查看javadoc,包括示例),它满足您的需要。就在几天前,我有经验将这个类添加到 HBase 0.94.2 (实际上 CDH 4.2.1 )基于项目。成功了。
这似乎正是你所需要的,并在非常有效的方式。这里唯一的问题是您将有一个Map程序处理所有数据。为了区分你可能需要拿的table TableSplit 从0.94.6类,重命名它有点不同,并端口,以不破坏您的环境。请检查tablemapreduceutil中的差异-您需要手动配置扫描,以便输入格式能够理解它们的配置。
也可以考虑简单地转移到 HBase 0.94.6 -更简单的方法是我没能理解它。我花了大约12个工作小时来了解这里的问题/调查解决方案/了解我的cdh 4.2.1问题/移植所有内容。对我来说,好消息是cloudera打算在cdh4.3.0中提高到0.94.6。
更新1: CDH 4.3.0 它包括hbase 0.94.6和所有必需的基础结构。
update2:我转向了另一种解决方案-自定义输入格式,它结合了几个按键混合行的hbase表。碰巧非常有用,特别是有适当的钥匙设计。在一个Map器中可以得到整个聚合。我正在考虑在github上发布这个代码。

qjp7pelc

qjp7pelc2#

List<scans> 也是一种方式。我也同意multipletableinputformat:

import java.util.List; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.hbase.client.Scan; 
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil; 
import org.apache.hadoop.hbase.util.Bytes; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.util.Tool; 

 public class TestMultiScan extends Configured implements Tool { 

    @Override 
    public int run(String[] arg0) throws Exception { 
        List<Scan> scans = new ArrayList<Scan>(); 

        Scan scan1 = new Scan(); 
        scan1.setAttribute("scan.attributes.table.name", Bytes.toBytes("table1ddmmyyyy")); 
        System.out.println(scan1.getAttribute("scan.attributes.table.name")); 
        scans.add(scan1); 

        Scan scan2 = new Scan(); 
        scan2.setAttribute("scan.attributes.table.name", Bytes.toBytes("table2ddmmyyyy")); 
        System.out.println(scan2.getAttribute("scan.attributes.table.name")); 
        scans.add(scan2); 

        Configuration conf = new Configuration(); 
        Job job = new Job(conf);     
        job.setJarByClass(TestMultiScan.class); 

        TableMapReduceUtil.initTableMapperJob( 
                scans,  
                MultiTableMappter.class,  
                Text.class,  
                IntWritable.class,  
                job); 
        TableMapReduceUtil.initTableReducerJob( 
                "xxxxx", 
                MultiTableReducer.class,  
                job); 
        job.waitForCompletion(true); 
        return 0; 
    } 

    public static void main(String[] args) throws Exception { 
        TestMultiScan runJob = new TestMultiScan(); 
        runJob.run(args); 
    } 
 }

通过这种方式,我们用hbase名称空间表解决了我们的多租户需求。对于mapper中的ex:dev1:tablex(dev1接收的数据)uat1:tablex(uat1使用的数据),我们希望比较这两个名称空间表以继续。
在内部,它使用了多个表inputformat,如tablemapreduceutil.java中所示

相关问题