복붙노트

[HADOOP] 인 IntelliJ를 사용하여 HDFS Kerberos를 클러스터에 로컬로 연결할 수 없습니다

HADOOP

인 IntelliJ를 사용하여 HDFS Kerberos를 클러스터에 로컬로 연결할 수 없습니다

스피 에지 노드와 Kerberos를 연결하려는 내 laptop.The 클러스터 I'am에 설치 IntelliJ를 통해 로컬 HDFS에 연결하려고합니다. I는 에지 노드의 키 테이블을 생성하고 다음 코드를 그 구성. 이제 edgenode에 로그인 할 수 스피. 하지만 지금은 오류가 발생합니다 네임 노드에있는 HDFS 데이터에 액세스하려고 할 때. 다음은 HDFS에 연결을 시도 스칼라 코드는 다음과 같습니다

import org.apache.spark.sql.SparkSession
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.hadoop.security.{Credentials, UserGroupInformation}
import org.apache.hadoop.security.token.{Token, TokenIdentifier}
import java.security.{AccessController, PrivilegedAction, PrivilegedExceptionAction}
import java.io.PrintWriter

object DataframeEx {
  def main(args: Array[String]) {
    // $example on:init_session$
    val spark = SparkSession
      .builder()
      .master(master="local")
      .appName("Spark SQL basic example")
      .config("spark.some.config.option", "some-value")
      .getOrCreate()

    runHdfsConnect(spark)

    spark.stop()
  }

   def runHdfsConnect(spark: SparkSession): Unit = {

    System.setProperty("HADOOP_USER_NAME", "m12345")
    val path = new Path("/data/interim/modeled/abcdef")
    val conf = new Configuration()
    conf.set("fs.defaultFS", "hdfs://namenodename.hugh.com:8020")
    conf.set("hadoop.security.authentication", "kerberos")
    conf.set("dfs.namenode.kerberos.principal.pattern","hdfs/_HOST@HUGH.COM")

    UserGroupInformation.setConfiguration(conf);
    val ugi=UserGroupInformation.loginUserFromKeytabAndReturnUGI("m12345@HUGH.COM","C:\\Users\\m12345\\Downloads\\m12345.keytab");

    println(UserGroupInformation.isSecurityEnabled())
     ugi.doAs(new PrivilegedExceptionAction[String] {
       override def run(): String = {
         val fs= FileSystem.get(conf)
         val output = fs.create(path)
         val writer = new PrintWriter(output)
         try {
           writer.write("this is a test")
           writer.write("\n")
         }
         finally {
           writer.close()
           println("Closed!")
         }
          "done"
       }
     })
  }
}

edgenode에 로그인 할 수 스피. 스피 HDFS에 쓰기를 시도하지만합니다 (의 doAs 메소드는) 다음과 같은 오류가 발생합니다 :

WARN Client: Exception encountered while connecting to the server : java.lang.IllegalArgumentException: Server has invalid Kerberos principal: hdfs/namenodename.hugh.com@HUGH.COM
18/06/11 12:12:01 ERROR UserGroupInformation: PriviledgedActionException m12345@HUGH.COM (auth:KERBEROS) cause:java.io.IOException: java.lang.IllegalArgumentException: Server has invalid Kerberos principal: hdfs/namenodename.hugh.com@HUGH.COM
18/06/11 12:12:01 ERROR UserGroupInformation: PriviledgedActionException as:m12345@HUGH.COM (auth:KERBEROS) cause:java.io.IOException: Failed on local exception: java.io.IOException: java.lang.IllegalArgumentException: Server has invalid Kerberos principal: hdfs/namenodename.hugh.com@HUGH.COM; Host Details : local host is: "INMBP-m12345/172.29.155.52"; destination host is: "namenodename.hugh.com":8020; 
Exception in thread "main" java.io.IOException: Failed on local exception: java.io.IOException: java.lang.IllegalArgumentException: Server has invalid Kerberos principal: hdfs/namenodename.hugh.com@HUGH.COM; Host Details : local host is: "INMBP-m12345/172.29.155.52"; destination host is: "namenodename.hugh.com":8020

나는 edgenode에 로그인하고 kinit를 수행하고 HDFS에게 그것의 벌금에 액세스하는 경우. 그래서 내가 왜 할 수 스피가 edgenode에 로그인 할 때 HDFS의 네임 노드에 액세스 할 수 없습니다 무엇입니까?

더 자세한 사항은 내 옆에서 필요한 경우 알려주세요.

해결법

  1. ==============================

    1.스파크의 conf의 개체가 잘못 설정되었다. 다음은 나를 위해 일한 것입니다 :

    스파크의 conf의 개체가 잘못 설정되었다. 다음은 나를 위해 일한 것입니다 :

    val conf = new Configuration()
    conf.set("fs.defaultFS", "hdfs://namenodename.hugh.com:8020")
    conf.set("hadoop.security.authentication", "kerberos")
    conf.set("hadoop.rpc.protection", "privacy")   ***---(was missing this parameter)***
    conf.set("dfs.namenode.kerberos.principal","hdfs/_HOST@HUGH.COM") ***---(this was initially wrongly set as dfs.namenode.kerberos.principal.pattern)***
    
  2. from https://stackoverflow.com/questions/50951656/cannot-connect-locally-to-hdfs-kerberized-cluster-using-intellij by cc-by-sa and MIT license