向Flink传递自定义参数的3种方式(withParameters、setGlobalJobParameters、ParameterTool)

本文介绍了如何使用Apache Flink中的ParameterTool类解决中文乱码问题,并展示了如何在WithParameters和GlobalJobParameters类中动态设置配置参数。通过实例演示了如何正确处理配置参数和中文字符串,适合Flink开发者理解和实践。

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

1. devBase\WithParameters.scala

package devBase

import org.apache.flink.api.common.functions.RichMapFunction
import org.apache.flink.api.scala.{DataSet, ExecutionEnvironment, createTypeInformation}
import org.apache.flink.configuration.{ConfigOptions, Configuration}



class WithParametersMapFunction extends RichMapFunction[String, String] {

  private var bigdata:String = null

  override def map(value: String):String = {

    if (value == bigdata) "bigdata" else value
  }

  override def open(parameters: Configuration): Unit = {

    val configOption = ConfigOptions.key("bigdata")
      .stringType()
      .noDefaultValue()

    bigdata = parameters.getString(configOption)

  }

}

object WithParameters {


  def main(args: Array[String]): Unit = {


    val env = ExecutionEnvironment.getExecutionEnvironment
    val conf = new Configuration()
    conf.setString("bigdata", "flink")

    val text: DataSet[String] = env.fromElements("flink", "spark", "hadoop")

    val ds = text.map(new WithParametersMapFunction())
      // 只支持batch处理; 作用于上面的map, 将conf传递给rich类的open方法
      .withParameters(conf)

    ds.print()


  }

}

执行结果如下:

bigdata
spark
hadoop

2. devBase\GlobalJobParameters.scala

package devBase

import apiTest.WordSourceFunction
import org.apache.flink.api.common.functions.RichMapFunction
import org.apache.flink.api.scala.{DataSet, ExecutionEnvironment, createTypeInformation}
import org.apache.flink.configuration.{ConfigOptions, Configuration}
import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment}


class GlobalJobParametersMapFunction extends RichMapFunction[String, String] {

  private var bigdata:String = null

  override def map(value: String):String = {

    if (value == bigdata) "bigdata-" + value else value
  }

  override def open(parameters: Configuration): Unit = {

    val globalJobParameters= getRuntimeContext
      .getExecutionConfig.getGlobalJobParameters
      .asInstanceOf[Configuration]

    val configOption = ConfigOptions.key("bigdata")
      .stringType()
      .noDefaultValue()

    bigdata = globalJobParameters.getString(configOption)

  }

}

object GlobalJobParameters {

  def main(args: Array[String]): Unit = {

    val conf = new Configuration()
    conf.setString("bigdata", "flink")
    val senv = StreamExecutionEnvironment.getExecutionEnvironment
    senv.getConfig.setGlobalJobParameters(conf)
    // senv.getConfig.setGlobalJobParameters(parameterTool)


    val text: DataStream[String] = senv.addSource(new WordSourceFunction)

    val ds = text.map(new GlobalJobParametersMapFunction())


    ds.print()
    senv.execute()



  }

}

执行结果:

4> world
5> stream
6> table
7> sql
8> bigdata-flink
1> bigdata-flink
2> batch
......省略部分......

3. devBase\ParameterToolTest.scala

package devBase

import org.apache.flink.api.java.utils.ParameterTool

import java.io.{File, FileInputStream}
import scala.collection.JavaConversions.mapAsJavaMap


object ParameterToolTest {


  def main(args: Array[String]): Unit = {

    val map = Map("id" -> "10", "name" -> "LiMing", "age" -> "10")
    val parameter_map = ParameterTool.fromMap(map)
    println("======map====== " + parameter_map.getRequired("name"))
    println("======map====== " + parameter_map.get("name", "default_name"))
    println("======map====== " + parameter_map.getInt("id", 0))
    println("======map====== " + parameter_map.getNumberOfParameters)
    println("======map====== " + parameter_map.getProperties)


    val prop_path = "src/main/resources/parameterToolTest.properties"
    val parameter_prop_path=ParameterTool.fromPropertiesFile(prop_path)
    println("======path====== " + parameter_prop_path.get("name"))

    val prop_file = new File(prop_path)
    val parameter_prop_file=ParameterTool.fromPropertiesFile(prop_file)
    println("======file====== " + parameter_prop_file.get("name"))

    val prop_stream = new FileInputStream(prop_file)
    val parameter_prop_stream=ParameterTool.fromPropertiesFile(prop_stream)
    println("======stream====== " + parameter_prop_stream.get("name"))

    // 例子:--input hdfs://xxx --output hdfs://xxx
    val parameter_args=ParameterTool.fromArgs(args)
    println("======args====== " + parameter_args.get("name"))

    val parameter_system=ParameterTool.fromSystemProperties()
    println("======system====== " + parameter_system.get("java.vm.version"))


  }

}

执行结果:

======map====== LiMing
======map====== LiMing
======map====== 10
======map====== 3
======map====== {age=10, name=LiMing, id=10}
======path====== LiMing
======file====== LiMing
======stream====== LiMing
======args====== null
======system====== 25.201-b09

4. ParameterTool解决中文乱码问题

使用ParameterTool读取properties配置文件,如果有中文,读取的是会乱码的。可以使用如下方法指定UTF-8编码读取

import java.io.{BufferedReader, InputStream, InputStreamReader}
import java.util.Properties
import org.apache.flink.api.java.utils.ParameterTool

object ParameterToolTest {

  def main(args: Array[String]): Unit = {
  
    val resourceProperties = new Properties()
    val resourceInputStream:InputStream = this.getClass.getClassLoader.getResourceAsStream("parameterToolTest.properties")
    val resourceInputStreamReader:InputStreamReader = new InputStreamReader(resourceInputStream, "UTF-8")
    val resourceBufferedReader:BufferedReader = new BufferedReader(resourceInputStreamReader)
    resourceProperties.load(resourceBufferedReader)

    val parameterTool = ParameterTool.fromMap(resourceProperties.asInstanceOf[java.util.Map[String,String]])
    println("======chinese stream====== " + parameterTool.get("chinese_name"))
  }

}

执行结果:

======chinese stream====== 李明
小海豚是一个使用Apache Flink实现数据流处理的任务,它可以处理海洋中海豚的相关数据。在小海豚任务中,我们可以使用自定义参数来控制任务的行为和输出结果。 首先,我们可以使用自定义参数来指定任务的输入源,比如指定从哪个Kafka主题或文件读取数据。这样,我们可以根据不同的需求,切换不同的数据源,并获得不同的海豚数据。 其次,我们可以使用自定义参数来设定数据处理的逻辑。例如,按时间窗口对海豚的位置数据进行聚合,在每个窗口内计算海豚的平均速度和距离等统计信息。通过调整参数,我们可以改变窗口的大小和滑动距离,以获得不同粒度的数据统计结果。 此外,自定义参数还可以指定任务的输出方式。比如,可以将计算结果输出到Kafka主题或保存为Parquet文件。通过调整参数,我们可以选择不同的输出方式,以满足我们的需求。 最后,自定义参数还可以用于指定任务的并行度。在Flink中,任务的并行度决定了任务可以同时处理的并行任务数。通过调整参数,我们可以增加或减少任务的并行度,以提高任务的处理性能。 总之,小海豚任务可以通过自定义参数来控制任务的输入源、数据处理逻辑、输出方式和并行度等方面。通过灵活调整这些参数,我们可以实现不同的数据处理需求,并获得满足要求的输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值