[ 
https://issues.apache.org/jira/browse/FLINK-13414?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17257763#comment-17257763
 ] 

Nick Burkard edited comment on FLINK-13414 at 1/3/21, 1:27 PM:
---------------------------------------------------------------

Hi everyone,

I spent the past few days working on this, building on [~ariskoliopoulos]'s 
work - there's a lot of work that will be needed to properly migrate to 
supporting 2.13. I was using [this 
document|https://docs.scala-lang.org/overviews/core/collections-migration-213.html]
 provided by Scala's website, plus their [compat 
library|https://github.com/scala/scala-collection-compat], to handle the 
migration steps. I wanted to get the community's opinion on a few different 
points. I think the work can be split into a few different tickets to limit 
overall impact.

#1 - Scala 2.11 is very old, most modern Scala libraries do not support it 
anymore.
 The typical support path is 2.12 and 2.13. Supporting 2.11 while also 
supporting 2.13 will make this migration process more difficult. If there's 
consensus to drop 2.11 support, perhaps that should come as part of its own 
ticket first. This will make upgrading libraries to support 2.13 much easier as 
well. On the subject of 2.12, I noticed `flink-scala-shell` only supports 2.11 
and I am unaware if there's interests to continue upgrading it. Wanted to 
mention it in case anyone else has insight.

#2 - Flink makes extensive use of implicit type conversions.
 A lot of Flink's Scala code, especially in the flink-table submodules, make 
repeated use of implicit conversions to convert between Java & Scala types. I 
mention this because `import scala.collection.JavaConversions.__`_ is entirely 
gone in 2.13, which is what provides said implicit conversions. We can instead 
start to import scala.collection.convert.ImplicitConversions._, which is still 
present (albeit deprecated) in 2.13. Worth noting this new import is not 
present in 2.11, it would need to come after point #1. Again, I think this 
could be its own ticket so as to limit the impact.

#3 - `TraversableOnce` is gone in 2.13.
 Internal Java code uses `TraversableOnce` for 
[two|https://github.com/apache/flink/blob/master/flink-scala/src/main/java/org/apache/flink/api/scala/typeutils/TraversableSerializerConfigSnapshot.java]
 
[serializers|https://github.com/apache/flink/blob/master/flink-scala/src/main/java/org/apache/flink/api/scala/typeutils/TraversableSerializerSnapshot.java],
 with comments explicitly stating neither cannot be written in Scala due to 
constructor limitations with the language. This poses a problem, since as far 
as I can tell we can't import the Scala compat library to get access to 
`IterableOnce` in Java code for cross-compiling. We may have to move these two 
files into separate java folders that maven conditionally compiles based on 
Scala version - one for `TraversableOnce` with 2.12 and one for `IterableOnce` 
with 2.13. I was able to get it compiling with this strategy but am open to 
other suggestions.

#4 - Collection conversion has changed.
 The collection compat library will mitigate the difficulty in making this 
change, specifically from using `collection.to[Type]` to using 
`collection.to(Type)`. Probably safe to also include the change for switching 
from `mutable.MutableList` to `mutable.ListBuffer` here since its surface area 
is not as user-facing.

#5 - Code generation has changed.
 Like previously mentioned, the migration from `CanBuildFrom` to `Factory` / 
`BuildFrom` will be necessary, but shouldn't be large, since it's contained to 
the module `flink-scala` from what I could tell.

#6 - `Seq` in 2.12 and 2.13 mean different things.
 2.12 refers to the mutable version, while 2.13 refers to the immutable 
version. This is also present in varargs Scala APIs, such as 
`env.fromCollection("one", "two")`. This poses a problem, as `Seq` is used in 
each of the Scala modules and is quite prevalent in user-facing APIs. Although 
the ambiguity for varargs between versions can't be avoided, we could choose to 
disambiguate typical `Seq` use for 2.12 and 2.13 by enforcing consistent usage. 
This is likely where most of the work will reside depending on the strategy 
chosen. The aforementioned migration doc provides a few options, such as 
internally shadowing `Seq` to make unqualified use illegal (i.e. only allow 
`immutable.Seq` or `collection.Seq`, not `Seq`). I did notice some issues with 
the type serializer though with using qualified versions (`immutable.Seq`), so 
perhaps we want to consider shading `Seq` to always mean one version? Either 
way, this is a large change and should be discussed early.

Overall, the changes for points 1-5 are relatively easy when separated, while 
#6 will likely be a larger change considering how much of the blink table code 
is written in Scala. Open to any and all suggestions. :)


was (Author: nickburkard):
Hi everyone,

I spent the past few days working on this, building on [~ariskoliopoulos]'s 
work - there's a lot of work that will be needed to properly migrate to 
supporting 2.13. I was using [this 
document|https://docs.scala-lang.org/overviews/core/collections-migration-213.html]
 provided by Scala's website, plus their [compat 
library|https://github.com/scala/scala-collection-compat], to handle the 
migration steps. I wanted to get the community's opinion on a few different 
points. I think the work can be split into a few different tickets to limit 
overall impact.

#1 - Scala 2.11 is very old, most modern Scala libraries do not support it 
anymore.
The typical support path is 2.12 and 2.13. Supporting 2.11 while also 
supporting 2.13 will make this migration process more difficult. If there's 
consensus to drop 2.11 support, perhaps that should come as part of its own 
ticket first. This will make upgrading libraries to support 2.13 much easier as 
well. On the subject of 2.12, I noticed `flink-scala-shell` only supports 2.11 
and I am unaware if there's interests to continue upgrading it. Wanted to 
mention it in case anyone else has insight.

#2 - Flink makes extensive use of implicit type conversions.
A lot of Flink's Scala code, especially in the flink-table submodules, make 
repeated use of implicit conversions to convert between Java & Scala types. I 
mention this because `import scala.collection.JavaConversions._` is entirely 
gone in 2.13, which is what provides said implicit conversions. We can instead 
start to import `scala.collection.convert.ImplicitConversions._`, which is 
still present (albeit deprecated) in 2.13. Worth noting this new import is not 
present in 2.11, it would need to come after point #1. Again, I think this 
could be its own ticket so as to limit the impact.

#3 - `TraversableOnce` is gone in 2.13.
Internal Java code uses `TraversableOnce` for 
[two|https://github.com/apache/flink/blob/master/flink-scala/src/main/java/org/apache/flink/api/scala/typeutils/TraversableSerializerConfigSnapshot.java]
 
[serializers|https://github.com/apache/flink/blob/master/flink-scala/src/main/java/org/apache/flink/api/scala/typeutils/TraversableSerializerSnapshot.java],
 with comments explicitly stating neither cannot be written in Scala due to 
constructor limitations with the language. This poses a problem, since as far 
as I can tell we can't import the Scala compat library to get access to 
`IterableOnce` in Java code for cross-compiling. We may have to move these two 
files into separate java folders that maven conditionally compiles based on 
Scala version - one for `TraversableOnce` with 2.12 and one for `IterableOnce` 
with 2.13. I was able to get it compiling with this strategy but am open to 
other suggestions.

#4 - Collection conversion has changed.
The collection compat library will mitigate the difficulty in making this 
change, specifically from using `collection.to[Type]` to using 
`collection.to(Type)`. Probably safe to also include the change for switching 
from `mutable.MutableList` to `mutable.ListBuffer` here since its surface area 
is not as user-facing.

#5 - Code generation has changed.
Like previously mentioned, the migration from `CanBuildFrom` to `Factory` / 
`BuildFrom` will be necessary, but shouldn't be large, since it's contained to 
the module `flink-scala` from what I could tell.

#6 - `Seq` in 2.12 and 2.13 mean different things.
2.12 refers to the mutable version, while 2.13 refers to the immutable version. 
This is also present in varargs Scala APIs, such as `env.fromCollection("one", 
"two")`. This poses a problem, as `Seq` is used in each of the Scala modules 
and is quite prevalent in user-facing APIs. Although the ambiguity for varargs 
between versions can't be avoided, we could choose to disambiguate typical 
`Seq` use for 2.12 and 2.13 by enforcing consistent usage. This is likely where 
most of the work will reside depending on the strategy chosen. The 
aforementioned migration doc provides a few options, such as internally 
shadowing `Seq` to make unqualified use illegal (i.e. only allow 
`immutable.Seq` or `collection.Seq`, not `Seq`). I did notice some issues with 
the type serializer though with using qualified versions (`immutable.Seq`), so 
perhaps we want to consider shading `Seq` to always mean one version? Either 
way, this is a large change and should be discussed early.

Overall, the changes for points 1-5 are relatively easy when separated, while 
#6 will likely be a larger change considering how much of the blink table code 
is written in Scala. Open to any and all suggestions. :)

> Add support for Scala 2.13
> --------------------------
>
>                 Key: FLINK-13414
>                 URL: https://issues.apache.org/jira/browse/FLINK-13414
>             Project: Flink
>          Issue Type: New Feature
>          Components: API / Scala
>            Reporter: Chaoran Yu
>            Priority: Major
>




--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to