转载:https://github.com/ssw239/java-thrift-hbase-io/blob/master/HBaseThriftClient.java
pom.xml
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-thrift</artifactId> <version>1.3.1</version> </dependency>
ThriftUtil.java
package hbase; import java.lang.Object; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.security.MessageDigest; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.hadoop.hbase.thrift.generated.BatchMutation; import org.apache.hadoop.hbase.thrift.generated.Hbase; import org.apache.hadoop.hbase.thrift.generated.IOError; import org.apache.hadoop.hbase.thrift.generated.Mutation; import org.apache.hadoop.hbase.thrift.generated.TCell; import org.apache.hadoop.hbase.thrift.generated.TRowResult; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; public class ThriftUtil { protected Hbase.Client hbaseClient = null; private String hbaseAddr = ""; private Integer hbasePort = 0; private TTransport socket = null; private TProtocol protocol = null; protected static final String CHAR_SET = "UTF-8"; public ThriftUtil(String addr, Integer port) { hbaseAddr = addr; hbasePort = port; socket = new TSocket(hbaseAddr, hbasePort); protocol = new TBinaryProtocol(socket, true, true); hbaseClient = new Hbase.Client(protocol); } public static void main(String[] args) throws TTransportException { ThriftUtil hbaseClient = null; try { hbaseClient = new ThriftUtil("192.168.101.144", 9090); hbaseClient.openTransport(); doSomeTest(hbaseClient); } catch (Exception e) { e.printStackTrace(); } finally { hbaseClient.closeTransport(); } } public static void doSomeTest(ThriftUtil client) throws TException { String tableName = "test5"; testScanTable(tableName, "", 1000, client); String rowKey_R1 = "r1"; Map<String, String> kvpUpdate_r1 = new HashMap<String, String>(); kvpUpdate_r1.put("cf:name", "val_20150618_0920_1"); kvpUpdate_r1.put("cf:age", "12"); // client.updateRow(tableName, rowKey_R1, kvpUpdate_r1); String rowKey_R2 = "r2"; Map<String, String> kvpUpdate_r2 = new HashMap<String, String>(); kvpUpdate_r2.put("cf:name", "val_201505181028_r2c1"); kvpUpdate_r2.put("cf:age", "13"); Map<String, Map<String, String>> rowBatchData = new HashMap<String, Map<String, String>>(); rowBatchData.put(rowKey_R1, kvpUpdate_r1); rowBatchData.put(rowKey_R2, kvpUpdate_r2); // client.updateRows(tableName, rowBatchData); Map<String, String> attributes = new HashMap<String, String>(); // List<TRowResult> rowRslts = client.getRow("test5", "r2", attributes); Map<String, String> kvpUpdate_bs = new HashMap<String, String>(); kvpUpdate_bs.put("cf:name", "val_20150519_1352"); kvpUpdate_bs.put("cf:age", "14"); // client.updateRow(tableName, "r2", kvpUpdate_bs); // client.deleteCell(tableName, "r2", "cf:name"); List<String> columns = new ArrayList<String>(); columns.add("cf:name"); columns.add("cf:age"); // client.deleteCells(tableName, "r1", columns); client.deleteRow(tableName, "r1"); testScanTable(tableName, "", 1000, client); System.out.println("Done."); } public static void testIterateRow(String tableName, String rowKey, ThriftUtil client) throws TException { Map<String, String> attributes = new HashMap<String, String>(); List<TRowResult> results = client.getRow(tableName, rowKey, attributes); for (TRowResult rslt : results) { client.iterateResults(rslt); } } public static void testScanTable(String tableName, String startRow, int rowCnt, ThriftUtil client) throws TException { List<String> columns = new ArrayList<String>(0); Map<String, String> attributesTest = new HashMap<String, String>(); int scannerID = client.scannerOpen(tableName, startRow, columns, attributesTest); try { List<TRowResult> scanResults = client.scannerGetList(scannerID, rowCnt); while (scanResults != null && !scanResults.isEmpty()) { for (TRowResult rslt : scanResults) { client.iterateResults(rslt); } scanResults = client.scannerGetList(scannerID, rowCnt); } } finally { client.scannerClose(scannerID); } } public void listTableNames(ThriftUtil client) throws TTransportException { List<String> tblNames = client.getTableNames(); for (String name : tblNames) { System.out.println(">> " + name); } } public void deleteRow(String table, String rowKey) throws TException { ByteBuffer tableName = getByteBuffer(table); ByteBuffer row = getByteBuffer(rowKey); hbaseClient.deleteAllRow(tableName, row, getAttributesMap(new HashMap<String, String>())); } public void deleteCell(String table, String rowKey, String column) throws TException { List<String> columns = new ArrayList<String>(1); columns.add(column); deleteCells(table, rowKey, columns); } public void deleteCells(String table, String rowKey, List<String> columns) throws TException { boolean writeToWal = false; List<Mutation> mutations = new ArrayList<Mutation>(); for (String column : columns) { mutations.add(new Mutation(false, getByteBuffer(column), null, writeToWal)); } ByteBuffer tableName = getByteBuffer(table); ByteBuffer row = getByteBuffer(rowKey); hbaseClient.mutateRow(tableName, row, mutations, getAttributesMap(new HashMap<String, String>())); } public void updateRow(String table, String rowKey, Map<String, String> rowData) throws TException { boolean writeToWal = false; Map<String, String> attributes = new HashMap<String, String>(); List<Mutation> mutations = new ArrayList<Mutation>(); for(Map.Entry<String, String> entry : rowData.entrySet()) { mutations.add(new Mutation(false, getByteBuffer(entry.getKey()), getByteBuffer(entry.getValue()), writeToWal)); } Map<ByteBuffer, ByteBuffer> wrappedAttributes = getAttributesMap(attributes); ByteBuffer tableName = getByteBuffer(table); ByteBuffer row = getByteBuffer(rowKey); hbaseClient.mutateRow(tableName, row, mutations, wrappedAttributes); } public void updateRows(String table, Map<String, Map<String, String>> rowBatchData) throws TException { boolean writeToWal = false; Map<String, String> attributes = new HashMap<String, String>(); Map<ByteBuffer, ByteBuffer> wrappedAttributes = getAttributesMap(attributes); ByteBuffer tableNameByte = getByteBuffer(table); List<BatchMutation> rowBatches = new ArrayList<BatchMutation>(); for(Entry<String, Map<String, String>> batchEntry : rowBatchData.entrySet()) { List<Mutation> mutations = new ArrayList<Mutation>(); for (Map.Entry<String, String> rowData : batchEntry.getValue().entrySet()) { mutations.add(new Mutation(false, getByteBuffer(rowData.getKey()), getByteBuffer(rowData.getValue()), writeToWal)); } BatchMutation batchMutation = new BatchMutation(getByteBuffer(batchEntry.getKey()), mutations); rowBatches.add(batchMutation); } hbaseClient.mutateRows(tableNameByte, rowBatches, wrappedAttributes); } public void iterateResults(TRowResult result) { Iterator<Entry<ByteBuffer, TCell>> iter = result.columns.entrySet().iterator(); System.out.println("RowKey:" + new String(result.getRow())); while (iter.hasNext()) { Entry<ByteBuffer, TCell> entry = iter.next(); System.out.println(" Col=" + new String(toBytes(entry.getKey())) + ", Value=" + new String(entry.getValue().getValue())); } } public List<TRowResult> scannerGetList(int id, int nbRows)throws TException { return hbaseClient.scannerGetList(id, nbRows); } public List<TRowResult> scannerGet(int id) throws TException { return hbaseClient.scannerGetList(id, 1); } public int scannerOpen(String table, String startRow, String stopRow, List<String> columns, Map<String, String> attributes) throws TException { ByteBuffer tableName = getByteBuffer(table); List<ByteBuffer> blist = getColumnsByte(columns); Map<ByteBuffer, ByteBuffer> wrappedAttributes = getAttributesMap(attributes); return hbaseClient.scannerOpenWithStop(tableName, getByteBuffer(startRow), getByteBuffer(stopRow), blist, wrappedAttributes); } public int scannerOpen(String table, String startRow, List<String> columns, Map<String, String> attributes) throws TException { ByteBuffer tableName = getByteBuffer(table); List<ByteBuffer> blist = getColumnsByte(columns); Map<ByteBuffer, ByteBuffer> wrappedAttributes = getAttributesMap(attributes); return hbaseClient.scannerOpen(tableName, getByteBuffer(startRow), blist, wrappedAttributes); } public void scannerClose(int id) throws TException { hbaseClient.scannerClose(id); } public List<ByteBuffer> getColumnsByte(List<String> columns) { List<ByteBuffer> blist = new ArrayList<ByteBuffer>(); for(String column : columns) { blist.add(getByteBuffer(column)); } return blist; } protected byte[] toBytes(ByteBuffer buffer) { byte[] bytes = new byte[buffer.limit()]; for (int i = 0; i < buffer.limit(); i++) { bytes[i] = buffer.get(); } return bytes; } public List<TRowResult> getRow(String table, String row, Map<String, String> attributes) throws TException { ByteBuffer tableName = getByteBuffer(table); Map<ByteBuffer, ByteBuffer> wrappedAttributes = getAttributesMap(attributes); return hbaseClient.getRow(tableName, getByteBuffer(row), wrappedAttributes); } public List<String> getTableNames() throws TTransportException { ArrayList<String> tableNames = new ArrayList<String>(); try { for (ByteBuffer name : hbaseClient.getTableNames()) { tableNames.add(byteBufferToString(name)); } return tableNames; } catch (Exception e) { e.printStackTrace(); return null; } } private static Map<ByteBuffer, ByteBuffer> getAttributesMap(Map<String, String> attributes) { Map<ByteBuffer, ByteBuffer> attributesMap = null; if(attributes != null && !attributes.isEmpty()) { attributesMap = new HashMap<ByteBuffer, ByteBuffer>(); for(Map.Entry<String, String> entry : attributes.entrySet()) { attributesMap.put(getByteBuffer(entry.getKey()), getByteBuffer(entry.getValue())); } } return attributesMap; } public static String byteBufferToString(ByteBuffer buffer) { CharBuffer charBuffer = null; try { Charset charset = Charset.forName(CHAR_SET); CharsetDecoder decoder = charset.newDecoder(); charBuffer = decoder.decode(buffer); buffer.flip(); return charBuffer.toString(); } catch (Exception ex) { ex.printStackTrace(); return null; } } public static ByteBuffer getByteBuffer(String str) { return ByteBuffer.wrap(str.getBytes()); } public void openTransport() throws TTransportException { if (socket != null) { socket.open(); } } public void closeTransport() throws TTransportException { if (socket != null) { socket.close(); } } }
demo:
https://github.com/ssw239/java-thrift-hbase-io/blob/master/HBaseThriftClient.java
https://github.com/randomtask1155/HbaseThriftTest/blob/master/src/main/java/io/pivotal/support/HbaseThriftTest.java
https://github.com/mypgether/study-demo
https://github.com/apache/hbase/blob/master/hbase-examples/src/main/java/org/apache/hadoop/hbase/thrift/DemoClient.java
https://github.com/randomtask1155/HbaseThriftTest/blob/master/src/main/java/io/pivotal/support/HbaseThriftTest.java
相关资料:
https://wiki.apache.org/hadoop/Hbase/ThriftApi
https://thrift.apache.org/
https://hbase.apache.org/1.2/apidocs/org/apache/hadoop/hbase/thrift/package-summary.html
https://blog.csdn.net/power0405hf/article/details/50068901
https://blog.csdn.net/guxch/article/details/12163047