Review Board 1.7.22


[HCAT-301]Reading from a table created with upper case table name throws error

Review Request #4416 - Created March 20, 2012 and submitted

Rohini Palaniswamy
HCATALOG-301
Reviewers
avandana, francisliu
hcatalog
Introduced a new table property "hbase.table.name" similar to Hive to store hbase table names retaining the case. This will be used to access hbase and zookeeper which are case sensitive from within the HbaseHCatStorageHandler.

Added two new APIs setupTable and dropTable to RevisionManager and removed public APIs for setting up and dropping znodes in ZKBasedRevisionManager.
Unit tests added
http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseHCatStorageHandler.java
Revision 1303371 New Change
[20] 57 lines
[+20]
58
import org.apache.hcatalog.data.schema.HCatSchema;
58
import org.apache.hcatalog.data.schema.HCatSchema;
59
import org.apache.hcatalog.hbase.HBaseBulkOutputFormat.HBaseBulkOutputCommitter;
59
import org.apache.hcatalog.hbase.HBaseBulkOutputFormat.HBaseBulkOutputCommitter;
60
import org.apache.hcatalog.hbase.HBaseDirectOutputFormat.HBaseDirectOutputCommitter;
60
import org.apache.hcatalog.hbase.HBaseDirectOutputFormat.HBaseDirectOutputCommitter;
61
import org.apache.hcatalog.hbase.snapshot.RevisionManager;
61
import org.apache.hcatalog.hbase.snapshot.RevisionManager;
62
import org.apache.hcatalog.hbase.snapshot.Transaction;
62
import org.apache.hcatalog.hbase.snapshot.Transaction;
63
import org.apache.hcatalog.hbase.snapshot.ZKBasedRevisionManager;

   
64
import org.apache.hcatalog.mapreduce.HCatOutputFormat;
63
import org.apache.hcatalog.mapreduce.HCatOutputFormat;
65
import org.apache.hcatalog.mapreduce.HCatTableInfo;
64
import org.apache.hcatalog.mapreduce.HCatTableInfo;
66
import org.apache.hcatalog.mapreduce.InputJobInfo;
65
import org.apache.hcatalog.mapreduce.InputJobInfo;
67
import org.apache.hcatalog.mapreduce.OutputJobInfo;
66
import org.apache.hcatalog.mapreduce.OutputJobInfo;
68
import org.apache.hcatalog.mapreduce.HCatStorageHandler;
67
import org.apache.hcatalog.mapreduce.HCatStorageHandler;
[+20] [20] 12 lines
[+20]
81

    
   
80

   
82
    public final static String DEFAULT_PREFIX = "default.";
81
    public final static String DEFAULT_PREFIX = "default.";
83
    private final static String PROPERTY_INT_OUTPUT_LOCATION = "hcat.hbase.mapreduce.intermediateOutputLocation";
82
    private final static String PROPERTY_INT_OUTPUT_LOCATION = "hcat.hbase.mapreduce.intermediateOutputLocation";
84

    
   
83

   
85
    private Configuration hbaseConf;
84
    private Configuration hbaseConf;

    
   
85
    private Configuration jobConf;
86
    private HBaseAdmin admin;
86
    private HBaseAdmin admin;
87

    
   
87

   
88
    @Override
88
    @Override
89
    public void configureInputJobProperties(TableDesc tableDesc, Map<String, String> jobProperties) {
89
    public void configureInputJobProperties(TableDesc tableDesc, Map<String, String> jobProperties) {
90
        // Populate jobProperties with input table name, table columns, RM snapshot,
90
        // Populate jobProperties with input table name, table columns, RM snapshot,
91
        // hbase-default.xml and hbase-site.xml
91
        // hbase-default.xml and hbase-site.xml
92
        Map<String, String> tableJobProperties = tableDesc.getJobProperties();
92
        Map<String, String> tableJobProperties = tableDesc.getJobProperties();
93
        String jobString = tableJobProperties.get(HCatConstants.HCAT_KEY_JOB_INFO);
93
        String jobString = tableJobProperties.get(HCatConstants.HCAT_KEY_JOB_INFO);
94
        try {
94
        try {
95
            InputJobInfo inputJobInfo = (InputJobInfo) HCatUtil.deserialize(jobString);
95
            InputJobInfo inputJobInfo = (InputJobInfo) HCatUtil.deserialize(jobString);
96
            HCatTableInfo tableInfo = inputJobInfo.getTableInfo();
96
            HCatTableInfo tableInfo = inputJobInfo.getTableInfo();
97
            String qualifiedTableName = HBaseHCatStorageHandler.getFullyQualifiedName(tableInfo);
97
            String qualifiedTableName = HBaseHCatStorageHandler.getFullyQualifiedHBaseTableName(tableInfo);
98
            jobProperties.put(TableInputFormat.INPUT_TABLE, qualifiedTableName);
98
            jobProperties.put(TableInputFormat.INPUT_TABLE, qualifiedTableName);
99

    
   
99

   
100
            Configuration jobConf = getConf();
100
            Configuration jobConf = getJobConf();
101
            addHbaseResources(jobConf, jobProperties);
101
            addHbaseResources(jobConf, jobProperties);
102
            Configuration copyOfConf = new Configuration(jobConf);
102
            JobConf copyOfConf = new JobConf(jobConf);
103
            HBaseConfiguration.addHbaseResources(copyOfConf);
103
            HBaseConfiguration.addHbaseResources(copyOfConf);
104
            //Getting hbase delegation token in getInputSplits does not work with PIG. So need to
104
            //Getting hbase delegation token in getInputSplits does not work with PIG. So need to
105
            //do it here
105
            //do it here
106
            if (jobConf instanceof JobConf) {
106
            if (jobConf instanceof JobConf) {
107
                HBaseUtil.addHBaseDelegationToken((JobConf)jobConf);
107
                //jobConf and copyOfConf refer to same Credentials object. Using copyOfConf which

    
   
108
                //has hbase configuration to get delegation token

    
   
109
                HBaseUtil.addHBaseDelegationToken(copyOfConf);
108
            }
110
            }
109

    
   
111

   
110
            String outputSchema = jobConf.get(HCatConstants.HCAT_KEY_OUTPUT_SCHEMA);
112
            String outputSchema = jobConf.get(HCatConstants.HCAT_KEY_OUTPUT_SCHEMA);
111
            jobProperties.put(TableInputFormat.SCAN_COLUMNS, getScanColumns(tableInfo, outputSchema));
113
            jobProperties.put(TableInputFormat.SCAN_COLUMNS, getScanColumns(tableInfo, outputSchema));
112

    
   
114

   
[+20] [20] 25 lines
[+20] [+] public void configureOutputJobProperties(TableDesc tableDesc, Map<String, String> jobProperties) {
138
        Map<String, String> tableJobProperties = tableDesc.getJobProperties();
140
        Map<String, String> tableJobProperties = tableDesc.getJobProperties();
139
        String jobString = tableJobProperties.get(HCatConstants.HCAT_KEY_OUTPUT_INFO);
141
        String jobString = tableJobProperties.get(HCatConstants.HCAT_KEY_OUTPUT_INFO);
140
        try {
142
        try {
141
            OutputJobInfo outputJobInfo = (OutputJobInfo) HCatUtil.deserialize(jobString);
143
            OutputJobInfo outputJobInfo = (OutputJobInfo) HCatUtil.deserialize(jobString);
142
            HCatTableInfo tableInfo = outputJobInfo.getTableInfo();
144
            HCatTableInfo tableInfo = outputJobInfo.getTableInfo();
143
            String qualifiedTableName = HBaseHCatStorageHandler.getFullyQualifiedName(tableInfo);
145
            String qualifiedTableName = HBaseHCatStorageHandler.getFullyQualifiedHBaseTableName(tableInfo);
144
            jobProperties.put(HBaseConstants.PROPERTY_OUTPUT_TABLE_NAME_KEY, qualifiedTableName);
146
            jobProperties.put(HBaseConstants.PROPERTY_OUTPUT_TABLE_NAME_KEY, qualifiedTableName);
145
            jobProperties.put(TableOutputFormat.OUTPUT_TABLE, qualifiedTableName);
147
            jobProperties.put(TableOutputFormat.OUTPUT_TABLE, qualifiedTableName);
146

    
   
148

   
147
            Configuration jobConf = getConf();
149
            Configuration jobConf = getJobConf();
148
            addHbaseResources(jobConf, jobProperties);
150
            addHbaseResources(jobConf, jobProperties);
149

    
   
151

   
150
            Configuration copyOfConf = new Configuration(jobConf);
152
            Configuration copyOfConf = new Configuration(jobConf);
151
            HBaseConfiguration.addHbaseResources(copyOfConf);
153
            HBaseConfiguration.addHbaseResources(copyOfConf);
152

    
   
154

   
153
            String txnString = outputJobInfo.getProperties().getProperty(
155
            String txnString = outputJobInfo.getProperties().getProperty(
154
                    HBaseConstants.PROPERTY_WRITE_TXN_KEY);
156
                    HBaseConstants.PROPERTY_WRITE_TXN_KEY);
155
            String jobTxnString = jobConf.get(HBaseConstants.PROPERTY_WRITE_TXN_KEY);

   
156
            //Pig makes 3 calls to HCatOutputFormat.setOutput(HCatStorer) with different JobConf

   
157
            //which leads to creating 2 transactions.

   
158
            //So apart from fixing HCatStorer to pass same OutputJobInfo, making the call idempotent for other

   
159
            //cases which might call multiple times but with same JobConf.

   
160
            Transaction txn = null;
157
            Transaction txn = null;
161
            if (txnString == null && jobTxnString == null) {
158
            if (txnString == null) {
162
                txn = HBaseRevisionManagerUtil.beginWriteTransaction(qualifiedTableName, tableInfo, copyOfConf);
159
                txn = HBaseRevisionManagerUtil.beginWriteTransaction(qualifiedTableName, tableInfo, copyOfConf);
163
                String serializedTxn = HCatUtil.serialize(txn);
160
                String serializedTxn = HCatUtil.serialize(txn);
164
                outputJobInfo.getProperties().setProperty(HBaseConstants.PROPERTY_WRITE_TXN_KEY,
161
                outputJobInfo.getProperties().setProperty(HBaseConstants.PROPERTY_WRITE_TXN_KEY,
165
                        serializedTxn);
162
                        serializedTxn);
166
                jobProperties.put(HBaseConstants.PROPERTY_WRITE_TXN_KEY, serializedTxn);

   
167
            } else {
163
            } else {
168
                txnString = (txnString == null) ? jobTxnString : txnString;

   
169
                txn = (Transaction) HCatUtil.deserialize(txnString);
164
                txn = (Transaction) HCatUtil.deserialize(txnString);
170
                outputJobInfo.getProperties().setProperty(HBaseConstants.PROPERTY_WRITE_TXN_KEY,

   
171
                        txnString);

   
172
                jobProperties.put(HBaseConstants.PROPERTY_WRITE_TXN_KEY, txnString);

   
173
            }
165
            }
174
            if (isBulkMode(outputJobInfo)) {
166
            if (isBulkMode(outputJobInfo)) {
175
                String tableLocation = tableInfo.getTableLocation();
167
                String tableLocation = tableInfo.getTableLocation();
176
                String location = new Path(tableLocation, "REVISION_" + txn.getRevisionNumber())
168
                String location = new Path(tableLocation, "REVISION_" + txn.getRevisionNumber())
177
                        .toString();
169
                        .toString();
[+20] [20] 79 lines
[+20] [+] public void preCreateTable(Table tbl) throws MetaException {
257
        if (tbl.getSd().getLocation() != null) {
249
        if (tbl.getSd().getLocation() != null) {
258
            throw new MetaException("LOCATION may not be specified for HBase.");
250
            throw new MetaException("LOCATION may not be specified for HBase.");
259
        }
251
        }
260

    
   
252

   
261
        try {
253
        try {
262
            String tableName = getHBaseTableName(tbl);
254
            String tableName = getFullyQualifiedHBaseTableName(tbl);
263
            String hbaseColumnsMapping = tbl.getParameters().get(
255
            String hbaseColumnsMapping = tbl.getParameters().get(
264
                    HBaseSerDe.HBASE_COLUMNS_MAPPING);
256
                    HBaseSerDe.HBASE_COLUMNS_MAPPING);
265

    
   
257

   
266
            tbl.putToParameters(HBaseConstants.PROPERTY_COLUMN_MAPPING_KEY,
258
            tbl.putToParameters(HBaseConstants.PROPERTY_COLUMN_MAPPING_KEY,
267
                    hbaseColumnsMapping);
259
                    hbaseColumnsMapping);
268

    
   
260

   
269
            if (hbaseColumnsMapping == null) {
261
            if (hbaseColumnsMapping == null) {
270
                throw new MetaException(
262
                throw new MetaException(
271
                        "No hbase.columns.mapping defined in table"
263
                        "No hbase.columns.mapping defined in table"
272
                                + " properties.");
264
                                + " properties.");
273
            }
265
            }
274

    
   
266

   

    
   
267
            tbl.putToParameters(HBaseSerDe.HBASE_TABLE_NAME, tableName);

    
   
268

   
275
            List<String> hbaseColumnFamilies = new ArrayList<String>();
269
            List<String> hbaseColumnFamilies = new ArrayList<String>();
276
            List<String> hbaseColumnQualifiers = new ArrayList<String>();
270
            List<String> hbaseColumnQualifiers = new ArrayList<String>();
277
            List<byte[]> hbaseColumnFamiliesBytes = new ArrayList<byte[]>();
271
            List<byte[]> hbaseColumnFamiliesBytes = new ArrayList<byte[]>();
278
            int iKey = HBaseUtil.parseColumnMapping(hbaseColumnsMapping,
272
            int iKey = HBaseUtil.parseColumnMapping(hbaseColumnsMapping,
279
                    hbaseColumnFamilies, hbaseColumnFamiliesBytes,
273
                    hbaseColumnFamilies, hbaseColumnFamiliesBytes,
[+20] [20] 49 lines
[+20] public void preCreateTable(Table tbl) throws MetaException {
329
            }
323
            }
330

    
   
324

   
331
            // ensure the table is online
325
            // ensure the table is online
332
            new HTable(hbaseConf, tableDesc.getName());
326
            new HTable(hbaseConf, tableDesc.getName());
333

    
   
327

   
334
            //Set up znodes in revision manager.
328
            //Set up table in revision manager.
335
            RevisionManager rm = HBaseRevisionManagerUtil.getOpenedRevisionManager(hbaseConf);
329
            RevisionManager rm = HBaseRevisionManagerUtil.getOpenedRevisionManager(hbaseConf);
336
            if (rm instanceof ZKBasedRevisionManager) {
330
            rm.setupTable(tableName, new ArrayList<String>(uniqueColumnFamilies));
337
                ZKBasedRevisionManager zkRM = (ZKBasedRevisionManager) rm;

   
338
                zkRM.setUpZNodes(tableName, new ArrayList<String>(

   
339
                        uniqueColumnFamilies));

   
340
            }

   
341

    
   
331

   
342
        } catch (MasterNotRunningException mnre) {
332
        } catch (MasterNotRunningException mnre) {
343
            throw new MetaException(StringUtils.stringifyException(mnre));
333
            throw new MetaException(StringUtils.stringifyException(mnre));
344
        } catch (IOException ie) {
334
        } catch (IOException ie) {
345
            throw new MetaException(StringUtils.stringifyException(ie));
335
            throw new MetaException(StringUtils.stringifyException(ie));
[+20] [20] 61 lines
[+20] [+] private HBaseAdmin getHBaseAdmin() throws MetaException {
407
        } catch (ZooKeeperConnectionException zkce) {
397
        } catch (ZooKeeperConnectionException zkce) {
408
            throw new MetaException(StringUtils.stringifyException(zkce));
398
            throw new MetaException(StringUtils.stringifyException(zkce));
409
        }
399
        }
410
    }
400
    }
411

    
   
401

   
412
    private String getHBaseTableName(Table tbl) {
402
    private String getFullyQualifiedHBaseTableName(Table tbl) {
413
        String tableName = tbl.getParameters().get(HBaseSerDe.HBASE_TABLE_NAME);
403
        String tableName = tbl.getParameters().get(HBaseSerDe.HBASE_TABLE_NAME);
414
        if (tableName == null) {
404
        if (tableName == null) {
415
            tableName = tbl.getSd().getSerdeInfo().getParameters()
405
            tableName = tbl.getSd().getSerdeInfo().getParameters()
416
                    .get(HBaseSerDe.HBASE_TABLE_NAME);
406
                    .get(HBaseSerDe.HBASE_TABLE_NAME);
417
        }
407
        }
[+20] [20] 5 lines
[+20] private String getHBaseTableName(Table tbl) { private String getFullyQualifiedHBaseTableName(Table tbl) {
423
            }
413
            }
424
        }
414
        }
425
        return tableName;
415
        return tableName;
426
    }
416
    }
427

    
   
417

   

    
   
418
    static String getFullyQualifiedHBaseTableName(HCatTableInfo tableInfo){

    
   
419
        String qualifiedName = tableInfo.getStorerInfo().getProperties()

    
   
420
                .getProperty(HBaseSerDe.HBASE_TABLE_NAME);

    
   
421
        if (qualifiedName == null) {
Moved from 497

    
   
422
            String databaseName = tableInfo.getDatabaseName();
Moved from 498

    
   
423
            String tableName = tableInfo.getTableName();

    
   
424
            if ((databaseName == null)

    
   
425
                    || (databaseName.equals(MetaStoreUtils.DEFAULT_DATABASE_NAME))) {
Moved from 501

    
   
426
                qualifiedName = tableName;
Moved from 502

    
   
427
            } else {
Moved from 503

    
   
428
                qualifiedName = databaseName + "." + tableName;
Moved from 504

    
   
429
            }

    
   
430
        }

    
   
431
        return qualifiedName;

    
   
432
    }

    
   
433

   
428
    @Override
434
    @Override
429
    public Class<? extends InputFormat> getInputFormatClass() {
435
    public Class<? extends InputFormat> getInputFormatClass() {
430
        return HBaseInputFormat.class;
436
        return HBaseInputFormat.class;
431
    }
437
    }
432

    
   
438

   
[+20] [20] 14 lines
[+20] private String getHBaseTableName(Table tbl) { static String getFullyQualifiedHBaseTableName(HCatTableInfo tableInfo){
447
    public Class<? extends SerDe> getSerDeClass()
453
    public Class<? extends SerDe> getSerDeClass()
448
            throws UnsupportedOperationException {
454
            throws UnsupportedOperationException {
449
        return HBaseSerDe.class;
455
        return HBaseSerDe.class;
450
    }
456
    }
451

    
   
457

   

    
   
458
    public Configuration getJobConf() {

    
   
459
        return jobConf;

    
   
460
    }

    
   
461

   
452
    @Override
462
    @Override
453
    public Configuration getConf() {
463
    public Configuration getConf() {
454

    
   
464

   
455
        if (hbaseConf == null) {
465
        if (hbaseConf == null) {
456
            hbaseConf = HBaseConfiguration.create();
466
            hbaseConf = HBaseConfiguration.create();
[+20] [20] 4 lines
[+20] public Configuration getConf() {
461
    @Override
471
    @Override
462
    public void setConf(Configuration conf) {
472
    public void setConf(Configuration conf) {
463
        //Not cloning as we want to set tmpjars on it. Putting in jobProperties does not
473
        //Not cloning as we want to set tmpjars on it. Putting in jobProperties does not
464
        //get propagated to JobConf in case of InputFormat as they are maintained per partition.
474
        //get propagated to JobConf in case of InputFormat as they are maintained per partition.
465
        //Also we need to add hbase delegation token to the Credentials.
475
        //Also we need to add hbase delegation token to the Credentials.
466
        hbaseConf = conf;
476
        //TODO: Change to a copy after HCAT-308 is fixed.

    
   
477
        jobConf = conf;

    
   
478
        hbaseConf = HBaseConfiguration.create(conf);
467
    }
479
    }
468

    
   
480

   
469
    private void checkDeleteTable(Table table) throws MetaException {
481
    private void checkDeleteTable(Table table) throws MetaException {
470
        boolean isExternal = MetaStoreUtils.isExternalTable(table);
482
        boolean isExternal = MetaStoreUtils.isExternalTable(table);
471
        String tableName = getHBaseTableName(table);
483
        String tableName = getFullyQualifiedHBaseTableName(table);
472
        RevisionManager rm = null;
484
        RevisionManager rm = null;
473
        try {
485
        try {
474
            if (!isExternal && getHBaseAdmin().tableExists(tableName)) {
486
            if (!isExternal && getHBaseAdmin().tableExists(tableName)) {
475
                // we have created an HBase table, so we delete it to roll back;
487
                // we have created an HBase table, so we delete it to roll back;
476
                if (getHBaseAdmin().isTableEnabled(tableName)) {
488
                if (getHBaseAdmin().isTableEnabled(tableName)) {
477
                    getHBaseAdmin().disableTable(tableName);
489
                    getHBaseAdmin().disableTable(tableName);
478
                }
490
                }
479
                getHBaseAdmin().deleteTable(tableName);
491
                getHBaseAdmin().deleteTable(tableName);
480

    
   
492

   
481
              //Set up znodes in revision manager.
493
                //Drop table in revision manager.
482
                rm = HBaseRevisionManagerUtil.getOpenedRevisionManager(hbaseConf);
494
                rm = HBaseRevisionManagerUtil.getOpenedRevisionManager(hbaseConf);
483
                if (rm instanceof ZKBasedRevisionManager) {
495
                rm.dropTable(tableName);
484
                    ZKBasedRevisionManager zkRM = (ZKBasedRevisionManager) rm;

   
485
                    zkRM.deleteZNodes(tableName);

   
486
                }

   
487
            }
496
            }
488
        } catch (IOException ie) {
497
        } catch (IOException ie) {
489
            throw new MetaException(StringUtils.stringifyException(ie));
498
            throw new MetaException(StringUtils.stringifyException(ie));
490
        } finally {
499
        } finally {
491
            HBaseRevisionManagerUtil.closeRevisionManagerQuietly(rm);
500
            HBaseRevisionManagerUtil.closeRevisionManagerQuietly(rm);
492
        }
501
        }
493
    }
502
    }
494

    
   
503

   
495
    static String getFullyQualifiedName(HCatTableInfo tableInfo){

   
496
        String qualifiedName;

   
497
        String databaseName = tableInfo.getDatabaseName();
Moved to 422

   
498
        String tableName = tableInfo.getTableName();
Moved to 423

   
499

    
   

   
500
        if ((databaseName == null) || (databaseName.equals(MetaStoreUtils.DEFAULT_DATABASE_NAME))) {

   
501
            qualifiedName = tableName;
Moved to 426

   
502
        } else {
Moved to 427

   
503
            qualifiedName = databaseName + "." + tableName;
Moved to 428

   
504
        }
Moved to 429

   
505

    
   

   
506
        return qualifiedName;

   
507
    }

   
508

    
   

   
509
    /**
504
    /**
510
     * Helper method for users to add the required depedency jars to distributed cache.
505
     * Helper method for users to add the required depedency jars to distributed cache.
511
     * @param conf
506
     * @param conf
512
     * @throws IOException
507
     * @throws IOException
513
     */
508
     */
[+20] [20] 94 lines
http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManager.java
Revision 1303371 New Change
 
http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/ZKBasedRevisionManager.java
Revision 1303371 New Change
 
http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseBulkOutputFormat.java
Revision 1303371 New Change
 
http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseDirectOutputFormat.java
Revision 1303371 New Change
 
http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseHCatStorageHandler.java
Revision 1303371 New Change
 
http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseInputFormat.java
Revision 1303371 New Change
 
  1. http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseHCatStorageHandler.java: Loading...
  2. http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManager.java: Loading...
  3. http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/ZKBasedRevisionManager.java: Loading...
  4. http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseBulkOutputFormat.java: Loading...
  5. http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseDirectOutputFormat.java: Loading...
  6. http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseHCatStorageHandler.java: Loading...
  7. http://svn.apache.org/repos/asf/incubator/hcatalog/branches/branch-0.4/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseInputFormat.java: Loading...