Java 使用kafka实现oracle到mongodb的数据迁移

Java 使用kafka实现oracle到mongodb的数据迁移,java,mongodb,apache-kafka,Java,Mongodb,Apache Kafka,我正在尝试使用kafka将数据从oracle迁移到mongodb。我取了一个1000万的样本记录集,列长为90,每行5 KB 我将数据分成10个线程,但其中一个线程不是每次都在运行。。。。当我检查数据时,我看到mongodb中有100万条记录丢失 主要类别: int totalRec = countNoOfRecordsToBeProcessed; int minRownum =0; int maxRownum =0; int recInThread=totalR

我正在尝试使用kafka将数据从oracle迁移到mongodb。我取了一个1000万的样本记录集,列长为90,每行5 KB

我将数据分成10个线程,但其中一个线程不是每次都在运行。。。。当我检查数据时,我看到mongodb中有100万条记录丢失

主要类别:

    int totalRec = countNoOfRecordsToBeProcessed;
    int minRownum =0;
    int maxRownum =0;
    int recInThread=totalRec/10;
    System.out.println("oracle  "+new Date());
    for(int i=minRownum;i<=totalRec;i=i+recInThread+1){ 
          KafkaThread kth = new KafkaThread(i, i+recInThread, conn);
        Thread th = new Thread(kth);
        th.start();
    }
    System.out.println("oracle done+  "+new Date());    
int totalRec=countNoOfRecordsToBeProcessed;
int minRownum=0;
int maxRownum=0;
int recInThread=总记录/10;
System.out.println(“oracle”+新日期());
for(int i=minRownum;i{
//System.out.printf(“消费者记录:(%d,%s,%d,%d)\n”,
//record.key(),record.value(),
//record.partition(),record.offset());'
字符串行=null;
行=记录。值();
Document doc=Document.parse(行);
InsertOneModel t=新的InsertOneModel(doc);
清单1.添加(t);
});
collection.bulkWrite((列表我的建议:使用将数据拉入,使用a将数据推出。否则,您只是在重新发明轮子。Kafka Connect是Apache Kafka的一部分

卡夫卡连接入门:

我的建议是:使用将数据拉入,使用a将数据推出。否则,您只是在重新发明轮子。Kafka Connect是Apache Kafka的一部分

卡夫卡连接入门:



为什么要编写代码来实现这一点,而不是使用Kafka Connect?我被要求编写一段代码,以尽可能快地接收数据……我尝试了java多线程、plsql等多种方法,但我发现这是性能最好的方法。我的建议是:使用Kafka Connect JDBC连接器将数据拉入,使用Kafka Connect MongoDB接收器将数据推出。否则,您只是在重新设计轮子。好的,谢谢您将试用…非常感谢提供更多信息的任何链接!!!顺便说一句,想知道为什么错过了一个线程被消费??为什么您要编写代码来这样做,而不是使用Kafka Connect?我被要求编写一段代码,以尽可能快的速度接收数据可能…我尝试了java多线程、plsql等多种方法,但我发现这是性能最好的建议:使用Kafka Connect JDBC connector将数据拉入,使用Kafka Connect MongoDB sink将数据推出。否则,您只是在重新发明轮子。好的,谢谢您将试用…任何有关更多信息的链接都非常感谢!!!顺便说一句,我想知道为什么其中一个线程没有被使用??谢谢@robin:)一定会尝试…顺便问一下,这方面有没有性能基准?我的意思是我需要从表中的一个表中转移1.3亿条记录。是否值得继续这种方法?加载这些1.3亿条记录的时间窗口是什么?1秒?1周?这是办公室的POC任务。所以要求数据应该被传输尽可能快地提交,这是一个批处理作业…不是实时的streaming@user1708054你能分享你在这方面的进一步经验吗?知道这一点真的很有趣。进一步补充,虽然我在卡夫卡上工作过,但从未尝试过你提到的用例,而且我不能评论基准测试,但转移了1.3亿唱片,卡夫卡应该没问题。@Suhaschikkana…如果我在这方面有任何探索,我会在这里分享。。谢谢:)谢谢@robin:)我一定会尝试的。。。顺便问一下,在这方面有什么绩效基准吗???我的意思是我需要从一张表中转移1.3亿条记录。。是否值得继续使用这种方法?加载这些130M记录的时间窗口是什么?1秒?1周?这是办公室的POC任务。。因此,要求数据应尽快传输,这是一个批处理作业。。。不是实时的streaming@user1708054你能分享你在这方面的进一步经验吗。知道这件事真的很有趣。此外,虽然我曾研究过卡夫卡,但从未尝试过您提到的用例,而且我也不能评论基准测试,但传输了1.3亿条记录,卡夫卡应该没问题。@Suhaschikkana。。。如果我在这方面有所探索,我将在这里分享。。谢谢:)
        int total_rows = rs.getMetaData().getColumnCount();
        for (int i = 0; i < total_rows; i++) {
            obj.put(rs.getMetaData().getColumnLabel(i + 1)
                    .toLowerCase(), rs.getObject(i + 1));
     }
            //System.out.println("object->"+serializedObject);
            producer.send(new ProducerRecord<String, String>("oracle_1",obj.toString()));
            obj= new JSONObject();
        //System.out.println(counter++);
}
        KafkaConsumer consumer = new KafkaConsumer<>(props);
        //subscribe to topic
        consumer.subscribe(Arrays.asList(topicName));

        MongoClientURI clientURI = new MongoClientURI(mongoURI);
        MongoClient mongoClient = new MongoClient(clientURI);
        MongoDatabase database = mongoClient.getDatabase(clientURI.getDatabase());
        final MongoCollection<Document> collection = database.getCollection(clientURI.getCollection());
        while (true) {
            final ConsumerRecords<Long, String> consumerRecords =
                    consumer.poll(10000);

            if (consumerRecords.count()!=0) {
                List<InsertOneModel> list1 = new ArrayList<>();
                consumerRecords.forEach(record -> {
//                    System.out.printf("Consumer Record:(%d, %s, %d, %d)\n",
//                            record.key(), record.value(),
//                            record.partition(), record.offset());'

                    String row =null;
                     row = record.value();
                     Document doc=Document.parse(row);
                     InsertOneModel t = new InsertOneModel<>(doc);
                     list1.add(t);
                });
                collection.bulkWrite((List<? extends WriteModel<? extends Document>>) (list1), new BulkWriteOptions().ordered(false));
                consumer.commitAsync();
                list1.clear();
            }
            }
    }