Статьи

Быстрый запуск Sqoop / HBase в Linux

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