Pages

Friday, July 8, 2011

Простий ETL tool

Інколи виникає потреба взяти якісь дані з однієї бази даних і перенести їх в іншу. Поки така потреба виникає лише інколи, можна цілком обходитися консольним клієнтом самої СУБД.

Проблема виникає, якщо дані потрібно переносити:

  • регулярно
  • в СУБД іншого типу (mysql -> postgresql) 
  • з не СУБД в СУБД (csv -> sql)
  • якось модифікувати дані при переносі 



Для вирішення цих задач людство придумало ETL процес. ETL tools наразі існує багато. В тому числі відкриті безкоштовні рішення, такі як http://kettle.pentaho.com/, але усі вони надзвичайно складні :-)

Простеньке ж (але дієве) рішення - http://scriptella.javaforge.com

Спробую описати вирішення простенької задачі засобами scriptella.

Я здійснюю моніторинг роботи певних підсистем  php додатків. В цьому мені допомагає чудовий софт - http://pinba.org. Він надає можливість переглядати стан певних визначених мною лічильників, які показують, що відбувається з тією чи іншою підсистемою додатка. 

Що саме я моніторю? Час конекту до sql сервера (їх більше одного),  кількість/середній час різноманітних sql операцій (select/insert/update), час що витрачається на роботу з сервером memcache, curl звернення до зовнішніх ресурсів по REST протоколу тощо.

Але pinba показує статистику за певний (не великий) час. Мені б хотілося бачити як ці показники міняються за довші періоди часу. Наприклад:

  • З часом якийсь sql сервер став повільнішим. Чому?
  • Після певного релізу різко зросла кількість запитів до бази даних. Чому?
  • Селекти почали виконуватися повільніше. 
 Для цього кожні 5 хвилин я хочу переганяти дані з певних табличок mysql (pinba зроблена, як сторедж енджайн mysql) в таблички в postgresql (такий в мене пунктик - використовувати постгре)

Для початку скачаємо і розпакуємо файли з http://scriptella.javaforge.com. Далі нам потрібно скачати JDBC драйвери для обох баз даних і покласти в папку lib розпакованого дистрибутива скріптелли. Пишимо ETL скріпт - правила переносу даних.

<!DOCTYPE etl SYSTEM "http://scriptella.javaforge.com/dtd/etl.dtd">                                                                                                                             
<etl>                                                                                                                                                                                           
    <description>Scriptella ETL File Template.</description>                                                                                                                                    
    <!--properties>                                                                                                                                                                             
        <include href="etl.properties"/>                                                                                                                                                        
    </properties -->                                                                                                                                                                            
                                                                                 
    <connection id="con1" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1/pinba" user="root" password="" classpath="" />                                                             
    <connection id="con2" driver="org.postgresql.Driver" url="jdbc:postgresql://10.1.1.1/dwh" user="root" password="" classpath="" />                                                    
                                                                                                                                                                                                
    <query connection-id="con1">                                                                                                                                                                
        SELECT * FROM tag_info_operation_server;                                                                                                                                                
        <script connection-id="con2">                                                                                                                                                           
            INSERT INTO DWH_tag_info_operation_server(operation_value, server_value, req_count, req_per_sec, hit_count, hit_per_sec, timer_value) VALUES (?1, ?2, ?3, ?4, ?5, ?6,?7);           
        </script>                                                                                                                                                                               
    </query>                                                                                                                                                                                    
</etl> 


Після цього запускаємо scriptella.sh pinba.xml


В потгресі мають з'являться ваші дані. Якщо все працює - вішаємо це все в крон.

Інші приклади - http://snippets.dzone.com/tag/scriptella

2 comments:

Сергій said...

Шикарно. Не підозрював що є такі штуки як Scriptella. Pinba в TODO, з ходу не завелось, не асіліл, буду колупати згодом.

Андрій Корнілов said...

Щоб пінба нормально зібралася під неї треба зібрати mysql - ключі конфігуре мають бути ідентичні