Каков наилучший способ обработки больших CSV-файлов?

у меня есть сторонняя система, которая генерирует большой объем данных каждый день (это CSV файлы, которые хранятся на FTP). Существует 3 типа файлов, которые генерируются:

  • каждые 15 минут (2 файла). Эти файлы довольно маленькие ( ~ 2 Mb)
  • каждый день в 5 вечера ( ~ 200 - 300 Mb)
  • каждую полночь (это о 1 Gb)

общий размер 4 CSVs - это 1.5 Gb. Но мы должны учитывать, что некоторые файлы генерируются каждые 15 минут. Эти данные также должны быть агрегированы (не так сложный процесс, но это определенно потребует времени). Мне нужны быстрые ответы. Я думаю, как хранить эти данные и в целом на реализацию.

у нас есть java стек. База данных MS SQL Standard. Из моих измерений MS SQL Standard С другими приложениями не справиться с такой нагрузкой. Что приходит мне на ум:

  • это может быть обновление MS SQL Enterprise С отдельным сервером.
  • использование PostgreSQL на отдельном сервере. Прямо сейчас я работаю над PoC для этого подхода.

что бы вы порекомендовали здесь? Вероятно, есть лучшие альтернативы.

правка #1

эти большие файлы являются новыми данными для каждого дня.

4 ответов


вы можете рассмотреть возможность заглянуть в Apache Spark. После проверки и курирования данных можно использовать Престо для выполнения запросов.


можно использовать однозначности-Парсеры для обработки CSV как можно быстрее, так как эта библиотека поставляется с быстрый CSV парсер вокруг. Я автор этой библиотеки, и это с открытым исходным кодом и бесплатно (Лицензия Apache V2)

теперь для загрузки данных в базу данных вы можете попробовать univocity framework (коммерческий). Мы используем его для загрузки больших объемов данных в базы данных, такие как SQL server и PostgreSQL очень быстро - от 25K до 200K строк в секунду, в зависимости от базы данных и ее конфигурации.

вот простой пример того, как код для миграции из CSV будет выглядеть:

public static void main(String ... args){
    //Configure CSV input directory
    CsvDataStoreConfiguration csv = new CsvDataStoreConfiguration("csv");
    csv.addEntitiesFromDirectory(new File("/path/to/csv/dir/"), "ISO-8859-1");

    //should grab column names from CSV files
    csv.getDefaultEntityConfiguration().setHeaderExtractionEnabled(true);

    javax.sql.DataSource dataSource = connectToDatabaseAndGetDataSource(); //specific to your environment

    //Configures the target database
    JdbcDataStoreConfiguration database = new JdbcDataStoreConfiguration("database", dataSource);

    //Use only for postgres - their JDBC driver requires us to convert the input Strings from the CSV to the correct column types.
    database.getDefaultEntityConfiguration().setParameterConversionEnabled(true);

    DataIntegrationEngine engine = Univocity.getEngine(new EngineConfiguration(csv, database));

    //Creates a mapping between data stores "csv" and "database"
    DataStoreMapping mapping = engine.map(csv, database);

    // if names of CSV files and their columns match database tables an their columns
    // we can detect the mappings from one to the other automatically
    mapping.autodetectMappings();

    //loads the database.
    engine.executeCycle();

}

для повышения производительности платформа позволяет управлять схемой базы данных и выполнять такие операции, как ограничения и индексы перетаскивания, загружать данные и воссоздавать их. Преобразования данных и схем также очень хорошо поддерживаются, если вам нужно.

надеюсь, что это помогает.


ОК. Потратив некоторое время на эту проблему (она включает в себя чтение, консультирование, эксперименты, выполнение нескольких PoC). Я пришел к следующему решению.

Tl; dr

база данных: PostgreSQL Как это хорошо для CSV, бесплатно и с открытым исходным кодом.

инструмент: Apache Spark хорошо подходит для такого типа задач. Хорошая производительность.

DB

Что касается базы данных, это важно надо решить. Что выбрать и как это будет работать в будущем с таким объемом данных. Это определенно должен быть отдельный экземпляр сервера, чтобы не генерировать дополнительную нагрузку на основной экземпляр базы данных и не блокировать другие приложения.

NoSQL

Я думал об использовании Cassandra здесь, но это решение было бы слишком сложным прямо сейчас. Cassandra не имеет специальных запросов. Cassandra уровень хранения данных-это в основном система хранения ключевых значений. Это означает, что вы должны "моделировать" свои данные вокруг запросов, которые вам нужны, а не вокруг структуры самих данных.

СУБД

Я не хочу overengineer здесь. И я остановил выбор здесь.

MS SQL Server

это способ пойти, но большой недостаток здесь-цены. Довольно дорогой. Enterprise edition стоит больших денег с учетом нашего оборудования. Что касается ценообразования, вы можете прочитать это политика документ.

еще одним недостатком здесь была поддержка CSV-файлов. Это будет основным источником данных для нас здесь. MS SQL Server не может ни импортировать, ни экспортировать CSV.

  • MS SQL Server молчаливое усечение текстового поля.

  • MS SQL Serverобработка кодировки текста происходит неправильно.

MS SQL Server выдает сообщение об ошибке, потому что он не понимает цитирование или экранирование. Подробнее об этом сравнении может быть найти в статье PostgreSQL против MS SQL Server.

PostgreSQL

эта база данных является зрелым продуктом и хорошо проверена в бою тоже. Я слышал много положительных отзывов об этом от других (конечно, есть и некоторые компромиссы). Он имеет более классический синтаксис SQL, хорошую поддержку CSV, кроме того, он с открытым исходным кодом.

стоит отметить, что SSMS лучше, чем pgAdmin попробуйте. SSMS есть функция автозаполнения, несколько результатов (когда вы запускаете несколько запросов и получаете несколько результатов в одном, но в pgAdmin попробуйте вы получаете только последний).

в любом случае, прямо сейчас я использую DataGrip от JetBrains.

Инструмент Обработки

Я просмотрел Весенний Замес и Apache Spark. Весенний Замес немного слишком низкоуровневая вещь для использования для этой задачи, а также Apache Spark обеспечивает возможность масштабирования легче, если это будет необходимо в будущем. Во всяком случае,Весенний Замес также может сделать эту работу.

о Apache Spark пример, код можно найти в обучение-Искра. Мой выбор Apache Spark сейчас.


интеграция данных Pentaho (или аналогичный инструмент ETL) может обрабатывать импорт данных в базу данных SQL и может выполнять агрегацию на лету. PDI имеет версию сообщества и может запускаться автономно или через API Java.