Подтвердить что ты не робот

Как подключиться к удаленному HBase в Java?

У меня есть отдельный сервер HBase. Это мой hbase-site.xml:

<configuration>
 <property>
    <name>hbase.rootdir</name>
    <value>file:///hbase_data</value>
  </property>
</configuration>

Я пытаюсь написать программу Java для управления данными в HBase.

Если я запускаю программу на сервере HBase, она работает нормально. Но я не знаю, как настроить его для удаленного доступа.

  Configuration config = HBaseConfiguration.create();
   HTable table = new HTable(config, "test");
   Scan s = new Scan();

Я попытался добавить IP и Port, он не работает:

config.set("hbase.master", "146.169.35.28:60000")

Может ли кто-нибудь сказать мне, как это сделать?

Спасибо!

4b9b3361

Ответ 1

Вот фрагмент из системы, которую мы используем для создания HTable, который мы используем для подключения к HBase

Configuration hConf = HBaseConfiguration.create(conf);
hConf.set(Constants.HBASE_CONFIGURATION_ZOOKEEPER_QUORUM, hbaseZookeeperQuorum);
hConf.setInt(Constants.HBASE_CONFIGURATION_ZOOKEEPER_CLIENTPORT, hbaseZookeeperClientPort);

HTable hTable = new HTable(hConf, tableName);

НТН

EDIT: Пример значений:

public static final String HBASE_CONFIGURATION_ZOOKEEPER_QUORUM                     = "hbase.zookeeper.quorum";
public static final String HBASE_CONFIGURATION_ZOOKEEPER_CLIENTPORT                 = "hbase.zookeeper.property.clientPort";
...
hbaseZookeeperQuorum="PDHadoop1.corp.CompanyName.com,PDHadoop2.corp.CompanyName.com";
hbaseZookeeperClientPort=10000;
tableName="HBaseTableName";

Ответ 2

hbase.master является @Deprecated. Клиенты используют Zookeeper для получения текущего имени хоста/порта своих серверов HBase.

@Deprecated
config.set("hbase.master", "146.169.35.28:60000")

Hadoop и HBase очень чувствительны к настройкам DNS и /etc/hosts. Убедитесь, что ваше имя хоста не указывает на 127.0.0.1, иначе оно запустит многие службы, которые прослушивают только локальный хост. Старайтесь не использовать IP-адреса в любом месте настроек.

Мой /etc/hosts:

192.168.2.3     cloudera-vm     # Added by NetworkManager
127.0.0.1       localhost.localdomain   localhost
127.0.1.1       cloudera-vm-local localhost

/etc/hbase/hbase-site.xml должны иметь настройки set distributed=false (поскольку вы используете это только для тестирования):

<property>
  <name>hbase.cluster.distributed</name>
  <value>false</value>
</property>

/etc/zookeeper/zoo.cfg

# the port at which the clients will connect
clientPort=2181
server.0=cloudera-vm:2888:3888

Список моих процессов Java:

[email protected]:~# jps
1643 TaskTracker
1305 JobTracker
1544 SecondaryNameNode
2037 Bootstrap
9622 DataNode
10144 Jps
9468 NameNode
1948 RunJar
9746 HMaster

Ответ 3

Вкратце это то, что я использую:

    Configuration hBaseConfig =  HBaseConfiguration.create();
    hBaseConfig.setInt("timeout", 120000);
    hBaseConfig.set("hbase.master", "*" + hbaseHost + ":9000*");
    hBaseConfig.set("hbase.zookeeper.quorum",zookeeperHost);
    hBaseConfig.set("hbase.zookeeper.property.clientPort", "2181");

Для hBaseHost и zookeeperHost я просто передаю IP-адрес компьютера кластера, на котором установлен zookeeper. Конечно, вы можете параметризовать номера портов. Я не уверен на 100%, что это лучший способ обеспечить успешную связь, но до сих пор он работает без каких-либо проблем.

Ответ 4

Насколько я знаю, если вы хотите подключиться к удаленному серверу hbase обычный java-клиент не работает, в котором мы просто объявляем конфигурацию и пытаемся подключиться к удаленному hbase, как указано в драгоценных ответах.

Я пробовал это выше, но так и не смог. Вместо этого я использовал Thrift API для подключения к удаленному серверу,

Эта ссылка является лучшим примером использования java-клиента Thrift API. Это, безусловно, работает. Я использую то же самое. Но прежде чем использовать его, внимательно прочитайте код и испустите те предметы, которые вам не нужны. Я также даю образец кода для того же, который успешно работает.

public class ThriftClient 
{

    port = 9090;
    //Connection to hbase
    TTransport transport = new TSocket(hostname, port);
    TProtocol protocol = new TBinaryProtocol(transport, true, true);
    Hbase.Client client = new Hbase.Client(protocol);

    transport.open();

    int z=Link.length();
    byte[] tablename = bytes("YOUR TABLE NAME");

    // Create the demo table with two column families, entry: and unused:
    ArrayList<ColumnDescriptor> columns = new ArrayList<ColumnDescriptor>();
    ColumnDescriptor col = null;
    col = new ColumnDescriptor();
    col.name = ByteBuffer.wrap(bytes("YOUR_COLUMN_FAMILY_NAME"));
    col.maxVersions = 10;
    columns.add(col);

    System.out.println("creating table: " + utf8(tablename));
    try 
    {
        client.createTable(ByteBuffer.wrap(tablename), columns);
    } 
    catch (AlreadyExists ae) 
    {
        System.out.println("WARN: " + ae.message);
    }

    Map<ByteBuffer, ByteBuffer> dummyAttributes = null;
    boolean writeToWal = false;
    // Test UTF-8 handling
    byte[] invalid = {(byte) 'f', (byte) 'o', (byte) 'o', (byte) '-',
        (byte) 0xfc, (byte) 0xa1, (byte) 0xa1, (byte) 0xa1, (byte) 0xa1};
    byte[] valid = {(byte) 'f', (byte) 'o', (byte) 'o', (byte) '-',
        (byte) 0xE7, (byte) 0x94, (byte) 0x9F, (byte) 0xE3, (byte) 0x83,
        (byte) 0x93, (byte) 0xE3, (byte) 0x83, (byte) 0xBC, (byte) 0xE3,
        (byte) 0x83, (byte) 0xAB};


    ArrayList<Mutation> mutations;

    // Run some operations on a bunch of rows

    NumberFormat nf = NumberFormat.getInstance();
    nf.setMinimumIntegerDigits(10);
    nf.setGroupingUsed(false);
    byte[] row=bytes("YOUR ROW NAME");

    mutations = new ArrayList<Mutation>();
    mutations.add(new Mutation(false, ByteBuffer.wrap(bytes("YOUR_COLUMN_FAMILY_NAME:YOUR_COLUMN_NAME")), ByteBuffer.wrap(bytes("YOUR_ROW_VALUE")), writeToWal));
    client.mutateRow(ByteBuffer.wrap(tablename), ByteBuffer.wrap(row), mutations, dummyAttributes);

    transport.close();

    // Helper to translate byte[] to UTF8 strings
private static String utf8(byte[] buf) {
    try {
        return decoder.decode(ByteBuffer.wrap(buf)).toString();
    } catch (CharacterCodingException e) {
        return "[INVALID UTF-8]";
    }
}

// Helper to translate strings to UTF8 bytes
private static byte[] bytes(String s) {
    try {
        return s.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return null;
    }
}
}

Ответ 5

В моем случае после многого с /etc/hosts я нашел в файле журнала "hbase-bgi-master-servername.log" следующую строку:

"2017-11-21 19: 56: 32,999 INFO [RS: 0; имя сервера: 45553] regionserver.HRegionServer: Работает как servername.local.lan, 45553,1511290584538, RpcServer на сервереname.local.lan/172.0. 1.2: 45553, sessionid = 0x15fdff039790002"

Всегда убедитесь, что полное имя хоста ( "servername.local.lan" в моем случае) фактически указывает на IP-адрес сервера как на стороне клиента, так и на стороне сервера.