Java ETL процесс - PullRequest
       10

Java ETL процесс

0 голосов
/ 29 октября 2011

У меня есть новая задача загрузить ~ 100M строк из базы данных Oracle и вставить их на удаленный сервер баз данных MySQL.

Я разделил проблему на две части:

  1. сервер REST на стороне сервера, отвечающий за загрузку данных на сервер MySQL;
  2. приложение Java на стороне клиента, которое отвечает за загрузку источника данных Oracle.

На стороне Java IИспользовал простой JDBC для загрузки разбитого на страницы контента и передачи его по сети на сервер.Этот подход работает хорошо, но он делает код громоздким и не очень масштабируемым, поскольку я делаю нумерацию страниц самостоятельно, используя Oracle ROWNUM ..... WHERE ROWNUM> x и ROWNUM

Я сейчас попробовал Hibernate'sStatelessSession с моими сущностями, отображенными через аннотации.Код гораздо более читабелен и чист, но производительность хуже.

Я слышал об инструментах ETL и SpringBatch, но не очень хорошо их знаю.Есть ли другие подходы к этой проблеме?

Заранее спасибо.

ОБНОВЛЕНИЕ

Спасибо за бесценные предложения.Я решил использовать SpringBatch для загрузки данных из базы данных Oracle, потому что среда довольно плотная и у меня нет доступа к набору инструментов Oracle.SpringBatch - это правда и правда.Для шага записи данных я выбрал запись фрагментов записей с использованием MySQL LOAD DATA INFILE, как вы все заявили.Службы REST находятся посередине, так как они скрыты друг от друга по соображениям безопасности.

Ответы [ 2 ]

5 голосов
/ 30 октября 2011

100M строк - это довольно много. Вы можете создать его множеством способов: серверы REST, чтение JDBC, Spring Batch , Spring интеграция , Hibernate, ETL. Но суть: время .

Независимо от того, какую архитектуру вы выберете, вам в конечном итоге придется выполнить эти INSERT в MySQL. Ваш пробег может варьироваться, но только для того, чтобы дать вам порядок величин: при 2K вставок в секунду для заполнения MySQL 100-миллионными строками потребуется полдня ( source ).

Согласно тому же источнику LOAD DATA INFILE может обрабатывать около 25 тыс. Вставок в секунду (примерно в 10 раз больше и около часа работы).

Учитывая сказанное с таким количеством данных, я бы предложил:

  • выгрузка таблицы Oracle с использованием собственных инструментов базы данных Oracle, которые создают удобочитаемый контент (или читаемый компьютером, но вы должны иметь возможность его анализировать)

  • анализировать файл дампа, используя как можно более быстрые инструменты. Может быть, grep / sed / gawk / cut будет достаточно?

  • генерировать целевой файл, совместимый с MySQL LOAD DATA INFILE (это очень настраиваемый)

  • Импорт файла в MySQL с помощью вышеупомянутой команды

Конечно, вы можете сделать это на Java с красивым и читаемым кодом, проверенным модулем и версионным. Но с таким количеством данных вы должны быть прагматичными.

Это для начальной загрузки. После этого, вероятно, Spring Batch станет хорошим выбором. Если вы можете, попробуйте подключить ваше приложение напрямую к обеим базам данных - опять же, это будет быстрее. С другой стороны, это может быть невозможно по соображениям безопасности.

Если вы хотите быть очень гибким и не привязывать себя непосредственно к базам данных, предоставьте как вход (Oracle), так и вывод (MySQL) за веб-сервисами (REST также подходит) Весенняя интеграция вам очень поможет.

2 голосов
/ 04 января 2012

Вы можете использовать Scriptella для передачи данных между базами данных.Вот пример файла преобразования XML:

<!DOCTYPE etl SYSTEM "http://scriptella.javaforge.com/dtd/etl.dtd">
<etl>
    <connection id="in" url="jdbc:oracle:thin:@localhost:1521:ORCL" 
              classpath="ojdbc14.jar" user="scott" password="tiger"/>

    <connection id="out" url="jdbc:mysql://localhost:3306/fromdb" 
              classpath="mysql-connector.jar" user="user" password="password"/>
    <!-- Copy all table rows from one to another database -->
    <query connection-id="in">
        SELECT * FROM Src_Table
        <!-- For each row executes insert -->  
        <script connection-id="out"> 
            INSERT INTO Dest_Table(ID, Name) VALUES (?id,?name)
        </script>
    </query>
  </etl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...