Sqoop — это инструмент для массового копирования данных между реляционной базой данных, такой как MySQL и HDFS, или другим хранилищем данных на основе Hadoop, таким как Hive или HBase. Он может либо экспортировать таблицу или набор таблиц, либо вы можете указать собственный запрос SQL для извлечения данных. Это лучшее решение для перемещения больших массивов данных; он даже может распределять работников sqoop до настраиваемого числа узлов данных Hadoop, которые будут параллельно выполнять многораздельные версии основного запроса SQL.
устанавливать
Для начала вам нужно установить Sqoop. Самый простой способ в Linux — использовать репозиторий Cloudera . Вам также понадобится драйвер JDBC MySQL и JDK (Sqoop на лету компилирует JAR и отправляет его как задание MapReduce).
cat <<EOF >> /etc/apt/sources.list.d/cloudera.list deb [arch=amd64] http://archive.cloudera.com/cdh4/ubuntu/precise/amd64/cdh precise-cdh4 contrib deb-src http://archive.cloudera.com/cdh4/ubuntu/precise/amd64/cdh precise-cdh4 contrib EOF curl -s http://archive.cloudera.com/cdh4/ubuntu/lucid/amd64/cdh/archive.key| sudo apt-key add - sudo apt-get update sudo apt-get install sqoop libmysql-java openjdk-7-jdk
Запустить его!
Скажем, у вас есть таблица MySQL и таблица user
HBase с тем же именем. Если вы хотите сделать прямую копию данных и использовать id
столбец в качестве ключа строки HBase и сохранить все столбцы в названном семействе столбцов HBase data
, все, что вам нужно сделать, это:
sqoop-import --connect jdbc:mysql://$MYSQL_SERVER/$DATABASE --driver com.mysql.jdbc.Driver --username $USER --password $PASSWORD --table user --hbase-table user --hbase-row-key id --column-family data
По крайней мере, для HBase, вы почти всегда хотите составить какой-нибудь более изощренный ключ строки, чтобы избежать горячей точки в регионе . Если вы можете выразить этот ключ строки как оператор SQL, то все в порядке. Вместо этого --table
вы указываете --query
и изменяете столбец, указанный в --hbase-row-key
.
Скажем, мы хотим, чтобы ключ строки был первыми пятью символами хеша md5 company_id
поля в user
таблице, плюс date_added
поле, отформатированное как строка из восьми символов, плюс id
поле. Пример: a8f5c-20130101-47
.
sqoop-import --connect jdbc:mysql://$MYSQL_SERVER/$DATABASE --driver com.mysql.jdbc.Driver --username $USER --password $PASSWORD --hbase-table user --hbase-row-key id --column-family data --query "SELECT CONCAT_WS('-', SUBSTR(MD5(a.company_id), 1, 5), DATE_FORMAT(a.date_added, '%Y%m%d'), a.id) as rowkey, a.* FROM user a WHERE \$CONDITIONS"
Примечание: $CONDITIONS
это заполнитель для динамического разделения данных на сервере. Вам также может понадобиться указать --split-by
столбец.
настройка
Для большого количества строк вы можете обнаружить, что Sqoop использует много памяти для копирования данных. Вы можете даже столкнуться с java.lang.OutOfMemoryError: Java heap space
или java.lang.OutOfMemoryError: GC overhead limit exceeded
. Если вы это сделаете, скорее всего, потому что драйвер базы данных MySQL извлекает все строки таблицы и сохраняет их в памяти. Вы можете сказать ему кусок до запроса на страницы и использовать курсор, изменив строку соединения с: mysql://$MYSQL_SERVER/$DATABASE?dontTrackOpenResources=true\&defaultFetchSize=1000\&useCursorFetch=true
. Смотрите документацию .
Исправление проблем
Если вы получаете сообщение об ошибке, говорящее о том, что sqoop не может загрузить драйвер MySQL, вам может понадобиться руководство, sudo cp /usr/share/java/mysql.jar /usr/lib/sqoop/lib
чтобы скопировать его в нужное место.
Если вы получили ошибку 0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
, вы должны изменить строку подключения, чтобы добавить zeroDateTimeBehavior
флаг, т.е. mysql://$MYSQL_SERVER/$DATABASE?zeroDateTimeBehavior=convertToNull