Flink(三) Flink 编程模型之创建和加载数据集
Flink(三) Flink 编程模型之创建和加载数据集
所有的 Flink 程序都是由三部分组成的: Source 、Transformation 和 Sink。
Source 负责读取数据源, Transformation 利用各种算子进行处理加工, Sink 负责输出。
DataStream Source API
DataSource模块定义了DataStream API的数据输入操作,Flink将数据源主要分为内置数据源和第三方数据源两种类型。
内置数据源
-
文件数据源
readTextFile(path):TextInputFormat逐行读取文本文件,即符合规范的文件,并将它们作为字符串返回。
readFile(fileInputFormat, path):
readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo) :watchType:文件读取类型,interval:检测文件变换事件间隔,pathFilter,文件路径过滤条件
其中:watchType分为PROCESS_CONTINUOUSLY和PROCESS_ONCE。
- PROCESS_CONTINUOUSLY :一旦检测到文件内容发生变化,Flink会将该文件的全部内容加载到Flink系统中进行处理
- PROCESS_ONCE:当文件内容发生变化时,只会将变化的数据读取至Flink,在PROCESS_once模式下,可以保证数据Excatly Once级别的一致性保证
//使用readTextFile方法直接读取文本文件 DataStreamSource<String> stringDataStreamSource = env.readTextFile("F:\\mystudy\\mycode\\myFlink\\src\\main\\java\\testdata\\data.txt"); stringDataStreamSource.print(); //使用readFile(fileInputFormat, path): Path path = new Path("F:\\mystudy\\mycode\\myFlink\\src\\main\\java\\testdata\\LoginLog.csv"); DataStreamSource<String> stringDataStreamSource = env.readFile(new CsvInputFormat<String>(path) { @Override protected String fillRecord(String s, Object[] objects) { return null; } }, "F:\\mystudy\\mycode\\myFlink\\src\\main\\java\\testdata\\LoginLog.csv")
-
Socket数据源
调用socketTextStream方法,获取数据
//接受socket数据流 DataStreamSource<String> textDataSteam = env.socketTextStream("localhost",7777,"\n",5);
该方法参数分别为Ip地址和端口,同时也可以传入字符串切割符delimiter和最大的尝试次数maxRetry
-
集合数据源
集合内的数据结构类型必须要一致,否则可能会出现数据转换异常
-
通过fromElements从元素集合中创建DataStream数据集:
env.fromElements(1,2,5).print();
-
通过formCollection从数组转创建
String[] element=new String[]{"hello","flink"}; env.fromCollection(Arrays.asList(element));
-
将java.util.List转化为DataStream
List<String> arraylist=new ArrayList<>(); arraylist.add("hello flink"); env.fromCollection(arraylist);
外部数据源
flink内置连接器信息:
连接器 是否提供Source支持 是否提供Sink支持 Apache Kafka 是 是 Apache Cassandra 否 是 Amazon Kinesis Data Streams 是 是 Elasticsearch 否 是 Hadoop FileSystem 否 是 RabbitMQ 是 是 Apache Nifi 是 是 Twitter Streaming API 是 否 以Kafka为例:
加入依赖:
<dependency> <groupId>org.apache.flink</groupId> <artifactId> flink-connector-kafka-0.11_2.11</artifactId> <version>1.6.0</version> </dependency>
数据接入:
Properties properties = new Properties(); properties.setProperty("bootstrap.servers","localhost:9092"); properties.setProperty("group.id","consumer-group"); properties.setProperty("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer"); properties.setProperty("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer"); properties.setProperty("auto.offset.reset","lastest"); DataStreamSource<String> sensor = env.addSource(new FlinkKafkaConsumer011<String>("sensor", new SimpleStringSchema(), properties));
-