2016-02-01 31 views
7

Ho creato un'implementazione personalizzata dell'interfaccia PasswdAuthenticationProvider, basata su OAuth2. Penso che il codice sia irrilevante per il problema che sto vivendo, tuttavia, può essere trovato here.HiveServer2: Eccezione correlata SASL di deriva quando si utilizza PasswdAuthenticationProvider personalizzato

Ho configurato hive-site.xml con le seguenti proprietà:

<property> 
    <name>hive.server2.authentication</name> 
    <value>CUSTOM</value> 
</property> 
<property> 
    <name>hive.server2.custom.authentication.class</name> 
    <value>com.telefonica.iot.cosmos.hive.authprovider.OAuth2AuthenticationProviderImpl</value> 
</property> 

Poi ho riavviato il servizio Hive e ho collegato un client remoto basato JDBC con successo. Questo è un esempio di un percorso di successo si trovano in /var/log/hive/hiveserver2.log:

2016-02-01 11:52:44,515 INFO [pool-5-thread-5]: authprovider.HttpClientFactory (HttpClientFactory.java:<init>(66)) - Setting max total connections (500) 
2016-02-01 11:52:44,515 INFO [pool-5-thread-5]: authprovider.HttpClientFactory (HttpClientFactory.java:<init>(67)) - Setting default max connections per route (100) 
2016-02-01 11:52:44,799 INFO [pool-5-thread-5]: authprovider.HttpClientFactory (OAuth2AuthenticationProviderImpl.java:Authenticate(65)) - Doing request: GET https://account.lab.fiware.org/user?access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx HTTP/1.1 
2016-02-01 11:52:44,800 INFO [pool-5-thread-5]: authprovider.HttpClientFactory (OAuth2AuthenticationProviderImpl.java:Authenticate(76)) - Response received: {"organizations": [], "displayName": "frb", "roles": [{"name": "provider", "id": "106"}], "app_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "email": "[email protected]", "id": "frb"} 
2016-02-01 11:52:44,801 INFO [pool-5-thread-5]: authprovider.HttpClientFactory (OAuth2AuthenticationProviderImpl.java:Authenticate(104)) - User frb authenticated 
2016-02-01 11:52:44,868 INFO [pool-5-thread-5]: thrift.ThriftCLIService (ThriftCLIService.java:OpenSession(188)) - Client protocol version: HIVE_CLI_SERVICE_PROTOCOL_V6 
2016-02-01 11:52:44,871 INFO [pool-5-thread-5]: session.SessionState (SessionState.java:start(358)) - No Tez session required at this point. hive.execution.engine=mr. 
2016-02-01 11:52:44,873 INFO [pool-5-thread-5]: session.SessionState (SessionState.java:start(358)) - No Tez session required at this point. hive.execution.engine=mr. 

Il problema è dopo che il seguente errore compare in maniera ricorrente:

2016-02-01 11:52:48,227 ERROR [pool-5-thread-4]: server.TThreadPoolServer (TThreadPoolServer.java:run(215)) - Error occurred during processing of message. 
java.lang.RuntimeException: org.apache.thrift.transport.TTransportException 
    at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:219) 
    at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:189) 
    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) 
Caused by: org.apache.thrift.transport.TTransportException 
    at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:132) 
    at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84) 
    at org.apache.thrift.transport.TSaslTransport.receiveSaslMessage(TSaslTransport.java:182) 
    at org.apache.thrift.transport.TSaslServerTransport.handleSaslStartMessage(TSaslServerTransport.java:125) 
    at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:253) 
    at org.apache.thrift.transport.TSaslServerTransport.open(TSaslServerTransport.java:41) 
    at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:216) 
    ... 4 more 
2016-02-01 11:53:18,323 ERROR [pool-5-thread-5]: server.TThreadPoolServer (TThreadPoolServer.java:run(215)) - Error occurred during processing of message. 
java.lang.RuntimeException: org.apache.thrift.transport.TTransportException 
    at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:219) 
    at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:189) 
    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) 
Caused by: org.apache.thrift.transport.TTransportException 
    at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:132) 
    at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84) 
    at org.apache.thrift.transport.TSaslTransport.receiveSaslMessage(TSaslTransport.java:182) 
    at org.apache.thrift.transport.TSaslServerTransport.handleSaslStartMessage(TSaslServerTransport.java:125) 
    at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:253) 
    at org.apache.thrift.transport.TSaslServerTransport.open(TSaslServerTransport.java:41) 
    at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:216) 
    ... 4 more 

Perché? Ho visto in molte altre domande questo si verifica quando si utilizza il valore predefinito di hive.server2.authentication, ad esempio SASL e il client non sta facendo l'handshake. Ma nel mio caso, il valore di una tale proprietà è CUSTOM. Non riesco a capirlo, e ogni aiuto sarebbe molto apprezzato.

EDIT 1

ho trovato ci sono richieste periodiche al HiveServer2 ... dal HiveServer2 stessa! Queste sono le richieste che risultano in errori SASL di deriva:

$ sudo tcpdump -i lo port 10000 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes 
... 
... 
10:18:48.183469 IP dev-fiwr-bignode-11.hi.inet.ndmp > dev-fiwr-bignode-11.hi.inet.55758: Flags [.], ack 7, win 512, options [nop,nop,TS val 1034162147 ecr 1034162107], length 0 
^C 
21 packets captured 
42 packets received by filter 
0 packets dropped by kernel 
[[email protected] ~]$ sudo netstat -nap | grep 55758 
tcp  0  0 10.95.76.91:10000   10.95.76.91:55758   CLOSE_WAIT 7190/java   
tcp  0  0 10.95.76.91:55758   10.95.76.91:10000   FIN_WAIT2 -     
[[email protected] ~]$ ps -ef | grep 7190 
hive  7190  1 1 10:10 ?  00:00:10 /usr/java/jdk1.7.0_71//bin/java -Xmx1024m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/var/log/hadoop/hive -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/usr/lib/hadoop -Dhadoop.id.str=hive -Dhadoop.root.logger=INFO,console -Djava.library.path=:/usr/lib/hadoop/lib/native/Linux-amd64-64:/usr/lib/hadoop/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Xmx1024m -Xmx4096m -Dhadoop.security.logger=INFO,NullAppender org.apache.hadoop.util.RunJar /usr/lib/hive/lib/hive-service-0.13.0.2.1.7.0-784.jar org.apache.hive.service.server.HiveServer2 -hiveconf hive.metastore.uris=" " -hiveconf hive.log.file=hiveserver2.log -hiveconf hive.log.dir=/var/log/hive 
1011  14158 12305 0 10:19 pts/1 00:00:00 grep 7190 

Qualche idea?

EDIT 2

Più ricerca sui collegamenti inviati da HiveServer2 a HiveServer2. I pacchetti di dati hanno sempre inviato 5 byte, i seguenti (esadecimali): 22 41 30 30 31

Qualche idea su queste connessioni?

risposta

0

Alla fine ho "risolto" questo. Dal momento che il messaggio è stato inviato dall'agente Ambari in esecuzione nella macchina HiveServer2 (alcuni re di ping strano), ho semplicemente aggiunto un iptables regola bloccando tutte le connessioni a porta TCP/10000 sull'interfaccia di loopback:

iptables -A INPUT -i lo -p tcp --dport 10000 -j DROP 

Di Certo, ora Ambari avverte che HiveServer2 non è vivo (i ping sono rilasciati). E la regola sopra deve essere rimossa se voglio riavviare il server da Ambari (c'è un altro controllo attivo nello script di partenza); poi dopo il riavvio posso riabilitare la regola. Bene, posso conviverci.