Flink批量处理之DataSet

本文详细介绍了Flink的批量处理模型DataSet,包括内置的数据源(如文件、集合及connectors)、各种算子(transformation、partition和sink)的使用,以及参数传递的方法。特别讨论了如何使用mapPartition操作将数据保存到数据库,并提到了与Hadoop的兼容性,如使用Hadoop的InputFormat和OutputFormat。
摘要由CSDN通过智能技术生成

Flink批量处理之DataSet

flink不仅可以支持实时流式处理,它也可以支持批量处理,其中批量处理也可以看作是实时处理的一个特殊情况

1、dataSet的内置数据源

基于文件数据源

  • readTextFile(path) / TextInputFormat:逐行读取文件并将其作为字符串(String)返回
  • readTextFileWithValue(path) / TextValueInputFormat:逐行读取文件并将其作为StringValue返回。StringValue是Flink对String的封装,可变、可序列化,一定程度上提高性能。 解析以逗号(或其他字符)分隔字段的文件。返回元组或pojo
  • readFileOfPrimitives(path, Class) / PrimitiveInputFormat 跟readCsvFile类似,只不过以原生类型返回而不是Tuple。 读取SequenceFile,以Tuple2<Key, Value>返回

基于集合数据源:

fromCollection(Collection) 
fromCollection(Iterator, Class) 
fromElements(T ...) 
fromParallelCollection(SplittableIterator, Class) 
generateSequence(from, to)

通用数据源:

readFile(inputFormat, path) / FileInputFormat 
createInput(inputFormat) / InputFormat

1.1、文件数据源

入门案例就是基于文件数据源,如果需要对文件夹进行递归,那么我们也可以使用参数来对文件夹下面的多级文件夹进行递归

import org.apache.flink.api.scala.{
   AggregateDataSet, DataSet, ExecutionEnvironment}
object BatchOperate {
   
  def main(args: Array[String]): Unit = {
   
    val inputPath = "D:\\count.txt"
    val outPut = "D:\\data\\result2"

val configuration: Configuration = new Configuration()
configuration.setBoolean("recursive.file.enumeration",true)

    //获取程序入口类ExecutionEnvironment
    val env = ExecutionEnvironment.getExecutionEnvironment
    val text = env.readTextFile(inputPath) .withParameters(configuration)

    //引入隐式转换
    import org.apache.flink.api.scala._
    val value: AggregateDataSet[(String, Int)] = text.flatMap(x => x.split(" ")).map(x =>(x,1)).groupBy(0).sum(1)
    value.writeAsText("d:\\datas\\result.txt").setParallelism(1)
    env.execute("batch word count")
  }
}

1.2、集合数据源

import org.apache.flink.api.scala.{
   DataSet, ExecutionEnvironment}

object DataSetSource {
   

  def main(args: Array[String]): Unit = {
   
    //获取批量处理程序入口类ExecutionEnvironment
    val environment: ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment

    import org.apache.flink.api.scala._
    //从集合当中创建dataSet
    val myArray = Array("hello world","spark flink")
    val collectionSet: DataSet[String] = environment.fromCollection(myArray)
    val result: AggregateDataSet[(String, Int)] = collectionSet.flatMap(x => x.split(" ")).map(x =>(x,1)).groupBy(0).sum(1)
    result.setParallelism(1).print()
   // result.writeAsText("c:\\HELLO.TXT")
    environment.execute()
  }

}

1.3、Flink的dataSet connectors

文件系统connector
为了从文件系统读取数据,Flink内置了对以下文件系统的支持:

文件系统 Schema 备注
HDFS hdfs:// Hdfs文件系统
S3 s3:// 通过hadoop文件系统实现支持
MapR maprfs:// 需要用户添加jar
Alluxio alluxio:// 通过hadoop文件系统实现

注意:Flink允许用户使用实现org.apache.hadoop.fs.FileSystem接口的任何文件系统。例如S3、 Google Cloud Storage Connector for Hadoop、 Alluxio、 XtreemFS、 FTP等各种文件系统

Flink与Apache Hadoop MapReduce接口兼容,因此允许重用Hadoop MapReduce实现的代码:
使用Hadoop Writable data type
使用任何Hadoop InputFormat作为DataSource(flink内置HadoopInputFormat)
使用任何Hadoop OutputFormat作为DataSink(flink内置HadoopOutputFormat)
使用Hadoop Mapper作为FlatMapFunction
使用Hadoop Reducer作为GroupReduceFunction

2、dataSet的算子介绍

官网算子介绍

2.1、dataSet的transformation算子

Map:输入一个元素,然后返回一个元素,中间可以做一些清洗转换等操作
FlatMap:输入一个元素,可以返回零个,一个或者多个元素
MapPartition:类似map,一次处理一个分区的数据【如果在进行map处理的时候需要获取第三方资源链接,建议使用MapPartition】
Filter:过滤函数,对传入的数据进行判断,符合条件的数据会被留下<

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值