Flink的并行度问题

Flink的并行度问题

package com.shujia.flink.core

import org.apache.flink.streaming.api.datastream.DataStreamSink
import org.apache.flink.streaming.api.scala._

object Demo4Parallelism {
  def main(args: Array[String]): Unit = {
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    /**
      * flink 的并行度
      * 1、若代码中不设置并行度,提交任务的时候默认是1,可以在提交任务的时候指定并行度 参数: -p
      * flink run -p 并行度的数量 -C 主类名 jar包名
      *
      * 2、代码中可以设置并行度 setParallelism ,代码的优先级比-p参数要高
      * 3、每一个节点可以单独设置并行度
      * 4、如果节点之前的关系没有产生 shuffle 并且并行度一致,
      *    可以合并成一个task(就不用手动设置了)
      */

    //设置默认的并行度
    env.setParallelism(4) 

    //读取socket数据构建DS
    val linesDS: DataStream[String] = env.socketTextStream("master", 8888)
    linesDS.name("读取socket数据")

    // .parallelism -- 获取DS的并行度
    println(s"linesDS的并行度:${linesDS.parallelism}")
    //结果发现 linesDS 的并行度还是1,并不是默认的4
    //读取socket的并行度只能是1
    //因为socket不支持同时被多个线程去读
      

     /**
      * 节点的并行度由默认并行度决定,
      * 也可以单独设置每一个节点的并行度
      * 单独设置并行度的优先级 > 默认并行度
      * Flink中基本上所有的算子都可以改变它的并行度
      */
    val wordsDS: DataStream[String] = linesDS.flatMap(_.split(","))

    //单独设置每一个节点的并行度
    wordsDS.setParallelism(1)

    //设置节点的名称-- .name("展开数据")
    wordsDS.name("展开数据")
    println(s"wordsDS的并行度:${wordsDS.parallelism}")
      
	//将数据转成kv格式
    val kvDS: DataStream[(String, Int)] = wordsDS.map((_, 1))
     /**
      * 如果上游节点和下游节点并行度一样,同时算子不产生shuffle, 可以合并成一个task
      */

    // kvDS.setParallelism(1)

    kvDS.name("转换成kv")

    println(s"kvDS的并行度:${kvDS.parallelism}")
    
    /**
      * keyBy不能设置名称和并行度,因为keyBy不构成一个节点,是一个隐藏的过程
      * 
      * 在Flink中没有去重和排序,因为数据是一条一条流过来的
      */

    val keyVyDS: KeyedStream[(String, Int), String] = kvDS.keyBy(_._1)

    val countDS: DataStream[(String, Int)] = keyVyDS.sum(1)

    countDS.name("统计单词的数量")
    //countDS.setParallelism(2)

    // print 也可以接收,返回 DataStreamSink
    val print: DataStreamSink[(String, Int)] = countDS.print()

    //基本上所有算子都可以设置并行度
    //print.setParallelism(2)
    //print也能设置节点的名字
    print.name("打印结果")

    env.execute()

  }
}

posted @   阿伟宝座  阅读(551)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示