【flink】flink获取参数方式

参考官网-Handling Application Parameters

一、idea 本地运行

使用Flink官方的ParameterTool或者其他工具都可以。

二、集群运行flink run/run-application

flink run-application -t yarn-application -h

在这里插入图片描述
flink参数有两种:(1)flink内部参数,此参数会保存到flink stream env中,以下简称opts参数。(2)程序自定义参数,通过入口类main方法传入,程序自行处理,以下简称args参数。(3)设置系统环境变量,从flink Parameter工具中获取,以下简称env参数

参考文章:
系统变量之System.getenv和System.getProperty()
linux环境变量和linux命令export

三、获取flink内部参数的办法-StreamEnv获取参数

举个例子使用以下方式启动flink job。

flink run application -Dstate.savepoints.dir=hdfs://mycluster/flink/flink-checkpoints/my-job ...

可通过以下代码获取:state.savepoints.dir 参数

        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        // flink run/run-application添加参数-s 和 --fromSavepoint
        String savepointRestorePath = env.getConfiguration().get(SavepointConfigOptions.SAVEPOINT_PATH);

需要说明:使用StreamExecutionEnvironmentStreamTableEnvironment 都无法获取参数。

四、具体实战测试

具体测试过程如下:

代码:

public class ConfTest {
    private final static Logger logger = LoggerFactory.getLogger(ConfTest.class);

    public static void main(String[] args) throws Exception {
        ParameterTool argsPt = ParameterTool.fromArgs(args);
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        ParameterTool sysPt=ParameterTool.fromSystemProperties();

        logger.warn(String.format("get from args: %s", argsPt.get("udf.args.key"))); // false
        logger.warn(String.format("get from opts: %s", ExecutionEnvironment.getExecutionEnvironment().getConfiguration().toMap().get("udf.opt.key"))); // false
        logger.warn(String.format("get from env.java.opts.all: %s, java.api.system.properties:%s, java.api.system.env:%s",sysPt.get("job.all.key1") ,System.getProperty("job.all.key1"),System.getenv("job.all.key1"))); // success
        logger.warn(String.format("get from env.java.opts.jobmanager: %s, java.api.system.properties:%s, java.api.system.env:%s",sysPt.get("job.jb.key1"),System.getProperty("job.jb.key1") ,System.getenv("job.jb.key1"))); // success
        logger.warn(String.format("get from env.java.opts.taskmanager: %s, java.api.system.properties:%s, java.api.system.env:%s",sysPt.get("job.ts.key1") ,System.getProperty("job.ts.key1"),System.getenv("job.ts.key1"))); // success
        logger.warn(String.format("get from env.hadoop.conf.dir: %s, java.api.system.properties:%s, java.api.system.env:%s",sysPt.get("HADOOP_CONF_DIR"),System.getProperty("HADOOP_CONF_DIR"),System.getenv("HADOOP_CONF_DIR") )); // success
        logger.warn(String.format("get from java.api.system.properties: %s,pt.apt.system.properties:%s",System.getProperties().get("UDF_ENV_KEY"),sysPt.get("UDF_ENV_KEY") )); // success

        readConfigFromHdfs();

        SourceFunction<String> src = new SourceFunction<String>() {
            long counter = 0;

            @Override
            public void run(SourceContext<String> ctx) throws Exception {
                while (true) {
                    ctx.collect(String.format("ele-%d", counter++));
                    Thread.sleep(5000L);
                }
            }

            @Override
            public void cancel() {
            }
        };

        SingleOutputStreamOperator<String> srcDs = env.addSource(src).name("fake_source");
        // srcDs.print();
        SinkFunction<String> logSink = new SinkFunction<String>() {

            @Override
            public void invoke(String value, Context context) throws Exception {
                logger.warn(String.format("receive val: %s", value));
            }
        };

        srcDs.addSink(logSink).name("log_sink");
        env.execute();
    }

    public static void readConfigFromHdfs() throws IOException {
        // String hadoopConf = ParameterTool.fromSystemProperties().get("HADOOP_CONF_DIR");
        Configuration hc = new Configuration();
        FileSystem fs = FileSystem.get(hc);
        FSDataInputStream is = fs.open(new Path("/user/xxx/flink-conf/hdfs-props.properties"));
        ParameterTool hdfsPt = ParameterTool.fromPropertiesFile(is);
        logger.warn(String.format("get from hdfs props:%s", hdfsPt.toMap().toString())); // success
    }
}

linux环境启动任务:

export UDF_ENV_KEY=ENV_VAL
flink run-application -t yarn-application -d -c com.h3c.test.ConfTest \
-Dyarn.application.name="ConfTest" \
-Dudf.opt.key=opt_val \
-Denv.hadoop.conf.dir=/usr/hadoop/conf \
-Denv.java.opts="-Djob.all.key1=all_val1 -Djob.all.key2=all_val2" \
-Denv.java.opts.jobmanager="-Djob.jb.key1=val1 -Djob.jb.key1=val1" \
-Denv.java.opts.taskmanager="-Djob.ts.key1=val1 -Djob.ts.key2=val2" \
hdfs://mycluster/user/dcetl/lisai/flink-conf/flink-config-1.0.jar \
--udf.args.key args_val

yarn app打印日志:

get from args: args_val
get from opts: opt_val
get from env.java.opts: all_val1, java.api.system.properties:all_val1, java.api.system.env:null
get from env.java.opts.jobmanager: val1, java.api.system.properties:val1, java.api.system.env:null
get from env.java.opts.taskmanager: null, java.api.system.properties:null, java.api.system.env:null
get from env.hadoop.conf.dir: null, java.api.system.properties:null, java.api.system.env:/xxx/hadoop/conf
get from java.api.system.properties: null,pt.apt.system.properties:null
get from hdfs props:{hdfs.key2=val2, hdfs.key1=val1}

五、结论:

(1)推荐从ParameterTool直接读取文件(本地文件或者hdfs文件均可),或从main方法的args解析参数。
(2)如需设置jvm参数推荐使用env.java.opts,注此参数不同flink版本可能不同新版为env.java.opts.all
(3)提交任务机器本地设置的export环境变量,在flink on yarn可能完全获取不到。
(4)-Denv.hadoop.conf.dir设置的HADOOP_CONF_DIR可能不生效,具体设置方法不详。

Flink KafkaSource 可以通过获取 Kafka Topic 的元数据来实现。元数据包括 Topic 的名称、分区数、每个分区的副本数量和分区的 Leader 等信息。 为了获取元数据,我们可以使用 flink-connector-kafka 库提供的 Kafka Consumer API 来连接到 Kafka 集群。具体步骤如下: 1. 创建 Kafka Consumer:使用 flink-connector-kafka 库提供的 Kafka Consumer API 创建一个 Kafka Consumer 实例。在创建实例时,需要配置 Kafka 集群的地址、Topic 的名称以及其他必要参数。 2. 获取 Kafka Topic 的元数据:通过调用 Kafka Consumer 的 `listTopics()` 方法,可以获取到 Kafka 集群中所有的 Topic 和它们的分区信息。该方法返回一个 Map,其中键是 Topic 的名称,值是一个 TopicPartitionInfo 对象,该对象包含了分区的信息。 3. 解析元数据:遍历上一步获取到的 Map,可以获取每个 Topic 的名称和分区数等信息。通过访问 TopicPartitionInfo 对象的方法,可以获取到每个分区的副本数量和 Leader 等元数据。 4. 处理元数据:根据需要,可以将元数据转化为想要的格式或者进行进一步的处理。例如,可以将元数据存储到数据库或者打印到日志中。 通过以上步骤,我们可以使用 Flink KafkaSource 获取 Kafka Topic 的元数据。这些元数据可以帮助我们了解 Topic 的结构以及分区的情况,从而更好地设计和优化 Flink 程序的处理逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值