Flink CDC中我加了log4j 后报这个错,怎么办?

Flink CDC中我加了log4j 后报这个错,怎么办?image.png image.png

展开
收起
真的很搞笑 2023-05-14 20:24:06 124 分享 版权
阿里云 AI 助理回答

在使用Flink CDC时,如果添加了Log4j后出现错误,可能是由于依赖冲突或Log4j配置问题导致的。以下是详细的排查和解决方法:


1. 排查依赖冲突

Flink作业中引入Log4j相关依赖可能会与其他依赖(如Flink自带的Log4j、Hadoop或其他第三方库)发生冲突,从而引发异常。

排查步骤:

  • 检查pom.xml文件
    查看是否存在不必要的Log4j依赖,尤其是与Flink或Hadoop相关的依赖。可以通过以下命令查看依赖树:

    mvn dependency:tree
    

    如果发现重复或冲突的Log4j依赖,需要通过exclusions排除这些依赖。例如:

    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-streaming-java_2.11</artifactId>
      <version>${flink.version}</version>
      <scope>provided</scope>
      <exclusions>
          <exclusion>
              <groupId>org.apache.logging.log4j</groupId>
              <artifactId>log4j-core</artifactId>
          </exclusion>
      </exclusions>
    </dependency>
    
  • 检查JAR包内容
    使用以下命令查看生成的JAR包是否包含Log4j相关类:

    jar tf your-job.jar | grep log4j
    

    如果发现多余的Log4j类,说明存在依赖冲突。

解决方案:

  • 使用maven-shade-plugin重定位Log4j类
    如果必须使用不同版本的Log4j,可以通过maven-shade-plugin将Log4j相关的类重定位到其他命名空间,避免冲突。示例配置如下:
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>3.2.4</version>
      <executions>
          <execution>
              <phase>package</phase>
              <goals>
                  <goal>shade</goal>
              </goals>
              <configuration>
                  <relocations>
                      <relocation>
                          <pattern>org.apache.log4j</pattern>
                          <shadedPattern>com.shaded.log4j</shadedPattern>
                      </relocation>
                  </relocations>
              </configuration>
          </execution>
      </executions>
    </plugin>
    

2. 检查Log4j配置

如果依赖没有冲突,可能是Log4j配置本身存在问题。例如,Log4j的Lookup功能可能引发安全漏洞或配置错误。

检查步骤:

  • 确认日志级别设置
    确保Log4j的日志级别配置正确。例如,如果您希望仅记录错误级别的日志,可以设置如下参数:

    log4j.logger.org.apache.kafka.clients.consumer=ERROR
    log4j.logger.org.apache.kafka.clients.producer=ERROR
    
  • 禁用Log4j Lookup功能
    如果您使用的是Log4j 2.x版本,建议禁用Lookup功能以避免潜在的安全风险。可以在Flink作业的JVM参数中添加以下配置:

    env.java.opts: '-Dlog4j2.formatMsgNoLookups=true'
    
  • 修改日志格式
    如果日志配置中使用了类似${ctx:loginId}$${ctx:loginId}的Context Lookup模式,建议将其替换为Thread Context Map模式,例如%X, %mdc, or %MDC


3. 开启Debug日志进行进一步排查

如果上述方法无法解决问题,建议开启Debug日志以获取更详细的错误信息。具体操作如下: - 在Flink作业的配置中添加以下参数:

log4j.rootLogger=DEBUG, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
  • 观察日志中是否有类似InvocationTargetExceptionCannot allocate the requested resources的异常信息。如果有,可能是RPC调用或资源分配问题导致的。

4. 其他注意事项

  • 确保Connector依赖正确
    如果您使用了Kafka等Connector,确保其依赖已正确添加到pom.xml中,并且scope设置为compile。例如:

    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-connector-kafka_2.11</artifactId>
      <version>${flink.version}</version>
    </dependency>
    
  • 避免使用只读实例
    如果您的MySQL CDC源表读取的是RDS的只读实例数据,可能会因为Binlog不可用而报错。建议改为读取主实例数据。


总结

通过以上步骤,您可以逐步排查并解决Flink CDC中因Log4j引发的错误。如果问题仍未解决,请提供具体的错误日志以便进一步分析。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

大数据领域前沿技术分享与交流,这里不止有技术干货、学习心得、企业实践、社区活动,还有未来。

还有其他疑问?
咨询AI助理