Я подготовил производителя кафки, который помещает Список в тему кафки.Отлично работает на 1 миллион строк / записей.Производственный файл, который я получил, состоит из 110 миллионов записей. Как лучше всего справляться с такими огромными данными на моем KafkaProducer?
Ниже приведен код, который я использовал для обработки 1 миллиона записей, и для его установки требуется около 4 минут.в тему кафки.
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.kafka.connect.data.Schema;
import org.apache.kafka.connect.data.SchemaBuilder;
import org.apache.kafka.connect.data.Struct;
import org.apache.kafka.connect.source.SourceRecord;
import org.apache.kafka.connect.source.SourceTask;
public class KafkaSourceTask extends SourceTask {
private String filename;
private String topic;
private RandomAccessFile raf;
private long lastRecordedOffset = 0L;
private BufferedReader bufferedReader = null;
Schema schema = SchemaBuilder.struct().field("emp_id",
Schema.STRING_SCHEMA).field("name", Schema.STRING_SCHEMA)
.field("last_name", Schema.STRING_SCHEMA).field("department",
Schema.STRING_SCHEMA).build();
public void start(Map<String, String> props) {
filename = props.get("file");
topic = props.get("topic");
}
@Override
public List<SourceRecord> poll() throws InterruptedException {
double startTime = System.nanoTime();
try {
bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(filename)),
StandardCharsets.UTF_8));
raf = new RandomAccessFile(filename, "r");
long filePointer = raf.getFilePointer();
System.out.println(filePointer + " - " + lastRecordedOffset);
if (bufferedReader.ready() && (filePointer > lastRecordedOffset || filePointer == 0)) {
raf.seek(lastRecordedOffset);
ArrayList<SourceRecord> records = new ArrayList<>();
String line;
while ((line = raf.readLine()) != null) {
records.add(new SourceRecord(null, null, topic, schema, buildRecordValue(line)));
}
lastRecordedOffset = raf.getFilePointer();
raf.close();
bufferedReader.close();
double endTime = System.nanoTime();
return records;
}
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public synchronized void stop() {
try {
raf.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
private Struct buildRecordValue(String line) {
String[] values = line.split(",");
Struct value = new Struct(schema).put("emp_id", values[0]).put("name", values[1]).put("last_name", values[2])
.put("department", values[3]);
return value;
}
@Override
public String version() {
// TODO Auto-generated method stub
return null;
}
}
Буду признателен за любую помощь или предложение по этому вопросу. Заранее спасибо.