HBase java client example
Устанавливаем соединение с HBase из Java
Продолжаем изучение HBase. После настройки сервера HBase, и проверки его работоспособности, можно попробовать соединиться с ним из клиентского приложения на Java.
1. Отключим авторизацию.
Соединение устанавливаем с удалённым сервером, поэтому для соединения с сервером пришлось отключить всю авторизацию. Настройка авторизации Kerberos - отдельная большая задача.
Для отключения авторизации в hadoop пришлось внести изменения в файле core-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://server:9000/</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>hadoop.http.authentication.simple.anonymous.allowed</name>
<value>true</value>
</property>
</configuration>
2. Пишем код клиента.
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; public class HBaseConnector { public static void main(String[] args) throws IOException { Configuration config = HBaseConfiguration.create(); config.clear(); config.set("hbase.zookeeper.quorum", "server"); config.set("hbase.zookeeper.property.clientPort","2181"); config.set("hbase.master", "localhost:60010"); HTable table = new HTable(config, "books"); Put p = new Put(Bytes.toBytes("row1")); p.add(Bytes.toBytes("property"), Bytes.toBytes("title"), Bytes.toBytes("Forest gump")); table.put(p); Get g = new Get(Bytes.toBytes("row1")); Result r = table.get(g); byte[] value = r.getValue(Bytes.toBytes("property"), Bytes.toBytes("title")); String valueStr = Bytes.toString(value); System.out.println("GET: " + valueStr); Scan s = new Scan(); s.addColumn(Bytes.toBytes("property"), Bytes.toBytes("title")); ResultScanner scanner = table.getScanner(s); try { for (Result rr = scanner.next(); rr != null; rr = scanner.next()) { System.out.println("Found row: " + rr+":"+Bytes.toString(rr.getValue(Bytes.toBytes("property"), Bytes.toBytes("title")))); } // for (Result rr : scanner) { // System.out.println("Found row: " + rr); // } } finally { scanner.close(); } } }
3. Настраиваем classpath
Для того чтобы всё корректно соединилось пришлось помучиться с classpath. Итоговая подборка jar-файлов:
У меня например попалось исключение:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/protobuf/generated/MasterProtos$MasterService$BlockingInterface at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:169) at org.apache.hadoop.hbase.client.HConnectionManager.createConnection(HConnectionManager.java:371) at org.apache.hadoop.hbase.client.HConnectionManager.createConnection(HConnectionManager.java:360) at org.apache.hadoop.hbase.client.HConnectionManager.getConnection(HConnectionManager.java:244) at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:187) at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:149) at hiweb.tests.HBaseConnector.main(HBaseConnector.java:24) Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$BlockingInterface at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ... 8 more
Битва с исходниками показала, что в пути не хватает библиотеки: hbase-protocol-0.96.0-hadoop1.jar.
К сведению: Во время битвы с jar пострадала версия HBase, которая была обновлена до 0.96. Повлияло это на работоспособность или нет, не понятно. Найти файл hbase-client-0.94.12.jar у меня не получилось, что странно для стабильной версии, которую рекомендуют к установке.
4. Запускаем клиента HBase
Запускаем класс как standalone java-приложение и наслаждаемся результатом:
2013-10-21 10:21:58,380 INFO RecoverableZooKeeper:120 Process identifier=hconnection-0x353c375 connecting to ZooKeeper ensemble=server:2181 58 [main-SendThread(server:2181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server server/5.9.28.4:2181. Will not attempt to authenticate using SASL (Unable to locate a login configuration) 120 [main-SendThread(server:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to server/5.9.28.4:2181, initiating session 314 [main-SendThread(server:2181)] INFO org.apache.zookeeper.ClientCnxn - Session establishment complete on server server/5.9.28.4:2181, sessionid = 0x141d9729d540015, negotiated timeout = 90000 GET: Romeo and Juliet Found row: keyvalues={row1/property:title/1382336521888/Put/vlen=16/mvcc=0}:Romeo and Juliet Found row: keyvalues={row2/property:title/1382274991210/Put/vlen=9/mvcc=0}:Moby Dick Found row: keyvalues={row3/property:title/1382275024575/Put/vlen=13/mvcc=0}:War and Peace