2016-01-19 4 views
0

Я использую happybase для подключения к моей базе данных Hbase. Я сделал образец таблицы под названием «irisSample». Вот часть кода, с которым у меня возникают проблемы:Как мне получить ошибку «TApplicationException: Внутренняя ошибка обработки mutateRows»?

import happybase 
from happybase import * 
import json 

connection = happybase.Connection('<ip-address>', '9090') 

table = connection.table('irisSample') 

n = 0 
x = 1 
for u in y: 
    data = {'petalWidth':points['petalWidth'][n], 'sepalLength':points['sepalLength'][n], 
      'petalLength':points['petalLength'][n], 'label': u} 
    row = 'row' + str(x) 
    table.put(row, {'flowers': str(data)}) 
    n += 1 
    x += 1 

И я получаю следующее.

TApplicationException      Traceback (most recent call last) 
<ipython-input-15-94741a8b04dc> in <module>() 
     9   'petalLength':points['petalLength'][n], 'label': u} 
    10  row = 'row' + str(x) 
---> 11  table.put(row, {'flowers': str(data)}) 
    12  n += 1 
    13  x += 1 

/root/anaconda/lib/python2.7/site-packages/happybase/table.pyc in put(self, row, data, timestamp, wal) 
    437   """ 
    438   with self.batch(timestamp=timestamp, wal=wal) as batch: 
--> 439    batch.put(row, data) 
    440 
    441  def delete(self, row, columns=None, timestamp=None, wal=True): 

/root/anaconda/lib/python2.7/site-packages/happybase/batch.pyc in __exit__(self, exc_type, exc_value, traceback) 
    130    return 
    131 
--> 132   self.send() 

/root/anaconda/lib/python2.7/site-packages/happybase/batch.pyc in send(self) 
    53      self._table.name, self._mutation_count, len(bms)) 
    54   if self._timestamp is None: 
---> 55    self._table.connection.client.mutateRows(self._table.name, bms, {}) 
    56   else: 
    57    self._table.connection.client.mutateRowsTs(

/root/anaconda/lib/python2.7/site-packages/happybase/hbase/Hbase.pyc in mutateRows(self, tableName, rowBatches, attributes) 
    1574  """ 
    1575  self.send_mutateRows(tableName, rowBatches, attributes) 
-> 1576  self.recv_mutateRows() 
    1577 
    1578 def send_mutateRows(self, tableName, rowBatches, attributes): 

/root/anaconda/lib/python2.7/site-packages/happybase/hbase/Hbase.pyc in recv_mutateRows(self) 
    1592  x.read(self._iprot) 
    1593  self._iprot.readMessageEnd() 
-> 1594  raise x 
    1595  result = mutateRows_result() 
    1596  result.read(self._iprot) 

TApplicationException: Internal error processing mutateRows 

Я также попытался json.dumps(data) вместо str(data) что повергло же исключение.

От того, что я собираю, это больше похоже на проблему с сугробами, но я могу ошибаться. Возможно, мне придется взглянуть на звездную базу. Я не знаю, поэтому я спрашиваю вас, ребята.

ответ

-1

Я нашел ответ here. Для работы с неиспользуемым портом требуется REST-инфраструктура. Затем я подключился к этому порту и смог увидеть список всех таблиц в Hbase и вставить данные в базу данных. Команда ./hbase-daemon.sh start rest -p <unused port number>. Я не мог найти ответ нигде, и никто даже не прокомментировал несколько дней, поэтому я надеюсь, что это поможет вам! Вот код. Я закончил с использованием starbase.

import starbase 
from starbase import Connection 

c = Connection(host='<ip-address>', port=8000) 

8000 - это по умолчанию порт по умолчанию.

t = c.table('irisSample') 

for flower in range(len(labels)): 
    data = {'petalWidth':X[flower][3], 'petalLength':X[flower][2], 
       'sepalLength':X[flower][0], 'sepalWidth':X[flower][1], 'cluster': labels[flower]} 
    n += 1 
    row = 'row' + str(n) 
    t.insert(row, {'flowers': data}) 
+1

Это не решение исходной проблемы. использование совершенно другого метода доступа не является решением, фиксируя вашу структуру данных. –

+0

Он решил проблему. Вы не можете использовать THRIFT для помещения данных в таблицу. Таблица кластеризована, и вам нужно запустить REST на неиспользуемом порту на другом компьютере, если вы хотите поместить данные в таблицу. Это решение. Мне не нужно ничего менять, кроме машины, в которую я помещал данные. – NickTheInventor

1

Похоже, что в вашем объекте «данные» вы не указываете семейство столбцов вместе с именем столбца.

data = {'petalWidth':points['petalWidth'[n], 'sepalLength':points['sepalLength'][n], 'petalLength':points['petalLength'][n], 'label': u} 

Вам необходимо иметь семейство столбцов перед каждым значением столбца. Например, ваше семейство столбцов «cf», а вместо «petalWidth» вы хотите «cf: petalWidth».

data = {'cf:petalWidth':points['petalWidth'[n], 'cf:sepalLength':points['sepalLength'][n], 'cf:petalLength':points['petalLength'][n], 'cf:label': u} 

Для этого исправлена ​​ошибка mutateRows.

+0

Вы не можете использовать THRIFT для ввода данных в HBase. Вот в чем проблема. – NickTheInventor

+0

Я использовал его для размещения данных в HBase. Итак, я не уверен, что вы имеете в виду. – rye

+0

Когда я пытался использовать THRIFT, я не мог поместить данные, но когда я использовал REST, мне не нужно ничего менять для кода, просто порт и IP-адрес, куда данные попадают в hbase. Ошибок в мутации не было. Возможно, вы можете использовать THRIFT, но я нашел способ обойти его. – NickTheInventor