flink on yarn with kerberos 边缘提交

本文介绍了如何在ApacheFlink与YARN集成环境中,通过Kerberos进行安全的远程作业提交,包括设置Hadoop配置、Flink配置以及启用Kerberos认证过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

flink on yarn 带kerberos 远程提交 实现

  1. flink kerberos 配置
    在这里插入图片描述
  2. 先使用ugi进行一次认证
  3. 正常提交
import com.google.common.io.Files;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.flink.client.cli.CliFrontend;
import org.apache.flink.client.cli.CustomCommandLine;
import org.apache.flink.client.cli.DefaultCLI;
import org.apache.flink.client.cli.GenericCLI;
import org.apache.flink.client.deployment.ClusterDeploymentException;
import org.apache.flink.client.deployment.ClusterSpecification;
import org.apache.flink.client.deployment.application.ApplicationConfiguration;
import org.apache.flink.client.program.ClusterClientProvider;
import org.apache.flink.configuration.*;
import org.apache.flink.runtime.security.SecurityConfiguration;
import org.apache.flink.runtime.security.SecurityUtils;
import org.apache.flink.util.ExceptionUtils;
import org.apache.flink.yarn.YarnClientYarnClusterInformationRetriever;
import org.apache.flink.yarn.YarnClusterDescriptor;
import org.apache.flink.yarn.YarnClusterInformationRetriever;
import org.apache.flink.yarn.configuration.YarnConfigOptions;
import org.apache.flink.yarn.configuration.YarnDeploymentTarget;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.client.api.YarnClient;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.UndeclaredThrowableException;
import java.net.MalformedURLException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.apache.flink.util.Preconditions.checkNotNull;


/**
* @author: jiayeli.cn
* @description
* @date: 2023/8/29 下午9:09
*/

@Slf4j
public class YarnClientTestCase {

   @Test
   public void submitJobWithYarnDesc() throws ClusterDeploymentException, IOException {
       // hadoop
       String hadoopConfDir = "/x/x/software/spark-3.3.2-bin-hadoop3/etc/hadoop";
       //flink的本地配置目录,为了得到flink的配置
       String flinkConfDir = "/opt/flink-1.14.3/conf";
       //存放flink集群相关的jar包目录
       String flinkLibs = "hdfs://node01:8020/lib/flink";
       //用户jar
       String userJarPath =  "hdfs://node01:8020/jobs/streaming/testCase/TopSpeedWindowing.jar";
       String flinkDistJar = "hdfs://node01:8020/lib/flink/flink-dist_2.12-1.14.3.jar";
       String[] args = "".split("\\s+");
       String appMainClass = "org.apache.flink.streaming.examples.windowing.TopSpeedWindowing";
       String principal = "dev@JIAYELI.COM";
       String keyTab = "/x/x/workspace/bigdata/sparkLauncherTestcase/src/test/resource/dev_uer.keytab";

       enableKrb5(principal, keyTab);
       YarnClient yarnClient = YarnClient.createYarnClient();
       YarnConfiguration yarnConfiguration = new YarnConfiguration();
       Optional.ofNullable(hadoopConfDir)
           .map(e -> new File(e))
           .filter(dir -> dir.exists())
           .map(File::listFiles)
           .ifPresent(files -> {
               Arrays.asList(files).stream()
                       .filter(file -> Files.getFileExtension(file.getName()).equals(".xml"))
                       .forEach(conf -> yarnConfiguration.addResource(conf.getPath()));
           });

       yarnClient.init(yarnConfiguration);
       yarnClient.start();

       Configuration flinkConf = GlobalConfiguration.loadConfiguration(flinkConfDir);
       //set run model
       flinkConf.setString(DeploymentOptions.TARGET, YarnDeploymentTarget.APPLICATION.getName());
       //set application name
       flinkConf.setString(YarnConfigOptions.APPLICATION_NAME, "onYarnApiSubmitCase");
       //flink on yarn dependency
       flinkConf.set(YarnConfigOptions.PROVIDED_LIB_DIRS, Collections.singletonList(new Path(flinkLibs).toString()));
       flinkConf.set(YarnConfigOptions.FLINK_DIST_JAR, flinkDistJar);
       flinkConf.set(PipelineOptions.JARS, Collections.singletonList(new Path(userJarPath).toString()));
       //设置:资源/并发度
       flinkConf.setInteger(CoreOptions.DEFAULT_PARALLELISM, 1);
       flinkConf.set(JobManagerOptions.TOTAL_PROCESS_MEMORY, MemorySize.parse("1G"));
       flinkConf.set(TaskManagerOptions.TOTAL_PROCESS_MEMORY, MemorySize.parse("1G"));
       flinkConf.setInteger(TaskManagerOptions.NUM_TASK_SLOTS, 1);


       ClusterSpecification clusterSpecification = new ClusterSpecification
               .ClusterSpecificationBuilder()
               .setMasterMemoryMB(1024)
               .setTaskManagerMemoryMB(1024)
               .setSlotsPerTaskManager(2)
               .createClusterSpecification();

       YarnClusterInformationRetriever ycir = YarnClientYarnClusterInformationRetriever.create(yarnClient);

       YarnConfiguration yarnConf = (YarnConfiguration) yarnClient.getConfig();

       ApplicationConfiguration appConfig = new ApplicationConfiguration(args, appMainClass);

       YarnClusterDescriptor yarnClusterDescriptor = new YarnClusterDescriptor(
               flinkConf,
               yarnConf,
               yarnClient,
               ycir,
               false);

       ClusterClientProvider<ApplicationId> applicationCluster =
               yarnClusterDescriptor.deployApplicationCluster( clusterSpecification, appConfig );

       yarnClient.stop();

   }

   private void enableKrb5(String principal, String keyTab) throws IOException {
     System.setProperty("java.security.krb5.conf", "/x/x/Documents/kerberos/krb5.conf");

       org.apache.hadoop.conf.Configuration krb5conf = new org.apache.hadoop.conf.Configuration();


       String krb5ConfPath = "/x/x/Documents/kerberos/krb5.conf";

       krb5conf.set("hadoop.security.authentication", "kerberos");

       //      UserGroupInformation.setConfiguration(conf)
       UserGroupInformation.setConfiguration(krb5conf);

       // 登录Kerberos并获取UserGroupInformation实例
       UserGroupInformation.loginUserFromKeytab(principal, keyTab);
       UserGroupInformation ugi = UserGroupInformation.getCurrentUser();

       log.debug(ugi.toString());
   }
<think>好的,我现在需要帮用户介绍如何在YARN上搭建Flink集群。首先,我得回忆一下FlinkYARN的基本概念。Flink是一个流处理框架,支持批处理和流处理,而YARN是Hadoop的资源管理器,负责集群资源的调度。基于YARN部署Flink可以让Flink利用YARN的资源管理功能,方便在已有Hadoop集群上运行。 接下来,我应该考虑搭建的前提条件。用户需要已经安装好Hadoop集群,并且确保YARN正常运行。可能还需要JDK,因为Flink是基于Java的。版本兼容性也很重要,比如Flink和Hadoop的版本是否匹配,用户需要检查官方文档确认兼容性。 然后,步骤大概包括下载Flink、配置环境变量、修改Flink的配置文件,比如yarn-site.xml相关的配置,设置YARN的Application Master的内存等。然后通过命令行提交作业到YARN。可能还需要配置高可用性、日志聚合这些高级特性,但用户如果只是基础搭建,可能先关注基本步骤。 需要提醒用户注意的地方,比如网络配置,确保Flink能够访问YARN的资源管理器。还有资源分配的问题,比如每个TaskManager的内存和CPU设置是否合理,避免资源冲突。另外,安全方面,如果集群开启了Kerberos认证,可能需要额外的配置。 可能用户在实际操作中会遇到问题,比如提交作业后无法启动,这时候需要查看YARN的日志,或者Flink的日志,帮助诊断问题。常见的错误可能有端口冲突、内存不足、类路径问题等。 另外,用户可能想知道如何验证集群是否搭建成功,比如提交一个示例作业,看是否能正常运行。或者通过YARN的Web UI查看Flink应用的状态。 最后,应该总结一下步骤,让用户有个清晰的流程,从准备环境到配置,再到提交作业,验证结果。可能还需要给出一些参考链接,比如官方文档或者相关的配置示例,方便用户深入阅读。</think>以下为基于YARN搭建Apache Flink集群的详细步骤: --- ### 一、前置条件 1. **Hadoop集群**:版本建议≥2.4(需包含YARN) 2. **Flink安装包**:从[官网](https://flink.apache.org/downloads.html)下载与Hadoop兼容的版本(选择`Pre-bundled Hadoop`版本) 3. **环境变量**: ```bash export HADOOP_CONF_DIR=/path/to/hadoop/etc/hadoop # Hadoop配置文件目录 export HADOOP_CLASSPATH=`hadoop classpath` # Hadoop类路径 ``` --- ### 二、核心配置 修改Flink配置文件 `conf/flink-conf.yaml`: ```yaml # 指定YARN为部署模式 execution.target: yarn-per-job # 或 yarn-session # 设置JobManager内存(默认1GB) jobmanager.memory.process.size: 2048m # 设置TaskManager内存(默认1GB) taskmanager.memory.process.size: 4096m # 配置高可用(可选) high-availability: zookeeper high-availability.storageDir: hdfs:///flink/ha/ high-availability.zookeeper.quorum: zk1:2181,zk2:2181,zk3:2181 ``` --- ### 三、部署模式 #### 1. Session Cluster(常驻集群) ```bash # 启动YARN Session ./bin/yarn-session.sh -nm MyFlinkSession -jm 2048m -tm 4096m -s 2 # 参数说明: # -nm 应用名称 # -jm JobManager内存 # -tm 每个TaskManager内存 # -s 每个TaskManager的Slot数量 ``` #### 2. Per-Job Cluster(作业独立集群) ```bash # 直接提交作业到YARN ./bin/flink run -t yarn-per-job -yjm 2048m -ytm 4096m ./examples/streaming/WordCount.jar ``` --- ### 四、验证部署 1. **YARN Web UI**:访问 `http://<yarn-resourcemanager>:8088` 查看运行中的Flink应用 2. **Flink Dashboard**:通过YARN Application详情页链接访问Flink Web UI 3. **日志查看**: ```bash yarn logs -applicationId <application_id> ``` --- ### 五、关键配置项 | 配置文件 | 关键参数 | 说明 | |-------------------|-----------------------------------|-----------------------------| | `flink-conf.yaml` | `yarn.application.name` | 在YARN上显示的应用名称 | | | `yarn.application.queue` | 指定YARN队列 | | `log4j.properties`| `rootLogger.appenderRef.file.ref`| 日志输出路径配置 | --- ### 六、常见问题 1. **端口冲突**:修改`conf/flink-conf.yaml`中的`rest.port` 2. **类路径错误**:检查`HADOOP_CLASSPATH`是否包含Hadoop依赖 3. **内存不足**:增加`jobmanager.memory.process.size`和`taskmanager.memory.process.size` > 建议参考[官方文档](https://ci.apache.org/projects/flink/flink-docs-stable/deployment/resource-providers/yarn.html)获取最新配置指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值