Flink批量处理之DataSet
flink不仅可以支持实时流式处理,它也可以支持批量处理,其中批量处理也可以看作是实时处理的一个特殊情况
1、dataSet的内置数据源
基于文件数据源
readTextFile(path) / TextInputFormat
:逐行读取文件并将其作为字符串(String)返回readTextFileWithValue(path) / TextValueInputFormat
:逐行读取文件并将其作为StringValue返回。StringValue是Flink对String的封装,可变、可序列化,一定程度上提高性能。 解析以逗号(或其他字符)分隔字段的文件。返回元组或pojoreadFileOfPrimitives(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
:过滤函数,对传入的数据进行判断,符合条件的数据会被留下<