2016-02-17 1 views
1

Здравствуйте, я пытаюсь создать клиент nodejs для запроса моей базы данных hive с помощью бережливости, но у меня возникла странная проблема ... Я сгенерировал свой API-интерфейс nodejs с помощью бережливости (thrift -r --gen js:node TCLIService.thrift с TCLIService, являющимся экономичным файлом, определяющим Hive services), и теперь я пытаюсь подключиться к Hive, но мой OpenSession находится на рассмотрении ... Возможно, я не делаю правильный вызов, но я не нашел ничего нового в сети (каждый проект trift/node/hive составляет 4 или 5 лет). Можете ли вы взглянуть и сказать мне, если я делаю это неправильно? БлагодаряHive - Thrift - Отсутствует версия в readMessageBegin, старый клиент?

TCLIService.thrift:

// OpenSession() 
// 
// Open a session (connection) on the server against 
// which operations may be executed. 
struct TOpenSessionReq { 
    // The version of the HiveServer2 protocol that the client is using. 
    1: required TProtocolVersion client_protocol = TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V8 

    // Username and password for authentication. 
    // Depending on the authentication scheme being used, 
    // this information may instead be provided by a lower 
    // protocol layer, in which case these fields may be 
    // left unset. 
    2: optional string username 
    3: optional string password 

    // Configuration overlay which is applied when the session is 
    // first created. 
    4: optional map<string, string> configuration 
} 

service TCLIService { 
    TOpenSessionResp OpenSession(1:TOpenSessionReq req); 
} 

Nodejs код: вар sessionHandle = '';

function openSession(config) { 
    openSessReq = new ttypes.TOpenSessionReq(); 
    openSessReq.client_protocol = ttypes.TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V8; 
    openSessReq.username = config.hiveUser; 
    openSessReq.password = config.hivePassword; 
    console.log("openSessReq = " + JSON.stringify(openSessReq)); 
    console.log("Before OpenSession : sessionHandle = " + sessionHandle); 
    sessionHandle = client.OpenSession(openSessReq, function (err, result){ 
     console.log('handler fired ... '); 
     if (err) { 
      console.error("error : " + err); 
     } else { 
      console.log("result : " + result); 
     } 
    }); 
    console.log("After OpenSession : sessionHandle = " + sessionHandle); 
} 

connection.on('error', function(err) { 
    /*Error detected, print the error*/ 
    console.error(err); 
    /*Close the program with error code*/ 
    process.exit(1) 
}); 

console.log('Error handler registered ...') 

connection.on('connect', function(){ 
    console.log('Connected ...'); 
    /*Init session*/ 
    console.log(client); 
    openSession(config); 
} 

Мой выход следующий:

CreateConnection DONE ... 
Error handler registered ... 
Connect handler registered ... 
Connected ... 
{ output: 
    TBufferedTransport { 
    defaultReadBufferSize: 1024, 
    writeBufferSize: 512, 
    inBuf: <Buffer e8 19 2b 03 00 00 00 00 b0 1a 2b 03 00 00 00 00 e8 18 2b 03 00 00 00 00 f0 18 2b 03 00 00 00 00 b0 19 2b 03 00 00 00 00 78 1a 2b 03 00 00 00 00 70 1d ... >, 
    readCursor: 0, 
    writeCursor: 0, 
    outBuffers: [], 
    outCount: 0, 
    onFlush: [Function], 
    client: [Circular] }, 
    pClass: [Function: TBinaryProtocol], 
    _seqid: 0, 
    _reqs: {} } 
openSessReq = {"client_protocol":7,"username":"root","password":"root","configuration":null} 
Before OpenSession : sessionHandle = 
After OpenSession : sessionHandle = undefined 
^C 

Скрипт работает на неопределенный срок ... Если изменить порт или выключение HiveServer я обращенную ошибку, так что соединение работает, но я могу не узнайте, почему openSession нет! Спасибо за вашу помощь

EDIT: Я проверил мои журналы и идентификация NOSASL был вопрос ... Я исправил (я думаю) этот вопрос и теперь получаю следующее сообщение об ошибке:

Клиент:

{ [Error: write EPIPE] 
code: 'EPIPE', 
errno: 'EPIPE', 
syscall: 'write', 
address: undefined } 

Сервер:

2016-02-17 13:36:37,152 ERROR org.apache.thrift.server.TThreadPoolServer: [HiveServer2-Handler-Pool: Thread-24]: Thrift error occurred during processing of message. 
    org.apache.thrift.protocol.TProtocolException: Missing version in readMessageBegin, old client? 
     at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:228) 
     at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:27) 
     at org.apache.hive.service.auth.TSetIpAddressProcessor.process(TSetIpAddressProcessor.java:56) 
     at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:285) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at java.lang.Thread.run(Thread.java:745) 

Я прочитал, что этот вопрос должен быть поднят с помощью неправильного уровня протокола ... Я использую TBinaryProtocol является его проблема?

+0

Если у вас есть вопросы, задайте два вопроса. Если у вас есть только один, удалите остальные. – JensG

ответ

0

Я исправил мою проблему, выполнив следующие действия:

Проверьте версию протокола моего HiveServer2 с помощью пчелиного воска и запрашивает мой HiveServer2 (с Hue) и журналов проверка HiveServer2 (я нашел, что это было HIVE_CLI_SERVICE_PROTOCOL_V7 для улья 0,15 +0,0)

Включить проверку подлинности NOSASL на моем HiveServer2 путем изменения улья-site.xml

+0

Странно, я не нашел ни одного HIVE_CLI_SERVICE_PROTOCOL_V7 в моем журнале, его тоже не настраиваем, я использую Hive 1.1.0 – tribbloid

0

Попробуйте проверить три части вашей среды, все три находятся в файле конфигурации (тот же hive-site.xml) по умолчанию:

  1. transportMode check hive.server2.transport.mode, вы должны использовать тот же режим в сервисе и клиенте.

  2. ssl enable check hive.server2.use.SSL, вы можете попробовать закрыть, чтобы убедиться, что это не имеет никакого отношения к этой конфигурации.

  3. Auth проверка hive.server2.authentication, так как там есть несколько видов (NONE, NOSASL, KERBEROS, LDAP, CUSTOM) из режима AUTH, убедитесь, что вы используете правильный один.

PS.Вы можете попытаться подключиться к консоли hs2 и посмотреть, нет ли чего-то не так с сервером.