Flink开发遇到的问题汇总-

1,提交的离线任务完成之后,在一段时间后web端没有显示或者说自动消失:

原因分析:

https://blog.csdn.net/u013076044/article/details/104740792

是需要开启historyserver

 

2,Flink读取hdfs的(hive分区)文件,目前已知有三种方式:

      

  1. 通过循环union方式,本地可以执行,集群提交报错

  

  1. 通过官方API,可是只支持csv文件格式,可以读取hdfs上的文件:

             

 

 

  1. 不在官方API的方式,正在测试….

  

参考:

背景:使用flink批作业 读取存在hdfs上的日志 需要迭代读取目录下所有文件的内容

使用的方法:

 

        Configuration conf = new Configuration();

        conf.setBoolean("recursive.file.enumeration", true);

        DataSet<String> in = env.readTextFile(urlWithDate).withParameters(conf);

 

但是由于日志数量比较大 出现akka链接超时问题

无法正常提交job

相关社区issue:

https://issues.apache.org/jira/browse/FLINK-3964

后来改用如下方法读取日志,成功解决:

 

        FileInputFormat fileInputFormat = new TextInputFormat(new Path(urlWithDate));

        fileInputFormat.setNestedFileEnumeration(true);

        DataSet<String> dataSet = env.readFile(fileInputFormat, urlWithDate);

1

2

3

相关mail-list参考:

http://mail-archives.apache.org/mod_mbox/flink-user/201701.mbox/<[email protected]>

 

 

参考代码:

package com.zhisheng.sql.blink.stream.example;

import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.java.StreamTableEnvironment;
import org.apache.flink.table.descriptors.FileSystem;
import org.apache.flink.table.descriptors.OldCsv;
import org.apache.flink.table.descriptors.Schema;
import org.apache.flink.types.Row;


/**
 * Desc: Blink Stream Table Job
 * Created by zhisheng on 2019/11/3
下午1:14
 * blog:http://www.54tianzhisheng.cn/
 * 微信公众号:zhisheng
 */

public class TableExampleWordCount {
   
public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment blinkStreamEnv = StreamExecutionEnvironment.getExecutionEnvironment();
        blinkStreamEnv.setParallelism(
1);
        EnvironmentSettings blinkStreamSettings = EnvironmentSettings.newInstance()
                .useBlinkPlanner()
                .inStreamingMode()
                .build();
        StreamTableEnvironment blinkStreamTableEnv = StreamTableEnvironment.create(blinkStreamEnv, blinkStreamSettings);

        String path = TableExampleWordCount.
class.getClassLoader().getResource("words.txt").getPath();
        blinkStreamTableEnv
                .connect(
new FileSystem().path(path))
                .withFormat(
new OldCsv().field("word", Types.STRING).lineDelimiter("\n"))
                .withSchema(
new Schema().field("word", Types.STRING))
                .inAppendMode()
                .registerTableSource(
"FlieSourceTable");

        Table wordWithCount = blinkStreamTableEnv.scan(
"FlieSourceTable")
                .groupBy(
"word")
                .select(
"word,count(word) as _count");
        blinkStreamTableEnv.toRetractStream(wordWithCount, Row.
class).print();

       
//打印结果中的 true 和 false,可能会有点疑问,为啥会多出一个字段。
        //Sink 做的事情是先删除再插入,false 表示删除上一条数据,true 表示插入该条数据

       
blinkStreamTableEnv.execute("Blink Stream SQL Job");
    }
}

 

任务提交到yarn集群无法运行

出现错误:

具体描述就是提交到任务到yarn之后,yarn一直处于等待状态,(jobManager)打印一堆日志之后然后出现上述报错

 

解决方案:

由于之前是部署的standalone高可用,导致可能是端口冲突,重置配置文件,去除无用的配置,就可以了 在yarn提交任务的时候 flink集群不用启动

 

 

本地代码提交的时候遇到问题:

Cannot support file system for 'hdfs' via Hadoop, because Hadoop is not in the classpath, or some classes are missing from the classpath.

解决方案:代码导入 flink-shaded-hadoop-2-uber-2.6.5-10.0.jar

正常集群lib目录下会有这个jar包的。

 

 集群不能执行SQL任务

代码pom文件加入配置:

 

  1. 运行代码遇到

 

org.codehaus.jackson.map.ObjectMapper.writerWithDefaultPrettyPrinter()Lorg/codehaus/jackson/map/ObjectWriter;      

后来发现是依赖冲突,具体解决方案:

 

如果有红色就是冲突了,点击进去

复制:

 

去对应的包解决掉 排除:

 

 

不支持将group by写入kafka

莫名其妙的本地找不到class,pom依赖被provide了。

 

 

解决方案:

 

 

 

 

消费kafka发现数据消费的不对,因为消费kafka是指定的时间戳消费,必须要精确到毫秒,当时写入的是秒,所以还以为是代码业务问题。

Caused by: java.lang.OutOfMemoryError: Metaspace

后查证是  jvm Metaspace 大小受限制,默认是96M,设置为512M,在配置文件中设置 taskmanager.memory.jvm-metaspace.size: 512mb

尽量提交到集群的包小一点。

 

 

 

 

TTL状态过期:

        @Override

            public void open(Configuration parameters) throws Exception {

                super.open(parameters);

                ValueStateDescriptor<OrderStatistics> valueStateDescriptor =

                        new ValueStateDescriptor<>("lastUserLogin", TypeInformation.of(new TypeHint<OrderStatistics>() {

                        }));



                //设置ttl 设置7天状态自动过期

//                       StateTtlConfig ttlConfig = StateTtlConfig

////                                .newBuilder(Time.days(7))

//                                .newBuilder(Time.seconds(60))

//                                .cleanupIncrementally(10, false)

//                                .build();

//

//                        valueStateDescriptor.enableTimeToLive(ttlConfig);

                valueState = getRuntimeContext().getState(valueStateDescriptor);



            }

 

猜你喜欢

转载自blog.csdn.net/qq_31866793/article/details/107087777