整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

13.4客户端 13.4.1 Java

hadoop 花牛 10℃ 0评论

HBase集群进行交互,有很多种不同的客户端可供选择。

HBaseHadoop —样,都是用Java开发的。范例13-1展示了 13.3.1节中

外壳环境操作的hva实现版本。

范例13-1.基本的表管理与访问

public class ExampleClient {
    public static void main(String[] args) throws IOException {
    Configuration config = HBaseConfiguration.create();
    // Create table
    HBaseAdmin admin = new HBaseAdmin(config);
    HTableDescriptor htd = new HTableDescriptor("test");
    HColumnDescriptor hcd = new HColumnDescripton("data");
    htd.addFamily(hcd);
    admin.createTable(htd);
    byte [] tablename = htd.getName();
    HTableDescriptor [] tables = admin.listTables();
    if (tables.length != 1 && Bytes.equals(tablename, tables[0].getName())) { 
        throw new IOException("Failed create of table");
    }
    // Run some operations --a put,a get, and a scan --against the table. 
    HTable table = new HTable(config, tablename); 
    byte [] rowl = Bytes.toBytes("rowl");
    Put pi = new Put(rowl);
    byte [] databytes = Bytes.oBytes(” data” );
    pi.add(databytes, Bytes.toBytes("1"), Bytes.toBytes("valuel")); 
    table.put(pi);
    Get g = new Get(rowl);
    Result result = table.get(g);
    System.out.println("Get: " + result);
    Scan scan = new Scan();
    ResultScanner scanner = table.getScanner(scan); 
    try {
        for (Result scannerResult: scanner) {
            System.out.println(v Scan: ” + scannerResult);
        }
    } finally {
        scanner.close();
    }
    // Drop the table
    admin.disableTable(tablename);
    admin.deleteTable(tablename);
    }
}

这个类只有一个主方法。为了简洁,我们没有给出导入包的信息。在这个类中,我们首先创建了一个 of'g.apache.hadoop.conf.Configuration 实例。我们让 or'g.apache.hadoop.hbase.HBaseConfiguration 类来创 建这个实例。这个类会返回一个Configuration,其中已经读入了程序 classpath下hbase-site.xml和hbase-default.xml文件中的HBase配置信息。 这个Configuration接下来会被用于创建HBaseAdminHTable实例。 HBaseAdmin 和 HTable 这两个类在 Java 的 org.apache.hadoop. hbase.client包中。HBaseAdmin用于管理HBase集群,添加和丢弃表。 HTable则用于访问指定的表。Configuration实例将这些类指向了执行这些代码的集群。

要创建一个表,我们需要首先创建一个HBaseAdmin的实例,然后让它来 创建名为test、只有一个列族data的表。在我们的示例中,表的模式是默认的。可以使用 org.apache.hadoop.hbase.HTableDescripttor 和 org.apache.hadoophbase JColumnDescriptor 中的方法来修改表的模式。接下来的代码测试了表否真的被创建了。接着,程序对新建的表进行操作。

要对一个表进行操作,我们需要新建一个orgapachehadoophbase.client.HTable的实例,并把我们的Configuration实例和我们要操作的表的名称传递给它。在新建HTable以后,我们新建一个 org.apache.hadoop.hbase.client 的实例。Put 把单个的单元格值valuel 放入名为rowl的行的名为data:l的列上。注意:列名通过两部分指定,列 族名是字节类型的——在前面代码中是databytes——而接着列族修饰词用 Bytes.toBytes("l")。接着,我们新建一个 org.apache.hadoophbase.


client.Get来获取刚添加的单元格。然后,再使用一个org.apache.hadoop. hbase. client .Scan来扫描新建的表,并打印扫描结果。

最后,我们首先禁用表,接着删除它,把这张表清除掉。在丢弃表前必须先禁用它。

MapReduce

org.apache.hadoop.hbase.mapreduce包中的类和工具有利于将 HBase 作为MapReduce作业的源/输出。TablelnputFormat类可以在区域的边界进行分割,使map能够拿到单个的区域进行处理。TableOutputFormat将 把reduce的结果写入HBase。范例13-2中的ROwCounter类可以在HBase mapreduce包中找到。它用TablelnputFormat来运行一个map任务,以计算行数。

范例13-2.—个计算HBase表中行数的MapReduce应用程序

public class RowCounter {
    /** Name of this 'program'. */
    static final String NAME = "rowcounter";
    static class RowCounterMapper
    extends TableMapper<ImmutableBytesWritable, Result〉 {
    /** Counter enumeration to count the actual rows. */ 
    public static enum Counters {ROWS}
        @Override
        public void map(ImmutableBytesWritable row, Result values,
        Context context)
        throws IOException {
            for (KeyValue value: values.list()) { 
                if (value.getValue().length > 0) { 
                    context.getCounter(Counters.ROWS).increment(l); break;
                }
            }
        }
    }
    public static Job createSubmittableJob(Configuration conf, String[] args) 
    throws IOException {
    String tableName = args[0];
    Job job = new Job(conf, NAME + tableName)j
    job.setDarByClass(RowCounter.class);
    // Columns are space delimited 
    StningBuilder sb = new StringBuilden(); 
    final int columnoffset = 1;
    for (int i = columnoffset; i < args.length; i++) { 
        if (i > columnoffset) { 
            sb.append(w w );
        }
        sb.append(args[i]);
    }
    Scan scan = new Scan();
    scan.setFilter(new FirstKeyOnlyFilter());
    if (sb.length() > 0) {
        for (String columnName :sb.toStning().split(M M )) {
            String [] fields = columnName.split(M M ); 
            if(fields.length == 1) {
                scan.addFamily(Bytes.toBytes(fields[0]));
            } else {
            scan.addColumn(Bytes.toBytes(fields[0]), Bytes.toBytes(fields[1]));
            }
        }
    }
    // Second argument is the table name.
    job.setOutputFormatClass(NullOutputFormat.class);
    TableMapReduceUtil.initTableMapper3ob(tableName, scan,
        RowCounterMapper.class, ImmutableBytesWritable.class, Result.class^ job); 
    job.setNumReduceTasks(0);
    return job;
    }
    public static void main(String[] args) throws Exception {
    Configuration conf = HBaseConfiguration.create();
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 
    if (otherArgs.length < 1) {
        System.err.println(M ERROR: Wrong number of parameters: M + args.length); 
        System.err.println(M Usage: RowCounter <tablename> [<columnl> <column2>...]M ); 
        System.exit(-1) j
    }
    Dob job = createSubmittableJob(conf, otherArgs);
    System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

    

这个类使用了 5.2.2节介绍的GenericOptionParser,用于解析命令行参数。内部类RowCounterMapper实现了HBaseTableMapper抽象。后者是org.apache. hadoop.mapneduce.Mapper “特化”(specialization)。它设 定 map的输入类型由 TablelnpytFormat 来传递。createSubmittable]ob() 方法对添加到配置的参数进行解析。配置由命令行传递,指出我们要运行 RowCounter 的表和列。列名用于配置 org.apache.hadoop.hbase. client.Scan的实例。这是一个扫描用的对象。它将被传递给 TablelnputFormat,并用干限制Mapper所能看到的信息。注意这里是如 何设置扫描的过滤器(即org.apache.hadoop.hbase.filter. FirstKeyOnlyFilter的实例)的。这个过滤器告诉服务器,让它在运行服 务器端任务时只需要验证一行是否有数据项。这样可以加快行计数的速度。createSubmittable]ob()方法为了设置所使用的map类、设定输入 格式为 TablelnputFormat 还调用了TableMapReduceUtil.


initTableMap]ob()这一工具方法(utility method)。map 很简单。它只测试行为否是空。如果为空,就不对行进行计数。否则,使Counters.ROWS增1。

转载请注明:全栈大数据 » 13.4客户端 13.4.1 Java

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址