Flink:注册Table Kafka Source报错处理(flink table)

flink 代码:

注册kafka source 版本:0.10,格式:Json

  

相关依赖,版本为flink1.8.0:

这里要注意flink-json,如果没有此依赖,以上代码块将无法使用Json格式

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-planner_2.11</artifactId>
            <version>${flink.version}</version>
        </dependency>
         <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-api-java-bridge_2.11</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-kafka-0.10_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-json</artifactId>
            <version>${flink.version}</version>
        </dependency>

在本地运行没有出现任何问题,打jar到服务器之运行报:

找不到  org.apache.flink.table.factories.TableSourceFactory

(此处不贴报错截图,有可能报错提示信息会有些出处,但万卷不离其宗,还有的可能是  org.apache.flink.table.factories.TableSinkFactory )

原因:

进入org.apache.flink.table.factories.TableFactoryService源码中你可以找到这个类似匹配器的代码块,异常由这里发出:

查看TableFactoryService的实现,是有KafkaTable的:

而查看此目录下TableFactory配置文件中并没有Kafka Source及Sink相关Factory:

 

解决方法一: 

找到源码目录 flink-table\flink-table-planner\src\main\resources\META-INF\services\org.apache.flink.table.factories.TableFactory进行更改,添加以下内容并重新编译:

org.apache.flink.streaming.connectors.kafka.Kafka09TableSourceSinkFactory
org.apache.flink.streaming.connectors.kafka.Kafka010TableSourceSinkFactory
org.apache.flink.formats.json.JsonRowFormatFactory

开始并没有添加 JsonRowFormatFactory,也报出了找不到的异常信息,所以这里直接加上

解决方法二(推荐): 

  copy后添加以上内容

添加后打包到服务器正常运行。

要将FlinkKafkaSource<ObjectNode>转换为DataStream<RowData>,需要进行以下步骤: 1. 创建一个DeserializationSchema,将ObjectNode反序列化为RowData对象。例如,可以使用JsonRowDataDeserializationSchema。 2. 使用KafkaSourceKafka主题中读取ObjectNode对象,并使用上一步中创建的DeserializationSchema将其转换为RowData对象。 3. 在DataStream上应用map操作,将RowData对象转换为所需的格式。 下面是一个示例代码,使用JsonRowDataDeserializationSchema将ObjectNode转换为RowData,然后将其转换为Tuple2<String, String>: ``` import org.apache.flink.api.common.serialization.DeserializationSchema; import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.api.common.typeinfo.TypeInformation; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.api.java.typeutils.RowTypeInfo; import org.apache.flink.formats.json.JsonRowDataDeserializationSchema; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer; import org.apache.flink.table.api.TableSchema; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; import org.apache.flink.table.types.logical.RowType; import org.apache.flink.types.Row; import com.fasterxml.jackson.databind.node.ObjectNode; import java.util.Properties; public class KafkaObjectNodeToRowData { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env); Properties properties = new Properties(); properties.setProperty("bootstrap.servers", "localhost:9092"); properties.setProperty("group.id", "test"); // create a DeserializationSchema to deserialize ObjectNode to RowData RowType rowType = new RowType( new TableSchema.Builder() .field("id", DataTypes.BIGINT()) .field("name", DataTypes.STRING()) .build().toRowDataType().getChildren()); DeserializationSchema<RowData> deserializationSchema = new JsonRowDataDeserializationSchema(rowType); // create a FlinkKafkaConsumer to read ObjectNode from Kafka FlinkKafkaConsumer<ObjectNode> kafkaConsumer = new FlinkKafkaConsumer<>("my-topic", deserializationSchema, properties); // read from Kafka and convert ObjectNode to RowData DataStream<RowData> rowDataStream = env.addSource(kafkaConsumer) .map(objectNode -> { // convert ObjectNode to RowData Row row = new Row(objectNode.size()); for (int i = 0; i < objectNode.size(); i++) { row.setField(i, objectNode.get(i).asText()); } return row; }) .returns(new RowTypeInfo(rowType.getFields().stream().map(RowType.RowField::getType).toArray(TypeInformation[]::new), rowType.getFieldNames().toArray(new String[0]))); // convert RowData to Tuple2<String, String> DataStream<Tuple2<String, String>> tupleStream = rowDataStream .map(rowData -> Tuple2.of(rowData.getField(0).toString(), rowData.getField(1).toString())) .returns(Types.TUPLE(Types.STRING, Types.STRING)); // do something with the tupleStream tupleStream.print(); env.execute("KafkaObjectNodeToRowData"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值