前一段接触了一个项目,需求是mongo中的增量数据作为kafka的生产者,用sparkStreaming作为消费者,最终经过处理后写入到mysql中。之前对kafka和sparkStreaming仅仅是了解,所以用了我最熟悉的java来完成项目。
部分代码如下:
public class JsonStream {
public static void main(String[] args) throws Exception {
// 连接kafka的配置信息
String brokers = "localhost:9092";
String groupId = "1";
String topics = "test";
// Create context with a 30 seconds batch interval
SparkConf sparkConf = new SparkConf().setMaster("local[*]").setAppName(
"GetDataStream");
JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, Durations.seconds(30));
Set<String> topicsSet = new HashSet<>(Arrays.asList(topics.split(",")));
Map<String, Object> kafkaParams = new HashMap<>();
//brokers
kafkaParams.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, brokers);
//groupId
kafkaParams.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
//消费者配置 反序列化
kafkaParams.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
kafkaParams.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
//latest, earliest, none 消费偏移量设置
kafkaParams.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
// Create direct kafka stream with brokers and topics
JavaInputDStream<ConsumerRecord<String, String>> datas = KafkaUtils.createDirectStream(
jssc,
LocationStrategies.PreferConsistent(),
ConsumerStrategies.Subscribe(topicsSet, kafkaParams));
// 检查点设置 从上一次消费过的位置开始处理数据
jssc.checkpoint("/Users/lihongji/Desktop/check");
JavaDStream<String> lines = datas.map(ConsumerRecord::value);
lines.map(m -> {
String jsonstr = m;
JSONObject jsonObject = JSON.parseObject(m);
//逻辑处理部分查询的数据库内容
List<Map<String, Object>> dataset;
List<String> warnList = new ArrayList<>();
dataset = DBUtil.query("select DISTINCT keywords FROM alertset");
//逻辑处理部分,需要保密,如果有需要的,可以私聊我,我会将主要流程告诉你。
getInfo(jsonObject);
return m;
}).print();
jssc.start();
jssc.awaitTermination();
}
项目中遇到的主要问题就是对kafka发送的json数据进行解析处理,经过不断匹配后插入到mysql中,为了提高效率,插入时选择了jdbc batch来提高效率。