Flink接收Kafka和JSON反序列化

Flink接收Kafka和JSON反序列化

使用ObjectMapper反序列化

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
...
        ObjectMapper om = new ObjectMapper();
        SecEvent event = new SecEvent("eventype1","myname",1233424234,"0001");
        String json = om.writeValueAsString(event);
        System.out.println(json);
        //(String eventType, String imageName, long timestamp, String instanceId)
        SecEvent event_out = om.readValue(json, SecEvent.class);
        System.out.println(event.toString());
        System.out.println(event_out.toString());

接收Kafka事件消息

package com.practice.kafka;
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.streaming.connectors.kafka.FlinkKafkaConsumer010;

import org.apache.flink.util.Collector;
import org.apache.flink.streaming.api.functions.ProcessFunction;
import java.util.Properties;
import java.text.SimpleDateFormat;
import java.io.IOException;

import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.java.typeutils.TypeExtractor;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import org.apache.flink.api.common.serialization.SerializationSchema;
import org.apache.flink.api.common.serialization.DeserializationSchema;

public class KafkaSecEvent {
    //事件对象
    public static class SecEvent {

        public String eventType;
        public String imageName;
        public long timestamp;
        public String instanceId;

        public SecEvent() {
        }

        public SecEvent(String eventType, String imageName, long timestamp, String instanceId) {
            this.eventType = eventType;
            this.imageName = imageName;
            this.timestamp = timestamp;
            this.instanceId = instanceId;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            } else if (o != null && getClass() == o.getClass()) {
                SecEvent that = (SecEvent) o;

                return timestamp == that.timestamp &&
                        eventType.equals(that.eventType) &&
                        imageName.equals(that.imageName) &&
                        instanceId.equals(that.instanceId);
            } else {
                return false;
            }
        }

        @Override
        public int hashCode() {
            int result = eventType != null ? eventType.hashCode() : 0;
            result = 31 * result + (imageName != null ? imageName.hashCode() : 0);
            result = 31 * result + (int) (timestamp ^ (timestamp >>> 32));
            result = 31 * result + (instanceId != null ? instanceId.hashCode() : 0);
            return result;
        }

        @Override
        public String toString() {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
            String formattedTimestamp = format.format(timestamp);

            return "{\n" +
                    "  \"eventType\": \"" + eventType + "\"\n," +
                    "  \"imageName\": \"" + imageName + "\"\n," +
                    "  \"timestamp\": \"" + formattedTimestamp + "\"\n," +
                    "  \"instanceId\": \"" + instanceId + "\"\n" +
                    "}";
        }
    }   

    //序列化
    public static class SecEventJSONSerializer 
            implements SerializationSchema<KafkaSecEvent.SecEvent>, DeserializationSchema<KafkaSecEvent.SecEvent> {
        
        private final ObjectMapper mapper = new ObjectMapper();
        
        @Override
        public byte[] serialize(KafkaSecEvent.SecEvent secEvent) {
            try {
                return mapper.writeValueAsBytes(secEvent);
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }
        }
        
        @Override
        public SecEvent deserialize(byte[] bytes) throws IOException {
            System.out.println("hello");
            return mapper.readValue(bytes, SecEvent.class);
        }

        @Override
        public boolean isEndOfStream(SecEvent secEvent) {
            return false;
        }

        @Override
        public TypeInformation<SecEvent> getProducedType() {
            return TypeExtractor.getForClass(SecEvent.class);
        }
    }

    public static void main(String[] args) throws Exception{

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 连接kafka数据流
        Properties properties = new Properties();
        properties.setProperty("bootstrap.servers", "192.168.11.45:6669"); 
        FlinkKafkaConsumer010<SecEvent> consumer = new FlinkKafkaConsumer010<>("event", new SecEventJSONSerializer(), properties);
        //从最早开始消费
        //consumer.setStartFromEarliest();
        DataStream<SecEvent> stream = env.addSource(consumer);
        stream.process(new ProcessFunction<SecEvent, String>() {
                    @Override
                    public void processElement(SecEvent event, Context ctx, Collector<String> out) throws Exception {
                        out.collect(event.toString());
                        System.out.println(event.toString());
                    }
                }).print();

        env.execute();

    }

}

Python发送Kfaka消息事件

from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers=['192.168.11.45:6669'])
future = producer.send('event' , key= b'my_key', value= b'{"eventType":"eventype1","imageName":"myname", \
             "timestamp":1233424234,"instanceId":"0001"}', partition= 0)

测试结果

hello
{
  "event_type": "eventype1"
,  "image_name": "zuozuofdafas"
,  "timestamp": "1970-01-15 06:37:04.234"
,  "instance_id": "0001"
}
{
  "event_type": "eventype1"
,  "image_name": "zuozuofdafas"
,  "timestamp": "1970-01-15 06:37:04.234"
,  "instance_id": "0001"
}

pom.xml配置

由于使用的kafka版本是0.10,因此使用的库也需要时0.10版本对应的。

		<dependency>
			<groupId>org.apache.flink</groupId>
			<artifactId>flink-java</artifactId>
			<version>${flink.version}</version>
			<scope>provided</scope>
		</dependency>
		<depe
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将FlinkKafka消费的数据序列并存入Hive,可以按照以下步骤进行操作: 1. 配置Kafka消费者和Hive连接 首先需要配置FlinkKafka消费者和Hive连接,可以使用Flink提供的Kafka连接器和Hive连接器来实现。具体的配置可以参考Flink官方文档进行设置。 2. 设计序列类 根据你从Kafka消费的数据格式,需要设计一个序列类来将数据转换为Flink中的对象。例如,如果你从Kafka消费的是JSON格式的数据,可以使用Flink提供的JSON序列类进行转换。 3. 定义Hive表结构 在Hive中创建一个表来存储序列后的数据。你需要定义表的结构,包括列名、列类型和分区等信息。 4. 编写Flink程序 编写一个Flink程序来消费Kafka中的数据,并将数据序列后存入Hive表中。具体的实现可以参考以下代码示例: ```java DataStream<String> dataStream = env.addSource(new FlinkKafkaConsumer<String>( "topic", new SimpleStringSchema(), properties)); DataStream<MyObject> myObjects = dataStream.map(new MapFunction<String, MyObject>() { @Override public MyObject map(String value) throws Exception { ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(value, MyObject.class); } }); HiveCatalog hiveCatalog = new HiveCatalog("myHiveCatalog", "default", "/path/to/hive/conf"); TableSchema schema = new TableSchema( new String[] {"id", "name", "age"}, new TypeInformation<?>[] {Types.STRING, Types.STRING, Types.INT}); HiveTableSink hiveTableSink = new HiveTableSink( "myDatabase.myTable", schema, hiveCatalog, new Configuration(), "myPartition"); myObjects.addSink(hiveTableSink); ``` 其中,`MyObject`是你从Kafka消费的数据序列后的对象,`hiveCatalog`是Hive连接器的配置信息,`schema`是Hive表的列信息,`hiveTableSink`是Hive表的输出目的地。 5. 运行Flink程序 配置好Flink程序后,就可以运行程序了。程序会从Kafka消费数据,将数据序列后存入Hive表中。 以上就是将FlinkKafka消费数据序列存入Hive的步骤和示例代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值