Перенос данных из postgresql в hdfs с использованием кода Java - PullRequest
0 голосов
/ 01 июня 2018

Я новичок в Hadoop, и мне было поручено перенести структурированные данные в HDFS с использованием кода Java.Я знаю, что Sqoop может сделать то же самое, но это не моя задача.

Может кто-нибудь объяснить, пожалуйста, как это сделать.

Я пытался это сделать.Я скопировал данные с psql-сервера с помощью драйвера jdbc и затем сохранил их в формате csv в HDFS.Правильный ли это способ?

Я читал, что Hadoop имеет свои собственные типы данных для хранения структурированных данных.Можете ли вы объяснить, как это происходит?

Спасибо.

Ответы [ 4 ]

0 голосов
/ 16 июня 2018

Уровень техники использует ( pull ETL ) sqoop в качестве регулярных пакетных процессов для извлечения данных из RDBM.Тем не менее, этот способ требует ресурсов , потребляющих для СУБД (часто sqoop запускает несколько потоков с несколькими соединениями jdbc), а занимает много времени (часто вы запускаете последовательную выборку в СУБД) и приведет к повреждениям данных (живая СУБД обновляется, пока этот длинный процесс sqoop «всегда опаздывает»).

Тогда существует некоторая альтернативная парадигма ( push ETL ) и взрослеют.Идея состоит в том, чтобы создать потоки сбора данных изменений, которые слушают RDBMS. Примером проекта является дебезиум .Затем вы можете создать ETL в реальном времени, который синхронизирует RDBMS и хранилище данных в hadoop или в другом месте.

0 голосов
/ 02 июня 2018

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

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

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

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

Hadoop имеет структурированные форматы файлов, такие как AVRO, ORC и Parquet.

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

0 голосов
/ 08 июня 2018

То, что вы пытаетесь сделать, не очень удачное, потому что вы будете тратить так много времени на разработку кода, тестирование и т. Д. Вместо этого используйте sqoop для импорта данных из любой СУБД в куст.Первым инструментом, который должен прийти нам на ум, является Sqoop (SQL для Hadoop).

0 голосов
/ 01 июня 2018

Sqoop - это простой инструмент, который выполняет следующие действия.

1) Подключитесь к СУБД (postgresql) и получите метаданные таблицы и создайте pojo (класс Java) таблицы.2) Используйте класс java для импорта и экспорта через программу mapreduce.

Если вам нужно написать простой код Java (где параллелизм необходимо контролировать для производительности)

Выполните следующие действия:

1) Создайте класс Java, который подключается к СУБД с помощью Java JDBC. 2) Создайте класс Java, который принимает входную строку (Get from resultset) и записывает в службу HDFS в файл.

В противном случае это делается.

Создайте MapReduce, используя DBInputFormat, передайте число входных разбиений с TextOutputFormat в качестве выходного каталога в HDFS.

Пожалуйста, посетите https://bigdatatamer.blogspot.com/ для любого вопроса, связанного с hadoop и spark.

Спасибо, Сайнагараджу, Вадука

...