DataStream 轉換操作
轉換就是從一個或多個Datastream生成新的Datastream的過程。所有Datastream的轉換操作可以分爲單Single-Datastream、Multi-Datastream、物理分區三類類型。
1、Single-Datastream 操作
Single-Datastream主要有Map、FlatMap、Filter、KeyBy、Reduce、Aggregations等算子。
2、Muti-Datastream 操作
Muti-Datastream 主要有Union、Connect、CoMap、CoFlatMap、Split、Select、Iterate等算子。
3、物理分區操作
物理分區操作的作用是根據指定分區策略將數據重新分配到不同節點的Task上執行。常見的分區策略有隨機分區、平衡分區、按比例分區、自定義分區。
Flink 內部常見的數據重分區的策略:
(1)隨機分區(random partition)
通過隨機分區將數據分配到下游的算子的每個分區中,分區相對均衡,但比較容易失去原有數據的分區結構。
var shuffleStream = dataStream.shuffle
(2) 平衡分區(roundrobin partition)
通過循環的方法對數據集中重分區,能夠儘可能保證每個分區的數據平衡,當數據傾斜時可以使用這個分區策略來優化。
val shuffleStream = dataStream.rebalance()
(3)按比例分區(rescale partition)
也是通過循環的方式將數據重平衡,但與平衡分區策略不同的是,平衡分區是全局性通過網絡介質將數據傳輸到其他的節點完成數據的重新平衡,而按比例分區只是對上下游算子數據進行重平衡。
val shuffleStream = dataStream.rescale()
(4)廣播操作(broadcast)
通過廣播操作可以將小數據集分發到算子的每個分區中。
val shuffleStream = dataStream.broadcast()
(5) 自定義分區(custom partition)
用戶實現自定義分區器,然後調用DataStream API 上 partitionCustom() 方法將創建的分區器應用到數據集上。
//自定義分區器
object customPartitioner extends Partitions[String] {
.......
}
//通過數據集字段名稱指定分區字段
dataStream.partitionCustom(customPartitioner ,"field_name")
//通過數據集字段索引指定分區字段
dataStream.partitionCustom(customPartitioner ,0)
DataSinks 數據輸出
在Flink中DataStream數據輸出到外部系統的過程叫DataSink操作。在Flink內部定義的第三方外部系統連接器中,支持數據輸出的有Kafka、Cassandra、Kinesis、Elasticsearch、Hadoop FileSystem、RabbitMQ、NIFI等。
1、基本數據輸出
基本輸出包含了文件輸出、客戶端輸出、Socket網絡端口輸出等。
dataStream.writeAsCSV(filePath,WriteMode.OVERWRITE)
dataStream.writeAsText(filePath)
dataStream.writeToSocket(host,port,new SimpleStringScheme())
2、第三方數據輸出
val kafkaProducer = new FlinkKafkaProducer011[String](url,topic,new SimplezStringScheme)
dataStream.addSink(kafkaProducer)
博主的微信公衆號,不定期發佈技術文章,喜歡的可以關注一下哈