4

Итак, я пытаюсь запросить мой кластер hbase на Amazon ec2, используя пользовательский jar i, запускаемый как шаг MapReduce. Im мой баночку (внутри функции карты) Я называю Hbase, как так:Проблема с использованием hbase из java на Amazon EMR

public void map(Text key, BytesWritable value, Context contex) throws IOException, InterruptedException { 
    Configuration conf = HBaseConfiguration.create(); 
    HTable table = new HTable(conf, "tablename"); 
     ... 

проблема заключается в том, что, когда он попадает в эту HTable линию и пытается подключиться к HBase, шаг терпит неудачу, и я получаю следующие ошибки:

2014-02-28 18:00:49,936 INFO [main] org.apache.zookeeper.ZooKeeper: Initiating client connection, connectString=localhost:2181 sessionTimeout=180000 watcher=hconnection 
2014-02-28 18:00:49,974 INFO [main] org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper: The identifier of this process is [email protected] 
2014-02-28 18:00:49,998 INFO [main-SendThread(localhost:2181)] org.apache.zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error) 
2014-02-28 18:00:50,005 WARN [main-SendThread(localhost:2181)] org.apache.zookeeper.ClientCnxn: Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect 
java.net.ConnectException: Connection refused 

     ... 

2014-02-28 18:01:05,542 WARN [main] org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper: Possibly transient ZooKeeper exception: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/hbaseid 
2014-02-28 18:01:05,542 ERROR [main] org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper: ZooKeeper exists failed after 3 retries 
2014-02-28 18:01:05,542 WARN [main] org.apache.hadoop.hbase.zookeeper.ZKUtil: hconnection Unable to set watcher on znode (/hbase/hbaseid) 
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/hbaseid 

     ... and on and on 

Я могу использовать оболочку hbase просто отлично и может запрашивать данные и все, что находится в оболочке. Я понятия не имею, с чего начать, и я уже много часов искал, не повезло. Большинство проблем, подобных этому в Интернете, не говорят об особых исправлениях Amazon. Я подумал, что zookeeper и hbase должны автоматически подключаться к ботстрапу amazon.

Я использую hbase 0.94.17 jar и amazon работает hbase 0.94.7 im довольно уверен, что это не проблема, я предполагаю, что он больше не меняет код Java правильно. Если кто-то может помочь с этим, то он будет очень благодарен. Спасибо

+0

поэтому, установив кворум zookeeper в код (conf.set («hbase.zookeeper.quorum», «»);) Мне удалось заставить его работать, но я не могу жестко кодировать мои главные узлы ip в мою java каждый раз. Кажется, что если я этого не делаю, кворум вытаскивается из некоторой конфигурации как «localhost» вместо кворума главного узла, что и установлено в моих конфигурациях hadoop (hdfs-сайт, mapred-site и т. Д.). Где локальный хост вытаскивается из? –

ответ

6

Ну, после почти 30 часов попыток я нашел решение. Существует много предостережений, и версии важны.

В этом случае я использую amazon emr hadoop2 (ami 3.0.4) с Hbase 0.94.7, а Im пытается запустить пользовательскую банку в том же кластере, чтобы получить доступ к hbase локально через java.

Итак, во-первых, конфигурация hbase по умолчанию не будет работать из-за внешних/внутренних IP-идиосинхронностей, с которыми сталкивается EC2. Таким образом, вы не можете использовать HConfiguration (потому что он по умолчанию используется для кворума localhost). . Что вам нужно сделать, это использовать конфигурацию, которую настраивает Amazon для вас (находится в /home/hadoop/hbase/conf/hbase-site.xml) и просто вручную добавьте его в пустой объект конфигурации.

код Соединение выглядит следующим образом:

Configuration conf = new Configuration(); 
conf.addResource("/home/hadoop/hbase/conf/hbase-site.xml"); 
HBaseAdmin.checkHBaseAvailable(conf); 

Во-вторых, вы должны использовать правильный Hbase банку упаковывают в пользовательском банке. Причина в том, что hbase 94.x скомпилирован по умолчанию для hadoop1, поэтому вам нужно захватить банку cloudera hbase с именем hbase-0.94.6-cdh4.3.0.jar (вы можете найти это в Интернете), которая была скомпилирована против hadoop2. Если вы не сделаете эту часть, вы получите много неприятных, не подлежащих рекламе ошибок, включая исключение org.apache.hadoop.net.NetUtils.

+0

Я чувствую, что я рядом! Я получаю 'java.net.UnknownHostException: неизвестный хост: ip-my-internal-id-addres.ec2.internal', за которым следует« MasterNotRunningException ». Любые мысли по этому поводу? – Gevorg

+0

похоже, что hbase не запускается правильно. Ive заметил, что некоторые типы экземпляров не вращают hbase правильно по вине EMAZ Amazon. Сначала попробуйте запустить все на m1.xlarges, а затем поэкспериментировать с конфигурациями экземпляров. –

Смежные вопросы