最近在折腾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] > use cdnlog;</code>
<code>Query: use cdnlog</code>
<code>[10.19.111.106:21000] > </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,如需转载请自行联系原作者