Apache Flink自学踩坑

问题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 原理与实战][https://www.cnblogs.com/zhaowei121/p/11906901.html]

什么是 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时遇到的问题。

  1. 这个类是scala才有的,flink-java没有,所以还需要加flink-scala_2.11的依赖
  2. 注意去掉<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>

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值