新聞中心
01 Java 開發(fā)者
暫時(shí)拋開網(wǎng)友的問題,我們先黑盒子方式啟程一下Java開發(fā)者構(gòu)建一個(gè)簡單示例。初學(xué)者我們還是模版走...

我們以mvn命令方式切入,如下命令:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-walkthrough-datastream-java \
-DarchetypeVersion=1.13.0 \
-DgroupId=khkw \
-DartifactId=helloJava \
-Dversion=0.1 \
-Dpackage=khkw \
-DinteractiveMode=false
上面命令最終看到如下成功信息:
接下來,我們看看生成的pom依賴和示例的import情況,我使用Idea查看,所以到hellojava目錄下執(zhí)行 mvn idea:idea 之后用IDE打開。
在properties里面也聲明了scala的版本2.11,也及時(shí)在dependency依賴?yán)锩嬉彩褂昧藄cala的版本信息,這一點(diǎn)是網(wǎng)友很困惑的點(diǎn),我稍后解釋。我們在看看Java開發(fā)DataStream最核心的依賴是什么?
我們發(fā)現(xiàn)最核心的依賴是 flink-streaming-java_2.11,這里雖然是java開發(fā),但是也的確攜帶了scala的版本后綴。為啥會(huì)這樣呢?后面說flink整體scala/java設(shè)計(jì)部分解釋,這里只是聲明一個(gè)依賴是一次性工作,如果引入依賴之后后面的開發(fā)沒有import的誤區(qū)那么可以暫時(shí)忍受一下。我們重點(diǎn)看到開發(fā)過程是否有讓人困惑的地方?我們打開FraudDetectionJob作業(yè)主類,如下:
和業(yè)務(wù)相關(guān)的import是開發(fā)者自己非常清楚的,不必多說,和flink框架相關(guān)的引入只有DataStream & StreamExecutionEnvironment ,那么我們在自動(dòng)import時(shí)候是否有import錯(cuò)誤的可能呢?這個(gè)是Flink java開發(fā)者的省心的地方,如下:
這里我們發(fā)現(xiàn),Java用戶沒有機(jī)會(huì)犯錯(cuò),都只有唯一的一個(gè)。但對(duì)于Scala用戶來說就沒有那么容易了,我們繼續(xù)往下看...
02 Scala 開發(fā)者
我們同樣也是以mvan命令的方式來建立示例工程,如下:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-walkthrough-datastream-scala \
-DarchetypeVersion=1.13.0 \
-DgroupId=khkw \
-DartifactId=helloScala \
-Dversion=0.1 \
-Dpackage=khkw \
-DinteractiveMode=false
成功創(chuàng)建之后,我們同樣打開pom文件查看依賴關(guān)系,如下:
這個(gè)對(duì)于scala用戶來說是非常正常的依賴了,不論是artifacId名字還是攜帶scala版本都是很合理的設(shè)計(jì)。我們再來看看開發(fā)過程類的import情況是否一樣明了?
看到上面情況,初學(xué)者應(yīng)該會(huì)有點(diǎn)蒙圈了:( ,我需要的類有這么多,怎么選擇?
對(duì)于Scala開發(fā)者看到和類同名的Object其實(shí)很容易理解,那么Scala里面也有一個(gè)同名的Java實(shí)現(xiàn),對(duì)于初學(xué)者可能就會(huì)稍微猶豫一下,但是既然我們用Scala開發(fā),java和scala并存的時(shí)候優(yōu)先選擇Scala實(shí)現(xiàn)。
那么為啥有2個(gè)同名的實(shí)現(xiàn),我們看看依賴樹就感覺是那么回事了,如下:
Flink Runtime是Java開發(fā)的,Scala API是建立在Java API基礎(chǔ)之上的,所以對(duì)于Scala用戶來說理論上永遠(yuǎn)有2個(gè)選擇,雖然選擇是很明確的。
03 為什么Java模塊需要Scala版本后綴?
我們還是網(wǎng)友所問的作為切入點(diǎn):“像java-datastream_2.11這種,都寫著java了。后面又分2.11”,問題很好,為什么 flink-streaming-java 模塊的artifactId要攜帶2.11,這個(gè) flink-streaming-java_2.11 讓人費(fèi)解,我們先看現(xiàn)狀,依賴關(guān)系,如下:
[INFO] org.apache.flink:flink-streaming-java_2.11:jar:1.14-SNAPSHOT
[INFO] +- org.apache.flink:flink-core:jar:1.14-SNAPSHOT:compile
[INFO] | +- org.apache.flink:flink-annotations:jar:1.14-SNAPSHOT:compile
[INFO] | +- org.apache.flink:flink-metrics-core:jar:1.14-SNAPSHOT:compile
[INFO] | +- org.apache.flink:flink-shaded-asm-7:jar:7.1-13.0:compile
[INFO] | +- org.apache.commons:commons-lang3:jar:3.3.2:compile
[INFO] | +- com.esotericsoftware.kryo:kryo:jar:2.24.0:compile
[INFO] | | \- com.esotericsoftware.minlog:minlog:jar:1.2:compile
[INFO] | +- commons-collections:commons-collections:jar:3.2.2:compile
[INFO] | \- org.apache.commons:commons-compress:jar:1.20:compile
[INFO] +- org.apache.flink:flink-file-sink-common:jar:1.14-SNAPSHOT:compile
[INFO] +- org.apache.flink:flink-runtime_2.11:jar:1.14-SNAPSHOT:compile
[INFO] | +- org.apache.flink:flink-queryable-state-client-java:jar:1.14-SNAPSHOT:compile
[INFO] | +- org.apache.flink:flink-hadoop-fs:jar:1.14-SNAPSHOT:compile
[INFO] | +- commons-io:commons-io:jar:2.8.0:compile
[INFO] | +- org.apache.flink:flink-shaded-netty:jar:4.1.49.Final-13.0:compile
[INFO] | +- org.apache.flink:flink-shaded-jackson:jar:2.12.1-13.0:compile
[INFO] | +- org.apache.flink:flink-shaded-zookeeper-3:jar:3.4.14-13.0:compile
[INFO] | +- commons-cli:commons-cli:jar:1.3.1:compile
[INFO] | +- org.javassist:javassist:jar:3.24.0-GA:compile
[INFO] | +- org.scala-lang:scala-library:jar:2.11.12:compile
[INFO] | +- com.typesafe.akka:akka-actor_2.11:jar:2.5.21:compile
[INFO] | | +- com.typesafe:config:jar:1.3.0:compile
[INFO] | | \- org.scala-lang.modules:scala-java8-compat_2.11:jar:0.7.0:compile
[INFO] | +- com.typesafe.akka:akka-stream_2.11:jar:2.5.21:compile
[INFO] | | +- org.reactivestreams:reactive-streams:jar:1.0.2:compile
[INFO] | | \- com.typesafe:ssl-config-core_2.11:jar:0.3.7:compile
[INFO] | | \- org.scala-lang.modules:scala-parser-combinators_2.11:jar:1.1.1:compile
[INFO] | +- com.typesafe.akka:akka-protobuf_2.11:jar:2.5.21:compile
[INFO] | +- com.typesafe.akka:akka-slf4j_2.11:jar:2.5.21:compile
[INFO] | +- org.clapper:grizzled-slf4j_2.11:jar:1.3.2:compile
[INFO] | +- com.github.scopt:scopt_2.11:jar:3.5.0:compile
[INFO] | +- org.xerial.snappy:snappy-java:jar:1.1.8.3:compile
[INFO] | \- org.lz4:lz4-java:jar:1.6.0:compile
[INFO] +- org.apache.flink:flink-java:jar:1.14-SNAPSHOT:compile
[INFO] +- org.apache.flink:flink-shaded-guava:jar:18.0-13.0:compile
[INFO] +- org.apache.commons:commons-math3:jar:3.5:compile
[INFO] +- org.apache.flink:flink-core:test-jar:tests:1.14-SNAPSHOT:test
[INFO] +- org.apache.flink:flink-test-utils-junit:jar:1.14-SNAPSHOT:test
[INFO] +- org.apache.flink:flink-runtime_2.11:test-jar:tests:1.14-SNAPSHOT:test
[INFO] +- org.apache.flink:flink-shaded-force-shading:jar:13.0:compile
[INFO] +- org.slf4j:slf4j-api:jar:1.7.15:compile
[INFO] +- com.google.code.findbugs:jsr305:jar:1.3.9:compile
[INFO] +- junit:junit:jar:4.13.2:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- org.mockito:mockito-core:jar:2.21.0:test
[INFO] | +- net.bytebuddy:byte-buddy:jar:1.8.15:test
[INFO] | +- net.bytebuddy:byte-buddy-agent:jar:1.8.15:test
[INFO] | \- org.objenesis:objenesis:jar:2.1:compile
[INFO] +- org.powermock:powermock-module-junit4:jar:2.0.4:test
[INFO] | \- org.powermock:powermock-module-junit4-common:jar:2.0.4:test
[INFO] | +- org.powermock:powermock-reflect:jar:2.0.4:test
[INFO] | \- org.powermock:powermock-core:jar:2.0.4:test
[INFO] +- org.powermock:powermock-api-mockito2:jar:2.0.4:test
[INFO] | \- org.powermock:powermock-api-support:jar:2.0.4:test
[INFO] +- org.hamcrest:hamcrest-all:jar:1.3:test
[INFO] +- org.apache.logging.log4j:log4j-slf4j-impl:jar:2.14.1:test
[INFO] +- org.apache.logging.log4j:log4j-api:jar:2.14.1:test
[INFO] +- org.apache.logging.log4j:log4j-core:jar:2.14.1:test
[INFO] \- org.apache.logging.log4j:log4j-1.2-api:jar:2.14.1:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 42.595 s
[INFO] Finished at: 2021-06-26T08:57:22+08:00
[INFO] ------------------------------------------------------------------------
我們發(fā)現(xiàn)flink-streaming-java,依賴了flink-runtime_2.11也是有scala版本后綴的,一樣的困惑,為啥純java寫的flink runtime要一攜帶scala的版本號(hào),繼續(xù)追,發(fā)現(xiàn)flink-runtime也是依賴了akka-actor/stream/protobuf_2.11,也就是flink依賴的三方庫雖然是純java的但是同樣攜帶了scala版本。按照這種鉆取方式我們就要去挖akka-stream為啥攜帶scala版本后綴了, 那這個(gè)問題就到底了,akka是50+的代碼都是用scala寫的,查看 https://github.com/akka/akka 。
04 未來會(huì)怎樣?
用戶的眼光都是雪亮的,問題都是一針見血的,這問題也的的確確是Flink社區(qū)需要解決的,也發(fā)起了去掉Scala依賴的討論。
詳情:
https://lists.apache.org/thread.html/rd7bf0dabe2d75adb9f97a1879638711d04cfce0774d31b033acae0b8%40%3Cdev.flink.apache.org%3E
05 Flink從那一層主動(dòng)使用Scala?
那么上面Java模塊需要scala后綴是被動(dòng)的,那么Flink從哪個(gè)層面是主動(dòng)引入Scala的呢?這個(gè)主要是從Flink開發(fā)者受眾角度思考的,F(xiàn)link雖然核心是Java寫的,但是更加期望更多的非Java的開發(fā)者可以在不切換開發(fā)語言的前提下便捷的使用Flink。
對(duì)于Scala用戶天然能用Java的API但是Scala相對(duì)于Java來說從語言API上面有很多的優(yōu)勢,所以Flink社區(qū)為了不改變Scala用戶的開發(fā)習(xí)慣,為Scala用戶提
文章題目:初學(xué)Tips-為啥Flink的Java模塊需要Scala的版本后綴
鏈接URL:http://m.fisionsoft.com.cn/article/cccsdhc.html


咨詢
建站咨詢
