<< Установка HBase в режиме псевдо-кластера | На главную | Генерация пароля для cvs >>

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-файлов:

Библиотеки необходимые для запуска клиента HBase

У меня например попалось исключение:

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

 

Ярлыки : ,



Комментировать Отправить TrackBack
На главную