问题1:找不到参数证据$2:typeinformation[(string,string,string)]
Flink error: No implicits found for parameter evidence$2: TypeInformation[(String, String, String)]
问题1解决:
import org.apache.flink.api.scala._
问题2:运算符名称数据源超出了80个字符的长度限制,已被截断。(不影响使用,只是一个异常日志信息)
WARN: The operator name DataSource exceeded the 80 characters length limit and was truncated.
问题2解决:
在org.apache.flink.metrics.MetricGroup 的实现类中的
org.apache.flink.runtime.metrics.groups.TaskMetricGroup类中定义了
static final int METRICS_OPERATOR_NAME_MAX_LENGTH = 80;
那这个METRICS_OPERATOR_NAME是什么呢?
[Apache Flink 进阶(八):详解 Metrics 原理与实战][]
什么是 Metrics?
Flink 提供的 Metrics 可以在 Flink 内部收集一些指标,通过这些指标让开发人员更好地理解作业或集群的状态。由于集群运行后很难发现内部的实际状况,跑得慢或快,是否异常等,开发人员无法实时查看所有的 Task 日志,比如作业很大或者有很多作业的情况下,该如何处理?此时 Metrics 可以很好的帮助开发人员了解作业的当前状况。
什么是Metric Group?
Metric 在 Flink 内部有多层结构,以 Group 的方式组织,它并不是一个扁平化的结构,Metric Group + Metric Name 是 Metrics 的唯一标识。
Metric Group 的层级有 TaskManagerMetricGroup 和TaskManagerJobMetricGroup,每个 Job 具体到某一个 task 的 group,task 又分为 TaskIOMetricGroup 和 OperatorMetricGroup。Operator 下面也有 IO 统计和一些 Metrics,整个层级大概如下图所示。Metrics 不会影响系统,它处在不同的组中,并且 Flink支持自己去加 Group,可以有自己的层级。
•TaskManagerMetricGroup
•TaskManagerJobMetricGroup
•TaskMetricGroup
•TaskIOMetricGroup
•OperatorMetricGroup
•${User-defined Group} / ${User-defined Metrics}
•OperatorIOMetricGroup
•JobManagerMetricGroup
•JobManagerJobMetricGroup
除了系统的 Metrics 之外,Flink 支持自定义 Metrics ,即 User-defined Metrics。
好的,理解了什么是Metrics了后,我们还知道了这个东西可以自定义。也就是说会报无聊的日志信息,就是因为你是用默认的Metrics了。我们可以到代码中确认下(org.apache.flink.metrics.MetricGroup类中):
public OperatorMetricGroup getOrAddOperator(OperatorID operatorID, String name) {
if (name != null && name.length() > METRICS_OPERATOR_NAME_MAX_LENGTH) {
LOG.warn("The operator name {} exceeded the {} characters length limit and was truncated.", name, METRICS_OPERATOR_NAME_MAX_LENGTH);
name = name.substring(0, METRICS_OPERATOR_NAME_MAX_LENGTH);
}
OperatorMetricGroup operator = new OperatorMetricGroup(this.registry, this, operatorID, name);
// unique OperatorIDs only exist in streaming, so we have to rely on the name for batch operators
final String key = operatorID + name;
synchronized (this) {
OperatorMetricGroup previous = operators.put(key, operator);
if (previous == null) {
// no operator group so far
return operator;
} else {
// already had an operator group. restore that one.
operators.put(key, previous);
return previous;
}
}
}
我们可以看到,在getOrAddOperator操作中,首先会对传入的名字的长度进行判断,长于80了,就在String后面用一个substring。
那我的控制台为啥连报了4次这个日志呢?
只是因为我的代码执行了4此操作而已,而它每次操作都会使用这个方法。。。
问题3:找不到类 CaseClassTypeInfo
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/flink/api/scala/typeutils/CaseClassTypeInfo
Caused by: java.lang.ClassNotFoundException: org.apache.flink.api.scala.typeutils.CaseClassTypeInfo
问题3解决:
这是java编写flinkSQL时遇到的问题。
- 这个类是scala才有的,flink-java没有,所以还需要加flink-scala_2.11的依赖
- 注意去掉<scope>provided</scope>
flink-table在java下的依赖:
<dependencies>
<!-- Apache Flink dependencies -->
<!-- These dependencies are provided, because they should not be packaged into the JAR file. -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_2.11</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge_2.11</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-common</artifactId>
<version>1.8.0</version>
</dependency>
<!-- Add connector dependencies here. They must be in the default scope (compile). -->
<!-- Example:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka-0.10_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
-->
<!-- Add logging framework, to produce console output when running in the IDE. -->
<!-- These dependencies are excluded from the application JAR by default. -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<scope>runtime</scope>
</dependency>
</dependencies>