2017-05-27 10 views
-1

sparkストリーミングを使用してkerberos対応のhbaseにデータを挿入することでプログラムを作成しました。 1つのバッチで、私は1つの失敗したタスクに会った。エラーは次のとおりです。java.io.IOException:キータブから[email protected]へのログインに失敗しました

java.io.IOException: Login failure for [email protected] from keytab ./user.keytab 
    at org.apache.hadoop.security.UserGroupInformation.loginUserFromKeytabAndReturnUGI(UserGroupInformation.java:1160) 
    at com.framework.common.HbaseUtil$.InsertToHbase(HbaseUtil.scala:81) 
    at com.framework.realtime.RDDUtil$$anonfun$dwsTodwd$2.apply(RDDUtil.scala:203) 
    at com.framework.realtime.RDDUtil$$anonfun$dwsTodwd$2.apply(RDDUtil.scala:202) 
    at org.apache.spark.rdd.RDD$$anonfun$foreachPartition$1$$anonfun$apply$33.apply(RDD.scala:920) 
    at org.apache.spark.rdd.RDD$$anonfun$foreachPartition$1$$anonfun$apply$33.apply(RDD.scala:920) 
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858) 
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858) 
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66) 
    at org.apache.spark.scheduler.Task.run(Task.scala:89) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:227) 
    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: javax.security.auth.login.LoginException: Receive timed out 
    at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:767) 
    at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:584) 
    at sun.reflect.GeneratedMethodAccessor18.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at javax.security.auth.login.LoginContext.invoke(LoginContext.java:762) 
    at javax.security.auth.login.LoginContext.access$000(LoginContext.java:203) 
    at javax.security.auth.login.LoginContext$4.run(LoginContext.java:690) 
    at javax.security.auth.login.LoginContext$4.run(LoginContext.java:688) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:687) 
    at javax.security.auth.login.LoginContext.login(LoginContext.java:595) 
    at org.apache.hadoop.security.UserGroupInformation.loginUserFromKeytabAndReturnUGI(UserGroupInformation.java:1149) 
    ... 13 more 
Caused by: java.net.SocketTimeoutException: Receive timed out 
    at java.net.PlainDatagramSocketImpl.receive0(Native Method) 
    at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:146) 
    at java.net.DatagramSocket.receive(DatagramSocket.java:816) 
    at sun.security.krb5.internal.UDPClient.receive(NetClient.java:207) 
    at sun.security.krb5.KdcComm$KdcCommunication.run(KdcComm.java:390) 
    at sun.security.krb5.KdcComm$KdcCommunication.run(KdcComm.java:343) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.security.krb5.KdcComm.send(KdcComm.java:327) 
    at sun.security.krb5.KdcComm.send(KdcComm.java:219) 
    at sun.security.krb5.KdcComm.send(KdcComm.java:191) 
    at sun.security.krb5.KrbAsReqBuilder.send(KrbAsReqBuilder.java:319) 
    at sun.security.krb5.KrbAsReqBuilder.action(KrbAsReqBuilder.java:364) 
    at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:735) 
    ... 25 more 

ただし、2回目の試行では、タスクは成功します。私の意見では、認定プロセスは長すぎるため失敗し、別の試みではプロセスが不足しています。だからそれは行きます。私は正しいですか?もしそうであれ、そうでないなら、どうすればこの問題を解決できますか? は私のコードは以下の通りです:をHadoop and Kerberos - the Madness beyond the Gate"恐れることはエラーメッセージの" From

val ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI(princ, 
     keytab) 

    ugi.doAs(new PrivilegedAction[Unit]() { 
     def run(): Unit = { 
     // TODO Auto-generated method stub 
     var conn: HConnection = null 
     var htable: HTableInterface = null 

      conn = HConnectionManager.createConnection(conf) 
      htable = conn.getTable(tableName) 
      htable.setAutoFlushTo(false) 
      for (record <- partitionOfRecords) { 
      htable.put(record) 
      } 
     } 
    }) 
+0

エラーが発生したコードを共有することから始められます。 – mtoto

答えて

1

...

に通常

をタイムアウトしレシーブスタックトレースlike

Caused by: java.net.SocketTimeoutException: Receive timed out
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
...
at sun.security.krb5.internal.UDPClient.receive(NetClient.java:207)

...せめて-at TCPソケットに...スイッチUDP、それはより速く を失敗します。

そして、ちょうどその上で:

/etc/krb5.confでは、TCPではなくUDP
を使用するKerberosを切り替える:

[libdefaults]
udp_preference_limit = 1


一般的に言えば、多くの不安定なKerberosの問題はUDPでしか発生しないようですので、デフォルトで使用されるのは残念です...言及for BSD

  • 以外のUnix/Linuxのマニュアルに記載されていないMIT Kerberos documentation
  • に記載されていない

    • :Javaはまたkdc_timeout設定パラメータをサポートしていますが、それは汚い混乱だと


      注意darkest corners of Java documentation, here for Java 9のみであり、デフォルト値が30s-exped-implic 30秒のデフォルトタイムアウトによってHDFS High Availabilityなどのような何らかの障害が発生する可能性があるので、というクロールダサポートチームは、この設定に関する推奨を発行しました - - しかし、貧しい人は本当に彼らが推薦したかわからなかったので、彼らはあなたが複数を持っている場合があることに注意してください明示的なタイムアウト値の「3」または「3S」または「3000」


    ランダム提案しました高可用性のためのKDC、およびこれらのKDCは明示的にkrb5.confにリストされています(または、ラウンドロビンルールを持つDNSエイリアスセットfまたは例)、「KDCタイムアウト」の場合、Javaは次のKDCの行を再試行する必要があります。グローバルタイムアウトに達していない限り。

  • 関連する問題