Poison


  • 首页

  • 归档

  • 标签

  • 搜索
close
Poison

Spark

发表于 2021-04-07

Coalesce Hints for SQL Queries

该特性用于控制输出的文件数,之前数仓同步时耗时较长,经过定位后发现大部分时间消耗在与 OSS 的数据交互上,主要是小文件引起,每张表默认会生成 200 个文件,后面优化为根据每张表的表记录数计算出一个合适的分区数使用上述 Hint 嵌入在 SQL 中,整个数仓同步耗时降低近 50%.

同时发现的问题还有 emr-oss 连接器中对 System.gc() 的显式调用,该 问题 会导致花费大量时间在不必要的 FullGC 上,后面移除了该调用以提升数仓同步速度。

Poison

Flink

发表于 2021-03-31

Windows:

Introducing Stream Windows in Apache Flink

Aggregation:

Streaming Aggregation

State:

A Deep Dive into Rescalable State in Apache Flink

Poison

NoClassDefFoundError

发表于 2021-03-22

关于 NoClassDefFoundError, 稍有经验的开发应该都遇到过,比如下面这个异常:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException
at java.lang.ClassLoader.defineClass1(Native Method) ~[?:1.8.0_211]
at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~[?:1.8.0_211]
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[?:1.8.0_211]
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468) ~[?:1.8.0_211]
at java.net.URLClassLoader.access$100(URLClassLoader.java:74) ~[?:1.8.0_211]
at java.net.URLClassLoader$1.run(URLClassLoader.java:369) ~[?:1.8.0_211]
at java.net.URLClassLoader$1.run(URLClassLoader.java:363) ~[?:1.8.0_211]
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_211]
at java.net.URLClassLoader.findClass(URLClassLoader.java:362) ~[?:1.8.0_211]
at org.apache.flink.util.ChildFirstClassLoader.loadClassWithoutExceptionHandling(ChildFirstClassLoader.java:71) ~[flink-dist_2.11-1.12.1.jar:1.12.1]
at org.apache.flink.util.FlinkUserCodeClassLoader.loadClass(FlinkUserCodeClassLoader.java:48) ~[flink-dist_2.11-1.12.1.jar:1.12.1]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_211]
at com.aliyun.openservices.log.flink.util.LogClientProxy.<init>(LogClientProxy.java:26) ~[?:?]
at com.aliyun.openservices.log.flink.FlinkLogConsumer.createClient(FlinkLogConsumer.java:65) ~[?:?]
at com.aliyun.openservices.log.flink.FlinkLogConsumer.run(FlinkLogConsumer.java:71) ~[?:?]
at org.apache.flink.streaming.api.operators.StreamSource.run(StreamSource.java:110) ~[flink-dist_2.11-1.12.1.jar:1.12.1]
at org.apache.flink.streaming.api.operators.StreamSource.run(StreamSource.java:66) ~[flink-dist_2.11-1.12.1.jar:1.12.1]
at org.apache.flink.streaming.runtime.tasks.SourceStreamTask$LegacySourceFunctionThread.run(SourceStreamTask.java:241) ~[flink-dist_2.11-1.12.1.jar:1.12.1]
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException
at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[?:1.8.0_211]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_211]
at org.apache.flink.util.FlinkUserCodeClassLoader.loadClassWithoutExceptionHandling(FlinkUserCodeClassLoader.java:64) ~[flink-dist_2.11-1.12.1.jar:1.12.1]
at org.apache.flink.util.ChildFirstClassLoader.loadClassWithoutExceptionHandling(ChildFirstClassLoader.java:74) ~[flink-dist_2.11-1.12.1.jar:1.12.1]
at org.apache.flink.util.FlinkUserCodeClassLoader.loadClass(FlinkUserCodeClassLoader.java:48) ~[flink-dist_2.11-1.12.1.jar:1.12.1]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_211]
... 18 more

ClassNotFoundException 是引起 NoClassDefFoundError 的最常见原因,常见于实际需要使用的依赖版本与应用依赖不一致,这个问题非常常见,但是估计大家都没注意 ClassNotFoundException 为什么会被转换为 NoClassDefFoundError, 在一次线上问题的排查过程中笔者查询了 JLS 中的类的详细初始化顺序 Detailed Initialization Procedure, 在此摘抄一段最核心的部分:

阅读全文 »
Poison

Uber JAR

发表于 2021-03-21

在 Spark、Flink 应用等场景下,经常会将业务代码构造为一个 Uber jar 提交至集群运行,在一次 Hive-UDF 的集成过程中,使用 Apache Maven Shade Plugin 进行 Uber jar 构建后,加载类时提示找不到类,笔者将该 Uber jar 拉取至本地解压后发现类是存在的,但错误日志仅提示找不到类,后经过反复排查,原来是 Jar 包签名问题导致,只是笔者遇到的场景并未提示签名问题导致难以排查。

1
2
3
4
5
6
7
8
9
10
11
12
<filters>
<filter>
<!-- Do not copy the signatures in the META-INF folder.
Otherwise, this might cause SecurityExceptions when using the JAR. -->
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>

相关文档参考:
JAR File Specification
“Invalid signature file” when attempting to run a .jar

Poison

Relocating Classes

发表于 2021-03-21

关于重定位类,笔者初次接触是在编写 Spark 应用时遇到,当时业务应用需要用到一个高版本的 guava 依赖,而 Spark 内置依赖了低版本的 guava, 根据 JVM 默认的类加载顺序,Spark 内置依赖的 guava 依赖优先于业务依赖的 guava 版本,导致业务应用出现找不到方法的异常,后通过 Relocating Classes 将指定的包名进行调整以规避同一个应用域中需要加载不同版本相同类名的问题。

最近编写 Flink 应用也遇到了类似的问题,Flink 官方文档给出了多种方案,其中也包括了上面提到的使用 maven-shade-plugin 对类进行重定位,也提到了 Flink 的反向类加载机制,可以参考下相关文档。

相关文档参考:
Debugging Classloading

12…5

23 日志
22 标签
GitHub
© 2016 - 2021 Poison 蜀ICP备16000644号
由 Hexo 强力驱动
主题 - NexT.Mist