Pig on Tez on Kerberos認証つきCDHクラスタを動作させる


Pig on Tez on 認証つきCDHクラスタで動作させる際に色々手間がかかったのでまとめておきます。

再度記事が書かれた理由

Pig on Tez on CDHクラスタについては、既に以下の2つの記事で書いています。

なのに、何故新たにこんな記事が書かれたかと言いますと、
CDHクラスタのKerberos認証を有効化した結果、Pig on Tezジョブを実行時以下のような例外が連続して発生し、
ジョブが動作しなくなったためです。

Pig_on_Tezジョブ実行時の発生例外
[PigTezLauncher-0] INFO  org.apache.hadoop.hdfs.DFSClient - Created token for hadoop: HDFS_DELEGATION_TOKEN owner=kimutansk@kerberos.local, renewer=yarn, realUser=, issueDate=1111111111111, maxDate=1111111111111, sequenceNumber=1111111111111, masterKeyId=1111111111111 on hdfs:nn-local
[PigTezLauncher-0] INFO  org.apache.tez.common.security.TokenCache - Got dt for hdfs://nn-local; Kind: HDFS_DELEGATION_TOKEN, Service: hdfs:nn-local, Ident: (token for kimutansk: HDFS_DELEGATION_TOKEN [email protected], renewer=yarn, realUser=, issueDate=1111111111111, maxDate=1111111111111, sequenceNumber=1111111111111, masterKeyId=1111111111111)
[PigTezLauncher-0] INFO  org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider - Failing over to rm1111111111111
[PigTezLauncher-0] INFO  org.apache.tez.client.TezClient - Tez system stage directory hdfs://nn-local/tmp/temp-1111111111111/.tez/application_1111111111111_1111 doesn't exist and is created
[PigTezLauncher-0] INFO  org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS
[PigTezLauncher-0] INFO  org.apache.hadoop.yarn.client.api.impl.YarnClientImpl - Application submission is not finished, submitted application application_1111111111111_1111 is still in NEW_SAVING
[PigTezLauncher-0] INFO  org.apache.hadoop.yarn.client.api.impl.YarnClientImpl - Submitted application application_1111111111111_1111
[PigTezLauncher-0] INFO  org.apache.tez.client.TezClient - The url to track the Tez Session: http://nn-local:8088/proxy/application_1111111111111_1111/
[PigTezLauncher-0] WARN  org.apache.hadoop.security.UserGroupInformation - PriviledgedActionException as:kimutansk@kerberos.local (auth:SIMPLE) cause:org.apache.hadoop.ipc.RemoteException(com.google.protobuf.InvalidProtocolBufferException): Protocol message contained an invalid tag (zero).
[PigTezLauncher-0] WARN  org.apache.hadoop.ipc.Client - Exception encountered while connecting to the server : org.apache.hadoop.ipc.RemoteException(com.google.protobuf.InvalidProtocolBufferException): Protocol message contained an invalid tag (zero).
[PigTezLauncher-0] WARN  org.apache.hadoop.security.UserGroupInformation - PriviledgedActionException as:kimutansk@kerberos.local (auth:SIMPLE) cause:org.apache.hadoop.ipc.RemoteException(com.google.protobuf.InvalidProtocolBufferException): Protocol message contained an invalid tag (zero).
[PigTezLauncher-0] INFO  org.apache.tez.client.TezClient - Failed to retrieve AM Status via proxy
com.google.protobuf.ServiceException: org.apache.hadoop.ipc.RemoteException(com.google.protobuf.InvalidProtocolBufferException): Protocol message contained an invalid tag (zero).
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:244)
    at com.sun.proxy.$Proxy27.getAMStatus(Unknown Source)
    at org.apache.tez.client.TezClient.getAppMasterStatus(TezClient.java:775)
    at org.apache.tez.client.TezClient.waitTillReady(TezClient.java:912)
    at org.apache.tez.client.TezClient.waitTillReady(TezClient.java:883)
    at org.apache.pig.backend.hadoop.executionengine.tez.TezSessionManager.createSession(TezSessionManager.java:101)
    at org.apache.pig.backend.hadoop.executionengine.tez.TezSessionManager.getClient(TezSessionManager.java:228)
    at org.apache.pig.backend.hadoop.executionengine.tez.TezJob.run(TezJob.java:203)
    at org.apache.pig.backend.hadoop.executionengine.tez.TezLauncher$1.run(TezLauncher.java:210)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    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.hadoop.ipc.RemoteException(com.google.protobuf.InvalidProtocolBufferException): Protocol message contained an invalid tag (zero).
    at org.apache.hadoop.ipc.Client.call(Client.java:1472)
    at org.apache.hadoop.ipc.Client.call(Client.java:1409)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:230)
    ... 13 more

何故だろうか・・・とエラーメッセージから追っていたところ、下記のような情報が見つかりました。

Tezというわけではありませんが、下記の内容となっていました。

エラーが発生する理由
Slider uses its own Hadoop jars in the Slider lib directory.
I suspect that the Hadoop client jars Slider is using are not compatible with the version of Hadoop running on the cluster.
If you built Slider yourself, you could try rebuilding it with a hadoop.version that matches the version running on your cluster (you may need to adjust some other dependency versions in this case as well).
Alternatively, you could try replacing the hadoop jars in the Slider lib directory, but if the versions are too far apart this will not work and you'll have to rebuild Slider.

つまりは以下のような状況であると推測されました。

  • Pig on Tezで使用しているHadoop関連Jarファイルがクラスタで動作しているHadoopのバージョンと互換性がないため発生した。
  • 回避するためには、2つの対処が考えられる。
    • hadoop.versionをクラスタで動作しているHadoopのバージョンに併せてビルドし、その媒体を用いる。
    • Tezのlibディレクトリ配下にあるHadoop関連Jarファイルをクラスタで動作しているバージョンに置き換える。

だったらそもそもKerberosを有効化しなくても動かないんじゃないか?
という気もするのですが、Kerberos化したことによってそれまで使用されていなかったProtocolBufによる通信経路が使用されるようになり、それで問題が発生したということであれば納得がいく話でもあります。
(※このあたり、単なる推測なのでもしわかる方がいらっしゃったら補足いただければ幸いです。)

Hadoop関連Jarファイル入れ替えでは?

当然、簡単に対処できる方法から試すわけでして、Hadoop関連Jarファイル入れ替えから試してみました。
Tezのリリース媒体に含まれるJarファイルは以下でした。

Tezリリース媒体中のJarファイル
$ tar tvzf apache-tez-0.8.5-bin.tar.gz | grep jar
-rw-r--r-- sseth/admin    8729 2017-03-07 19:59 apache-tez-0.8.5-bin/hadoop-shim-0.8.5.jar
-rw-r--r-- sseth/admin    5496 2017-03-07 20:02 apache-tez-0.8.5-bin/hadoop-shim-2.6-0.8.5.jar
-rw-r--r-- sseth/admin  983564 2017-03-07 20:10 apache-tez-0.8.5-bin/tez-api-0.8.5.jar
-rw-r--r-- sseth/admin   76961 2017-03-07 19:59 apache-tez-0.8.5-bin/tez-common-0.8.5.jar
-rw-r--r-- sseth/admin 1319613 2017-03-07 20:11 apache-tez-0.8.5-bin/tez-dag-0.8.5.jar
-rw-r--r-- sseth/admin   49177 2017-03-07 19:59 apache-tez-0.8.5-bin/tez-examples-0.8.5.jar
-rw-r--r-- sseth/admin  106983 2017-03-07 20:11 apache-tez-0.8.5-bin/tez-ext-service-tests-0.8.5.jar
-rw-r--r-- sseth/admin   78166 2017-03-07 20:02 apache-tez-0.8.5-bin/tez-history-parser-0.8.5.jar
-rw-r--r-- sseth/admin   15423 2017-03-07 20:02 apache-tez-0.8.5-bin/tez-javadoc-tools-0.8.5.jar
-rw-r--r-- sseth/admin   72959 2017-03-07 20:02 apache-tez-0.8.5-bin/tez-job-analyzer-0.8.5.jar
-rw-r--r-- sseth/admin  289386 2017-03-07 20:11 apache-tez-0.8.5-bin/tez-mapreduce-0.8.5.jar
-rw-r--r-- sseth/admin  196158 2017-03-07 20:11 apache-tez-0.8.5-bin/tez-runtime-internals-0.8.5.jar
-rw-r--r-- sseth/admin  590631 2017-03-07 20:11 apache-tez-0.8.5-bin/tez-runtime-library-0.8.5.jar
-rw-r--r-- sseth/admin  146572 2017-03-07 19:59 apache-tez-0.8.5-bin/tez-tests-0.8.5.jar
-rw-r--r-- sseth/admin   25884 2017-03-07 20:02 apache-tez-0.8.5-bin/tez-yarn-timeline-history-0.8.5.jar
-rw-r--r-- sseth/admin    7734 2017-03-07 20:02 apache-tez-0.8.5-bin/tez-yarn-timeline-history-with-acls-0.8.5.jar
-rw-r--r-- sseth/admin   535731 2015-05-18 07:39 apache-tez-0.8.5-bin/lib/async-http-client-1.8.16.jar
-rw-r--r-- sseth/admin    41123 2012-06-04 20:04 apache-tez-0.8.5-bin/lib/commons-cli-1.2.jar
-rw-r--r-- sseth/admin    58160 2012-06-04 20:02 apache-tez-0.8.5-bin/lib/commons-codec-1.4.jar
-rw-r--r-- sseth/admin   588337 2015-11-30 20:14 apache-tez-0.8.5-bin/lib/commons-collections-3.2.2.jar
-rw-r--r-- sseth/admin   751238 2015-12-09 09:15 apache-tez-0.8.5-bin/lib/commons-collections4-4.1.jar
-rw-r--r-- sseth/admin   185140 2013-03-01 22:07 apache-tez-0.8.5-bin/lib/commons-io-2.4.jar
-rw-r--r-- sseth/admin   284220 2012-06-22 22:04 apache-tez-0.8.5-bin/lib/commons-lang-2.6.jar
-rw-r--r-- sseth/admin  1599627 2013-12-27 23:25 apache-tez-0.8.5-bin/lib/commons-math3-3.1.1.jar
-rw-r--r-- sseth/admin  1648200 2012-06-04 20:04 apache-tez-0.8.5-bin/lib/guava-11.0.2.jar
-rw-r--r-- sseth/admin   664918 2014-12-12 16:15 apache-tez-0.8.5-bin/lib/hadoop-mapreduce-client-common-2.6.0.jar
-rw-r--r-- sseth/admin  1509399 2014-12-12 16:15 apache-tez-0.8.5-bin/lib/hadoop-mapreduce-client-core-2.6.0.jar
-rw-r--r-- sseth/admin   130458 2013-09-16 18:42 apache-tez-0.8.5-bin/lib/jersey-client-1.9.jar
-rw-r--r-- sseth/admin   147952 2013-09-16 18:40 apache-tez-0.8.5-bin/lib/jersey-json-1.9.jar
-rw-r--r-- sseth/admin    81743 2014-02-06 19:14 apache-tez-0.8.5-bin/lib/jettison-1.3.4.jar
-rw-r--r-- sseth/admin   539912 2012-06-04 20:02 apache-tez-0.8.5-bin/lib/jetty-6.1.26.jar
-rw-r--r-- sseth/admin   177131 2012-06-04 20:02 apache-tez-0.8.5-bin/lib/jetty-util-6.1.26.jar
-rw-r--r-- sseth/admin    33031 2014-12-15 20:13 apache-tez-0.8.5-bin/lib/jsr305-3.0.0.jar
-rw-r--r-- sseth/admin   111908 2015-05-09 01:48 apache-tez-0.8.5-bin/lib/metrics-core-3.1.0.jar
-rw-r--r-- sseth/admin   533455 2013-08-14 00:48 apache-tez-0.8.5-bin/lib/protobuf-java-2.5.0.jar
-rw-r--r-- sseth/admin   124846 2015-07-22 00:04 apache-tez-0.8.5-bin/lib/RoaringBitmap-0.4.9.jar
-rw-r--r-- sseth/admin   105112 2012-06-04 19:59 apache-tez-0.8.5-bin/lib/servlet-api-2.5.jar
-rw-r--r-- sseth/admin    32119 2015-01-29 19:41 apache-tez-0.8.5-bin/lib/slf4j-api-1.7.10.jar
-rw-r--r-- sseth/admin     8866 2015-01-29 19:41 apache-tez-0.8.5-bin/lib/slf4j-log4j12-1.7.10.jar
$ tar xzf apache-tez-0.8.5-bin.tar.gz
$ tar tvzf apache-tez-0.8.5-bin/share/tez.tar.gz | grep jar
-rw-r--r-- sseth/admin    8729 2017-03-07 19:59 hadoop-shim-0.8.5.jar
-rw-r--r-- sseth/admin  983564 2017-03-07 20:10 tez-api-0.8.5.jar
-rw-r--r-- sseth/admin   76961 2017-03-07 19:59 tez-common-0.8.5.jar
-rw-r--r-- sseth/admin  196158 2017-03-07 20:11 tez-runtime-internals-0.8.5.jar
-rw-r--r-- sseth/admin  590631 2017-03-07 20:11 tez-runtime-library-0.8.5.jar
-rw-r--r-- sseth/admin  289386 2017-03-07 20:11 tez-mapreduce-0.8.5.jar
-rw-r--r-- sseth/admin   49177 2017-03-07 19:59 tez-examples-0.8.5.jar
-rw-r--r-- sseth/admin 1319613 2017-03-07 20:11 tez-dag-0.8.5.jar
-rw-r--r-- sseth/admin  146572 2017-03-07 19:59 tez-tests-0.8.5.jar
-rw-r--r-- sseth/admin  106983 2017-03-07 20:11 tez-ext-service-tests-0.8.5.jar
-rw-r--r-- sseth/admin   25884 2017-03-07 20:02 tez-yarn-timeline-history-0.8.5.jar
-rw-r--r-- sseth/admin    7734 2017-03-07 20:02 tez-yarn-timeline-history-with-acls-0.8.5.jar
-rw-r--r-- sseth/admin   78166 2017-03-07 20:02 tez-history-parser-0.8.5.jar
-rw-r--r-- sseth/admin   72959 2017-03-07 20:02 tez-job-analyzer-0.8.5.jar
-rw-r--r-- sseth/admin   15423 2017-03-07 20:02 tez-javadoc-tools-0.8.5.jar
-rw-r--r-- sseth/admin    5496 2017-03-07 20:02 hadoop-shim-2.6-0.8.5.jar
-rw-r--r-- sseth/admin   32119 2015-01-29 19:41 lib/slf4j-api-1.7.10.jar
-rw-r--r-- sseth/admin 1870176 2014-12-12 16:15 lib/hadoop-yarn-api-2.6.0.jar
-rw-r--r-- sseth/admin  284220 2012-06-22 22:04 lib/commons-lang-2.6.jar
-rw-r--r-- sseth/staff 1648200 2012-06-04 20:04 lib/guava-11.0.2.jar
-rw-r--r-- sseth/admin   33031 2014-12-15 20:13 lib/jsr305-3.0.0.jar
-rw-r--r-- sseth/admin   62050 2013-12-20 23:55 lib/commons-logging-1.1.3.jar
-rw-r--r-- sseth/admin  533455 2013-08-14 00:48 lib/protobuf-java-2.5.0.jar
-rw-r--r-- sseth/admin 3360985 2014-12-12 16:15 lib/hadoop-common-2.6.0.jar
-rw-r--r-- sseth/admin   17035 2014-12-12 16:15 lib/hadoop-annotations-2.6.0.jar
-rw-r--r-- sseth/staff   41123 2012-06-04 20:04 lib/commons-cli-1.2.jar
-rw-r--r-- sseth/admin 1599627 2013-12-27 23:25 lib/commons-math3-3.1.1.jar
-rw-r--r-- sseth/staff   15010 2012-06-04 20:04 lib/xmlenc-0.52.jar
-rw-r--r-- sseth/staff   58160 2012-06-04 20:02 lib/commons-codec-1.4.jar
-rw-r--r-- sseth/admin  185140 2013-03-01 22:07 lib/commons-io-2.4.jar
-rw-r--r-- sseth/staff  273370 2012-06-04 20:04 lib/commons-net-3.1.jar
-rw-r--r-- sseth/admin  588337 2015-11-30 20:14 lib/commons-collections-3.2.2.jar
-rw-r--r-- sseth/admin  147952 2013-09-16 18:40 lib/jersey-json-1.9.jar
-rw-r--r-- sseth/admin   81743 2014-02-06 19:14 lib/jettison-1.3.4.jar
-rw-r--r-- sseth/staff  890168 2012-06-04 20:04 lib/jaxb-impl-2.2.3-1.jar
-rw-r--r-- sseth/staff  105134 2012-06-04 20:04 lib/jaxb-api-2.2.2.jar
-rw-r--r-- sseth/admin   23346 2013-05-30 22:44 lib/stax-api-1.0-2.jar
-rw-r--r-- sseth/staff   62983 2012-06-04 20:04 lib/activation-1.1.jar
-rw-r--r-- sseth/admin  232248 2014-04-28 23:07 lib/jackson-core-asl-1.9.13.jar
-rw-r--r-- sseth/admin  780664 2014-04-28 23:07 lib/jackson-mapper-asl-1.9.13.jar
-rw-r--r-- sseth/admin   18336 2014-04-28 23:07 lib/jackson-jaxrs-1.9.13.jar
-rw-r--r-- sseth/admin   27084 2014-04-28 23:07 lib/jackson-xc-1.9.13.jar
-rw-r--r-- sseth/admin  489884 2012-08-21 22:00 lib/log4j-1.2.17.jar
-rw-r--r-- sseth/staff  298829 2012-06-04 20:04 lib/commons-configuration-1.6.jar
-rw-r--r-- sseth/staff  143602 2012-06-04 20:04 lib/commons-digester-1.8.jar
-rw-r--r-- sseth/staff  188671 2012-06-04 20:01 lib/commons-beanutils-1.7.0.jar
-rw-r--r-- sseth/staff  206035 2012-06-04 20:04 lib/commons-beanutils-core-1.8.0.jar
-rw-r--r-- sseth/admin    8866 2015-01-29 19:41 lib/slf4j-log4j12-1.7.10.jar
-rw-r--r-- sseth/admin  303139 2013-08-09 18:44 lib/avro-1.7.4.jar
-rw-r--r-- sseth/staff   29555 2012-06-04 20:04 lib/paranamer-2.3.jar
-rw-r--r-- sseth/admin  995968 2013-05-30 22:43 lib/snappy-java-1.0.4.1.jar
-rw-r--r-- sseth/admin  241367 2013-05-30 22:43 lib/commons-compress-1.4.1.jar
-rw-r--r-- sseth/admin   94672 2013-02-01 22:37 lib/xz-1.0.jar
-rw-r--r-- sseth/admin  190432 2013-12-27 23:25 lib/gson-2.2.4.jar
-rw-r--r-- sseth/admin   67167 2014-12-12 16:15 lib/hadoop-auth-2.6.0.jar
-rw-r--r-- sseth/admin  433368 2013-10-02 21:47 lib/httpclient-4.2.5.jar
-rw-r--r-- sseth/admin  227275 2013-10-02 21:47 lib/httpcore-4.2.4.jar
-rw-r--r-- sseth/admin  691479 2013-12-27 23:25 lib/apacheds-kerberos-codec-2.0.0-M15.jar
-rw-r--r-- sseth/admin   44925 2013-12-27 23:25 lib/apacheds-i18n-2.0.0-M15.jar
-rw-r--r-- sseth/admin   16560 2013-12-27 23:25 lib/api-asn1-api-1.0.0-M20.jar
-rw-r--r-- sseth/admin   79912 2013-12-27 23:25 lib/api-util-1.0.0-M20.jar
-rw-r--r-- sseth/admin  792964 2014-07-17 00:13 lib/zookeeper-3.4.6.jar
-rw-r--r-- sseth/admin 1303237 2015-05-18 07:39 lib/netty-3.9.2.Final.jar
-rw-r--r-- sseth/admin  185245 2014-10-24 20:38 lib/curator-framework-2.6.0.jar
-rw-r--r-- sseth/admin   68866 2014-10-24 20:38 lib/curator-client-2.6.0.jar
-rw-r--r-- sseth/admin  248171 2014-10-24 20:41 lib/curator-recipes-2.6.0.jar
-rw-r--r-- sseth/admin   31212 2014-10-24 20:41 lib/htrace-core-3.0.4.jar
-rw-r--r-- sseth/staff   26514 2012-06-04 20:04 lib/stax-api-1.0.1.jar
-rw-r--r-- sseth/admin 1602059 2014-12-12 16:15 lib/hadoop-yarn-common-2.6.0.jar
-rw-r--r-- sseth/staff  105112 2012-06-04 19:59 lib/servlet-api-2.5.jar
-rw-r--r-- sseth/staff  177131 2012-06-04 20:02 lib/jetty-util-6.1.26.jar
-rw-r--r-- sseth/admin  458739 2013-09-16 18:40 lib/jersey-core-1.9.jar
-rw-r--r-- sseth/admin  130458 2013-09-16 18:42 lib/jersey-client-1.9.jar
-rw-r--r-- sseth/staff   65012 2012-06-04 20:08 lib/guice-servlet-3.0.jar
-rw-r--r-- sseth/staff  710492 2012-06-04 20:08 lib/guice-3.0.jar
-rw-r--r-- sseth/staff    2497 2012-06-04 20:08 lib/javax.inject-1.jar
-rw-r--r-- sseth/staff    4467 2012-06-04 20:08 lib/aopalliance-1.0.jar
-rw-r--r-- sseth/admin   14786 2013-09-16 18:42 lib/jersey-guice-1.9.jar
-rw-r--r-- sseth/admin  127986 2014-12-12 16:15 lib/hadoop-yarn-client-2.6.0.jar
-rw-r--r-- sseth/admin  751238 2015-12-09 09:15 lib/commons-collections4-4.1.jar
-rw-r--r-- sseth/admin 7822670 2014-12-12 16:15 lib/hadoop-hdfs-2.6.0.jar
-rw-r--r-- sseth/staff 1229125 2012-06-04 19:59 lib/xercesImpl-2.9.1.jar
-rw-r--r-- sseth/staff  194354 2012-06-04 19:59 lib/xml-apis-1.3.04.jar
-rw-r--r-- sseth/staff  539912 2012-06-04 20:02 lib/jetty-6.1.26.jar
-rw-r--r-- sseth/admin  124846 2015-07-22 00:04 lib/RoaringBitmap-0.4.9.jar
-rw-r--r-- sseth/admin  535731 2015-05-18 07:39 lib/async-http-client-1.8.16.jar
-rw-r--r-- sseth/admin 1509399 2014-12-12 16:15 lib/hadoop-mapreduce-client-core-2.6.0.jar
-rw-r--r-- sseth/admin  664918 2014-12-12 16:15 lib/hadoop-mapreduce-client-common-2.6.0.jar
-rw-r--r-- sseth/admin   28501 2014-12-12 16:15 lib/hadoop-yarn-server-web-proxy-2.6.0.jar
-rw-r--r-- sseth/admin  289619 2014-12-12 16:15 lib/hadoop-yarn-server-common-2.6.0.jar
-rw-r--r-- sseth/admin 1045744 2014-02-14 09:12 lib/leveldbjni-all-1.8.jar
-rw-r--r-- sseth/staff  305001 2012-06-04 20:04 lib/commons-httpclient-3.1.jar
-rw-r--r-- sseth/staff  134133 2012-06-04 20:00 lib/servlet-api-2.5-20081211.jar
-rw-r--r-- sseth/admin  111908 2015-05-09 01:48 lib/metrics-core-3.1.0.ja

上記の結果のうち、Hadoop関連Jarファイルは以下の条件で絞り込めると思います。

  • タイムスタンプが2017-03-07でない。(=Tezのビルドの結果生成されたファイルではない)
  • hadoopという名称がついている。

上記の条件を満たすJarファイルは以下の2つでした。

  • Tezのリリース媒体中ファイル
    • hadoop-mapreduce-client-common-2.6.0.jar
    • hadoop-mapreduce-client-core-2.6.0.jar
  • Tezのリリース媒体中のtez.tar.gzの中のファイル
    • hadoop-annotations-2.6.0.jar
    • hadoop-auth-2.6.0.jar
    • hadoop-common-2.6.0.jar
    • hadoop-hdfs-2.6.0.jar
    • hadoop-mapreduce-client-common-2.6.0.jar
    • hadoop-mapreduce-client-core-2.6.0.jar
    • hadoop-yarn-api-2.6.0.jar
    • hadoop-yarn-client-2.6.0.jar
    • hadoop-yarn-common-2.6.0.jar
    • hadoop-yarn-server-common-2.6.0.jar
    • hadoop-yarn-server-web-proxy-2.6.0.jar

そのため、これらのファイルを以下のファイルで置き換えます。

  • Tezのリリース媒体中ファイル
    • hadoop-mapreduce-client-common-2.6.0-cdh5.10.0.jar
    • hadoop-mapreduce-client-core-2.6.0-cdh5.10.0.jar
  • Tezのリリース媒体中のtez.tar.gzの中のファイル
    • hadoop-annotations-2.6.0-cdh5.10.0.jar
    • hadoop-auth-2.6.0-cdh5.10.0.jar
    • hadoop-common-2.6.0-cdh5.10.0.jar
    • hadoop-hdfs-2.6.0-cdh5.10.0.jar
    • hadoop-mapreduce-client-common-2.6.0-cdh5.10.0.jar
    • hadoop-mapreduce-client-core-2.6.0-cdh5.10.0.jar
    • hadoop-yarn-api-2.6.0-cdh5.10.0.jar
    • hadoop-yarn-client-2.6.0-cdh5.10.0.jar
    • hadoop-yarn-common-2.6.0-cdh5.10.0.jar
    • hadoop-yarn-server-common-2.6.0-cdh5.10.0.jar
    • hadoop-yarn-server-web-proxy-2.6.0-cdh5.10.0.jar

その上で、サーバ上のファイルとHDFS上に配置しているtez.tar.gzを置き換えます。
そうすると・・・無事Pig on TezがKerberos認証つきCDHクラスタで動作することを確認できました!

TezのCDH Hadoopによるビルド方法

既に問題は解決しているわけですが、どうせならもう一つの方でも動作するのかビルド方法を確立し、確認してみようということで
実際にやってみました。

前提環境

前提とする環境は以下です。

  • OS : Centos 7.2.1511(minimal)
  • Hadoop Distribution : CDH 5.10.0
  • Java : Oracke JDK 1.8.0_60

上記の上で、以下の2条件を満たす必要があります。

  • パスワードなしでsudo出来るユーザで実行すること
  • Proxyなしで外部に接続可能な環境であること

この2条件を満たさない場合はUIのビルドが出来ないため、
以後の手順でUIをビルド対象から除外する手順を実行してください。

必要環境/パッケージのインストール

以下のページを参照してください。

TezをCDHでビルドするための準備

TezをCDHでビルドをするために、Tezのソースファイルや設定を一部修正します。
Tezのソースコードをダウンロードした後、以下の対応が必要になります。

  • Pig、Hadoopのバージョン修正
  • CDHのリポジトリのビルド定義への追記
  • 外部テストモジュールのビルド対象からの除外
  • UIのビルド対象からの除外(UIをビルド対象から外す場合のみ)
  • CDH HadoopとApache Hadoopの差分補正

まずは以下の手順でTezのソースコードをダウンロードします。

Tezソースコードダウンロード
$ wget http://ftp.jaist.ac.jp/pub/apache/tez/0.8.5/apache-tez-0.8.5-src.tar.gz
$ tar xvpf apache-tez-0.8.5-src.tar.gz
$ cd apache-tez-0.8.5-src

以後の手順はこのディレクトリパス上で実行します。

Pig、Hadoopのバージョン修正

Pig、Hadoopのバージョン修正
$ sed -i -e "s|<pig.version>0.13.0</pig.version>|<pig.version>0.15.0</pig.version>|g" pom.xml
$ sed -i -e "s|<hadoop.version>2.6.0</hadoop.version>|<hadoop.version>2.6.0-cdh5.10.0</hadoop.version>|g" pom.xml

CDHのリポジトリのビルド定義への追記

CDHのリポジトリのビルド定義への追記
$ vi pom.xml
pom.xml修正前(抜粋)
  <repositories>
    <repository>
      <id>${distMgmtSnapshotsId}</id>
      <name>${distMgmtSnapshotsName}</name>
      <url>${distMgmtSnapshotsUrl}</url>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>maven2-repository.atlassian</id>
      <name>Atlassian Maven Repository</name>
      <url>https://maven.atlassian.com/repository/public</url>
      <layout>default</layout>
    </pluginRepository>
    <pluginRepository>
      <id>${distMgmtSnapshotsId}</id>
      <name>${distMgmtSnapshotsName}</name>
      <url>${distMgmtSnapshotsUrl}</url>
      <layout>default</layout>
    </pluginRepository>
  </pluginRepositories>
pom.xml修正後(抜粋)
  <repositories>
    <repository>
      <id>${distMgmtSnapshotsId}</id>
      <name>${distMgmtSnapshotsName}</name>
      <url>${distMgmtSnapshotsUrl}</url>
    </repository>
    <repository>
      <id>Cloudera-Repository</id>
      <name>Cloudera-Repository</name>
      <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>maven2-repository.atlassian</id>
      <name>Atlassian Maven Repository</name>
      <url>https://maven.atlassian.com/repository/public</url>
      <layout>default</layout>
    </pluginRepository>
    <pluginRepository>
      <id>${distMgmtSnapshotsId}</id>
      <name>${distMgmtSnapshotsName}</name>
      <url>${distMgmtSnapshotsUrl}</url>
      <layout>default</layout>
    </pluginRepository>
    <pluginRepository>
      <id>Cloudera-Repository</id>
      <name>Cloudera-Repository</name>
      <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
    </pluginRepository>
  </pluginRepositories>

外部テストモジュールのビルド対象からの除外

外部テストモジュールのビルド対象からの除外
$ sed -i -e "s|<module>tez-ext-service-tests</module>||g" pom.xml

UIのビルド対象からの除外(UIをビルド対象から外す場合のみ)

以下の条件を満たせない場合はUIのビルドが出来ない(UIテスト時、Proxyが適用されない状態でファイル取得が失敗)ため、ビルド対象から除外します。
当然UIは使えなくなりますが、一応コンソールで最低限の結果確認は出来るということで・・・

  • パスワードなしでsudo出来るユーザで実行すること
  • Proxyなしで外部に接続可能な環境であること
UIのビルド対象からの除外
$ sed -i -e "s|<module>tez-ui</module>||g" pom.xml
$ sed -i -e "s|<module>tez-ui2</module>||g" pom.xml

CDH HadoopとApache Hadoopの差分補正

CDH HadoopとApache HadoopでJobContextに差分があるらしく、Tez側にメソッドを追加する必要があります。
(実はこれがKerberos化すると失敗する要因なのかもしれません。)

CDH_HadoopとApache_Hadoopの差分補正
$ vi tez-mapreduce/src/main/java/org/apache/tez/mapreduce/hadoop/mapreduce/JobContextImpl.java
JobContextImpl.java修正前(抜粋)
  @Override
  public Progressable getProgressible() {
    return progress;
  }
JobContextImpl.java修正後(抜粋)
  @Override
  public Progressable getProgressible() {
    return progress;
  }

  /**
   * Get the boolean value for the property that specifies which classpath
   * takes precedence when tasks are launched. True - user's classes takes
   * precedence. False - system's classes takes precedence.
   * @return true if user's classes should take precedence
   */
   @Override
  public boolean userClassesTakesPrecedence() {
    return getJobConf().getBoolean(MRJobConfig.MAPREDUCE_JOB_USER_CLASSPATH_FIRST, false);
  }

TezをCDHでビルド

これまでの準備が完了していれば、以下のコマンドでビルドするだけです。
ファイルのダウンロードやビルドで相応に時間がかかります。

TezをCDHでビルド
$ mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true

ビルドが完了後は、以下の手順に従い、配置をして実行すればTezは動作します。
ただ、バージョンなどは適宜補正をしてくださいね。

これで2通りの対処があることが確認できました。

まとめ

  • Pig on TezはTezのリリース媒体を使用するとKerberosを有効化したCDHクラスタ上では動作しない
  • 以下の対応のどちらかを行えばいい。
    • 媒体ファイル中のHadoop関連JarファイルをCDH版に置き換え
    • CDH版Hadoopを使ってTezをビルド