Я использую функцию readCsvFile (path) в Apache-Flink api, чтобы прочитать CSV-файл и сохранить его в переменной списка. Как это работает, используя несколько потоков? Например, он разбивает файл на основе некоторой статистики? если да, то какая статистика? Или он читает файл по строкам, а затем отправляет строки в потоки для их обработки? Вот пример кода:Как API Apache-Flink читает CSV-файл, используя параллелизм под капотом?
//default parallelism is 4
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
csvPath="data/weather.csv";
List<Tuple2<String, Double>> csv= env.readCsvFile(csvPath)
.types(String.class,Double.class)
.collect();
полагая, что у нас есть CSV файл 800MB на локальном диске, как это распределить работу между этими 4 потоками?
Спасибо, Фабиан. Но я хочу знать, как он определяет Splits? По размеру файла? Количество строк или что-то еще? И сначала он читает весь файл, а затем решает, или перед чтением идет разделение? – Ehsan
Для 'CsvInputFormat' файл разделяется по размеру. Чтение файла в одном потоке для его разделения было бы бессмысленным. Поскольку строка может охватывать два разделения, потоки чтения начинаются с первой новой строки, которую он находит, и завершает линию, которая была запущена в ее расщеплении, даже если она пересекает границу разделения. –
Хорошо. Допустим, у нас есть файл 200mb, а параллелизм установлен на 2. Thread1 должен начинаться с самого начала. Thread2 должен начинать чтение примерно с середины файла. Как thread2 узнает это местоположение? Как Thread1 знает, что он достиг конца своей части и должен остановиться? – Ehsan