天天看點

impala內建kerberos問題一例

最近在折騰hadoop+kerberos,由于線上使用的元件比較多,遇到不少問題,記錄下來,碰到同樣問題的同學可以參考下。

在hdfs+mapred+kerberos運作正常後,開始嘗試內建impala.

其中statestore的參數:

1

2

<code>export</code> <code>IMPALA_STATE_STORE_ARGS=${IMPALA_STATE_STORE_ARGS:- -log_dir=${IMPALA_LOG_DIR} \</code>

<code>    </code><code>-state_store_port=${IMPALA_STATE_STORE_PORT} -kerberos_reinit_interval=60 -principal=impala</code><code>/xxxxxx</code><code>@KERBEROS_HADOOP -keytab_file=</code><code>/etc/impala/conf</code><code>.dist</code><code>/impala</code><code>.keytab}</code>

impala-server的參數:

3

4

<code>export</code> <code>IMPALA_SERVER_ARGS=${IMPALA_SERVER_ARGS:- -log_dir=${IMPALA_LOG_DIR} \</code>

<code>  </code><code>-state_store_port=${IMPALA_STATE_STORE_PORT} -use_statestore -state_store_host=${IMPALA_STATE_STORE_HOST} \</code>

<code>  </code><code>-be_port=${IMPALA_BACKEND_PORT} -statestore_subscriber_timeout_seconds=${STATESTORE_SUBSCRIBER_TIMEOUT_SECONDS} -mem_limit=50% \</code>

<code>    </code><code>-kerberos_reinit_interval=60 -principal=impala</code><code>/xxxxx</code><code>@KERBEROS_HADOOP -keytab_file=</code><code>/etc/impala/conf</code><code>.dist</code><code>/impala</code><code>.keytab}</code>

啟動statestore沒有異常,因為在impala 1.1.1版本中,statestore隻是做一個監控impala-server程序的作用,不涉及和hadoop的通信,而在啟動impala-server時,發現程序運作一段時間之後就會crash,通過設定impala的日志級别export GLOG_v=3,可以在日志中觀察到下面的錯誤:

5

6

7

<code>E0305 17:29:06.696974 12551 UserGroupInformation.java:1411] PriviledgedActionException as:impala</code><code>/datanode</code><code>@KERBEROS_HADOOP (auth:KERBEROS)</code>

<code>cause:java.io.IOException: Couldn't setup connection </code><code>for</code> <code>impala</code><code>/gd6g12s103-hadooptest-datanode</code><code>.idc.vipshop.com@KERBEROS_HADOOP to hdfs</code><code>/namenode</code><code>@KERBEROS_HADOOP</code>

<code>E0305 17:29:06.699252 12551 impala-server.cc:339] Could not </code><code>read</code> <code>the HDFS root directory at hdfs:</code><code>//bipcluster</code><code>. Error was:</code>

<code>Failed on </code><code>local</code> <code>exception: java.io.IOException: Couldn't setup connection </code><code>for</code> <code>impala</code><code>/gdatanode</code><code>@KERBEROS_HADOOP to</code>

<code>hdfs</code><code>/namenode</code><code>@KERBEROS_HADOOP; Host Details : </code><code>local</code> <code>host is: </code><code>"datanode/ip"</code><code>;</code>

<code>destination host is: </code><code>"namenode"</code><code>:8020;</code>

<code>E0305 17:29:06.699296 12551 impala-server.cc:341] Aborting Impala Server startup due to improper configuration</code>

可以看到确實再用kerbers做驗證登陸,但是在datanode和namenode通信時出現錯誤,因為線上用了namenode的ha,在日志中發現有ha的報錯,因為懷疑是ha的問題,在關閉ha後,問題仍然存在。

日志中還有tgt相關的報錯:

<code>Caused by: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to </code><code>find</code> <code>any Kerberos tgt)]</code>

但是手動通過kinit驗證,是可以擷取tgt的,說明tgt的驗證是ok的。

在datanode端,運作hadoop fs -ls 的指令時,報錯。通過export HADOOP_ROOT_LOGGER=DEBUG,console 設定hadoop指令的日志級别,發現也是同樣報了tgt相關的錯誤。

在通過klist檢視tgt的cache,發現tgt竟然過期了,而且不能進行kinit -R.

<code>klist</code>

<code>Ticket cache: FILE:</code><code>/tmp/krb5cc_501</code>

<code>Default principal: hdfs</code><code>/namenode</code><code>@KERBEROS_HADOOP</code>

<code>Valid starting     Expires            Service principal</code>

<code>03</code><code>/11/14</code> <code>18:45:52  03</code><code>/12/14</code> <code>18:45:52  krbtgt</code><code>/KERBEROS_HADOOP</code><code>@KERBEROS_HADOOP</code>

<code>        </code><code>renew </code><code>until</code> <code>03</code><code>/11/14</code> <code>18:45:56</code>

這是由于renew expires導緻,kerberos中有兩個時間比較重要:

max_list,tgt的有效時間,max_renewable_life ,renew的時間,在max_renewable_life 時間内,過期的tgt可以renew,如果時間超過max_renewable_life就不能renew了。。

檢視線上的設定:

<code>max_life = 25h</code>

<code>max_renewable_life = 4w</code>

而實際renew 的最大時間卻是4s(03/11/14 18:45:56-03/11/14 18:45:52),看來w不是week的意思。。不知道算不算bug,修正下,改成30d,重新kinit,就正常了。。

後面如果報Kerberos: Couldn't find mech GSSAPI 說明是cyrus-sasl-gssapi的相關包沒有安裝。

啟動正常後驗證:

8

9

10

11

12

<code>impala-shell -i  ip -k  -s impala</code>

<code>Starting Impala Shell </code><code>in</code> <code>secure mode (using Kerberos)</code>

<code>[10.19.111.106:21000] &gt; use cdnlog;</code>

<code>Query: use cdnlog</code>

<code>[10.19.111.106:21000] &gt; </code><code>select</code> <code>count(1) from dd_log;</code>

<code>Query: </code><code>select</code> <code>count(1) from dd_log</code>

<code>Query finished, fetching results ...</code>

<code>+----------+</code>

<code>| count(1) |</code>

<code>| 5000000  |</code>

可以看到已經正常跑了,自己對kerberos的了解還是太少了,在解決kerberos的相關問題的時候,第一步就應該用klist驗證。。

本文轉自菜菜光 51CTO部落格,原文連結:http://blog.51cto.com/caiguangguang/1381323,如需轉載請自行聯系原作者

繼續閱讀