簡體   English   中英

在啟用 kerberos 的紗線集群上啟動 spark/spring-boot 作業

[英]launch spark/spring-boot job on yarn cluster with kerberos enable

我想使用 spring-boot 並在啟用 kerberos 的 Yarn 集群中一起觸發。 (我是 sprint-boot 新手)

我的先決條件:

  • 我不能使用 spark-submit,應用程序是以這種方式啟動的:

     java -jar <my_jar>
  • 我用 spring-boot-maven-plugin 構建了 jar。

這是我的簡化代碼:

@SpringBootApplication public class A implements ApplicationRunner {

    @Autowired
    B b;

public static void main(String[] args) {
        SpringApplication.run(A.class, args);
    }

    @Override
    public void run(ApplicationArguments args) {           
        b.run();    
    }    
}

我的 B class:

@Component
public class B{
 public void run() {
  SparkSession ss = createSparkSession();
  Dataset<Row> csv = readCsvFromHDFS()
  //  business logic here
  writeCsvToHdfs();
 }
}

這在主機設置為local[*]的 localhost 上運行良好,主要問題是當我嘗試將 sparkSession 主機設置為 Yarn 時。 我的想法是將所有參數從 spark-submit 傳遞給我的 spark session 以避免使用 spark-submit。 我的 sparkSession 是用這種方式創建的:

SparkSession.builder()
.master("yarn")
.appName("appName")
.config("HADOOP_CONF_DIR", "/usr/hdp/current/hadoop-client/conf")
.config("SPARK_CONF_DIR", "/usr/hdp/current/spark2-client/conf")
.config("spark.driver.cores", "5")
.config("spark.driver.memory", "1g")
.config("spark.executor.memory", "1g")
.config("spark.logConf", "true")
.config("spark.submit.deployMode", "client")
.config("spark.executor.cores", "5")
.config("spark.hadoop.yarn.resourcemanager.address", "XXXX:8050")
.config("spark.hadoop.yarn.resourcemanager.hostname", "XXXX")
.config("spark.hadoop.security.authentication", "kerberos")
.config("hadoop.security.authorization","true")
.getOrCreate()

目前我的錯誤是:

java.lang.IllegalStateException: Failed to execute ApplicationRunner
...

Caused by: org.apache.hadoop.security.AccessControlException: SIMPLE authentication is not enabled.  Available:[TOKEN, KERBEROS]

我的 kerberos 票證在啟動應用程序之前是有效的。

我認為我的core-site,hdfs-site,yan-site...被忽略了,因為SparkSession應該能夠檢索到自己需要的信息。

我嘗試導出它,但它沒有任何改變:

  • 導出 HADOOP_CONF_DIR=/usr/hdp/current/hadoop-client/conf
  • 導出 HADOOP_HOME=/usr/hdp/current/hadoop-client/
  • 導出 SPARK_HOME=/usr/hdp/current/spark2-client

有更好的方法可以同時使用 spark + spring-boot + yarn + kerberos 並且尊重我的先決條件?

我的版本:
Java 8
HDP:2.6.4
火花:2.3.2
Spring-boot:2.3.0.RELEASE

有幾個選項可以解決這個問題

  1. 您可以使用UserGroupInformation顯式處理 keytab 並在特權上下文中運行您的主代碼
private String principal;
private File keytab;

public UserGroupInformation ugi() {
    final org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
    conf.set(CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHENTICATION, "Kerberos");
    UserGroupInformation.setConfiguration(conf);
    return UserGroupInformation.loginUserFromKeytabAndReturnUGI(principal, keytab.getAbsolutePath());
}

接着

ugi.doAs(() -> {
    // Start Spring context here
});
  1. 從 java 進行 spark-submit

您可以通過反射找到您的 jar 並通過deploy.SparkSubmit class 提交,並提供密鑰表和主體。

  1. You can embed a script which will handle submit inside your jar with embeddedLaunchScript in spring-boot-maven-plugin Note: you would have to start it with ./app.jar not java -jar app.jar
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
  <execution>
    <goals>
      <goal>repackage</goal>
      <goal>build-info</goal>
    </goals>
  </execution>
</executions>
<configuration>
  <mainClass>your.Main</mainClass>
  <embeddedLaunchScript>src/main/sh/spark-submit.sh</embeddedLaunchScript>
</configuration>
</plugin>

其中spark-submit.sh是您自己的 spark-submit 實現,類似於 2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM