Как изменить sqoop metastore?
Я использую версию sqoop 1.4.2. Я пытаюсь изменить мета-хранилище sqoop с hsqldb по умолчанию на mysql.
Я настроил следующие свойства в файле sqoop-site.xml.
<property>
<name>sqoop.metastore.client.enable.autoconnect</name>
<value>false</value>
<description>If true, Sqoop will connect to a local metastore
for job management when no other metastore arguments are
provided.
</description>
</property>
<property>
<name>sqoop.metastore.client.autoconnect.url</name>
<value>jdbc:mysql://ip:3206/sqoop?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>sqoop.metastore.client.autoconnect.username</name>
<value>userName</value>
</property>
<property>
<name>sqoop.metastore.client.autoconnect.password</name>
<value>password</value>
</property>
</configuration>
Когда я пытаюсь создать задания sqoop с мета-соединением, он не может подключиться к настроенной базе данных mysql.
sqoop job --create --meta-connect {mysql_jdbc_url} sqoop job defination
это бросает следующее исключение.
14/06/06 15:04:54 INFO sqoop.Sqoop: Running Sqoop version: 1.4.4.2.0.6.1-101
14/06/06 15:04:55 WARN hsqldb.HsqldbJobStorage: Could not interpret as a number: null
14/06/06 15:04:55 ERROR hsqldb.HsqldbJobStorage: Can not interpret metadata schema
14/06/06 15:04:55 ERROR hsqldb.HsqldbJobStorage: The metadata schema version is null
14/06/06 15:04:55 ERROR hsqldb.HsqldbJobStorage: The highest version supported is 0
14/06/06 15:04:55 ERROR hsqldb.HsqldbJobStorage: To use this version of Sqoop, you must downgrade your metadata schema.
14/06/06 15:04:55 ERROR tool.JobTool: I/O error performing job operation: java.io.IOException: Invalid metadata version.
at org.apache.sqoop.metastore.hsqldb.HsqldbJobStorage.init(HsqldbJobStorage.java:202)
at org.apache.sqoop.metastore.hsqldb.HsqldbJobStorage.open(HsqldbJobStorage.java:161)
at org.apache.sqoop.tool.JobTool.run(JobTool.java:274)
at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:222)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:231)
at org.apache.sqoop.Sqoop.main(Sqoop.java:240)
Поддерживает ли sqoop 1.4.2 metastore, отличное от hsql db?
Пожалуйста, предложите.
3 ответа
Ответ Да, в моем случае я использую PostgreSQL. Я столкнулся с этим недавно, и я использую версию 1.4.4. Я не уверен, что то, что я сделал, является рекомендуемым способом, но это работает. Вот шаги, за которыми я следовал
В sqoop-site.xml я настроил его, строку подключения к моей базе данных, имя пользователя и пароль.
Создал следующий объект в базе данных, так как Sqoop терпел неудачу в этом.
CREATE TABLE SQOOP_ROOT ( version INT, propname VARCHAR(128) NOT NULL, propval VARCHAR(256), CONSTRAINT SQOOP_ROOT_unq UNIQUE (version, propname) );
Вставлена следующая строка (кажется, это причина того, что ваш скрипт не работает)
INSERT INTO SQOOP_ROOT VALUES( NULL, 'sqoop.hsqldb.job.storage.version', '0' );
Я думаю, что правильный путь может быть скачать исходный код и расширить org.apache.sqoop.metastore.JobStorage
с вами реализация БД.
Sqoop metastore не поддерживает другие базы данных, кроме hsqldb. Номер 2 точки заметки по ссылке. Cloudera
Объявление публичной службы: Sqoop Metastore на других БД может дать сбой
Мы смогли заставить PostgreSQL и MySQL работать как цели для Sqoop Metastore на Sqoop 1, заменив базу данных HyperSQL. Нужна небольшая настройка и заполнение базы данных, но с тех пор это казалось нормальным.
Однако мы наблюдаем случаи, когда мы выполняем много заданий sqoop, одновременно обновляя метасторское хранилище - sqoop 1.4.6 не имеет кода для перехвата и обработки случаев, когда обновления метастазов для инкрементных обновлений не выполняются из-за проблем параллелизма. В частности, Sqoop _ успешно завершит импорт, но не обновит метастор с последними импортированными значениями. Это приведет к тому, что при следующем инкрементном запуске будут импортированы повторяющиеся данные. Sqoop вернет ненулевой код возврата, но данные в Hadoop или в метастазах должны быть впоследствии синхронизированы, чтобы данные были правильными.
Мы не уверены, что есть решение, но это расширение ответа @SandeerKumar. Это может быть проблемой и с HyperSQL, но гораздо менее вероятно, потому что HSQL находится в памяти, поэтому быстрее.