2013-06-19 8 views
3

Мы используем Cloudera CDH 4, и мы можем импортировать таблицы из наших баз данных Oracle в наш склад HDFS, как ожидалось. Проблема в том, что у нас есть 10 тысяч таблиц внутри наших баз данных, и sqoop поддерживает только импорт одной таблицы за раз.sqoop import multiple tables

Какие опции доступны для импорта нескольких таблиц в HDFS или Hive? Например, какой был бы лучший способ импортировать 200 таблиц из oracle в HDFS или Hive за раз?

Единственным решением, которое я видел до сих пор, является создание задания sqoop для каждого импорта таблицы и последующего запуска их по отдельности. Поскольку Hadoop предназначен для работы с большим набором данных, похоже, что должен быть лучший способ.

ответ

3
  1. Предполагая, что конфигурация sqoop для каждой таблицы одно и то же, вы можете перечислить все таблицы, которые нужно импортировать, а затем перебрать их запуск sqoop рабочих мест (в идеале их запуска в асинхронном режиме). Вы можете запустить следующую команду, чтобы извлечь список таблиц из Oracle: SELECT owner, table_name FROM dba_tablesreference

  2. Sqoop действительно предлагает возможность импортировать все таблицы. Проверьте это link. Однако есть некоторые ограничения.

  3. Измените исходный код sqoop и перекомпилируйте его в соответствии с вашими потребностями. База данных sqoop хорошо документирована и красиво оформлена.

3

U можно использовать опцию «импорт-все-таблицы», чтобы загрузить все таблицы в HDFS в одно время.

sqoop import-all-tables --connect jdbc:mysql://localhost/sqoop --username root --password hadoop --target-dir '/Sqoop21/AllTables' 

, если мы хотим, чтобы исключить некоторые таблицы для загрузки в HDFS мы можем использовать «--exclude-таблицы» вариант

Ex:

sqoop import-all-tables --connect jdbc:mysql://localhost/sqoop --username root --password hadoop --target-dir '/Sqoop21/AllTables' --exclude-tables <table1>,<tables2> 

Если мы хотим сохранить в указанный каталог, то вы можете использовать "--warehouse-Dir" вариант

Ex:

sqoop import-all-tables --connect jdbc:mysql://localhost/sqoop --username root --password hadoop --warehouse-dir '/Sqoop' 
+0

Можете ли вы рассказать мне, как я могу напрямую импортировать эти таблицы в улей, чтобы в конкретную базу данных в улье – Shantesh

1

Самый лучший вариант, это сделать мой сценарий оболочки

Подготовьте файл_ввода, который имеет список DBNAME.TABLENAME 2) Сценарий оболочки будет иметь этот файл в качестве входных данных, итерации по строчкам и выполнить sqoop заявление для каждой строки.

while read line; 
do 

    DBNAME=`echo $line | cut -d'.' -f1` 
    tableName=`echo $line | cut -d'.' -f2` 


    sqoop import -Dmapreduce.job.queuename=$QUEUE_NAME --connect '$JDBC_URL;databaseName=$DBNAME;username=$USERNAME;password=$PASSWORD' --table $tableName --target-dir $DATA_COLLECTOR/$tableName --fields-terminated-by '\001' -m 1 

done<inputFile 
0

Вы можете использовать Sqoop «import-all-tables», чтобы импортировать все таблицы в базе данных. У этого также есть еще один параметр, --exclude-tables, вместе с которым вы можете исключить часть таблицы, которую вы не хотите импортировать в базу данных.

Примечание: --exclude-tables работает только с командой import-all-tables.

0

--target-dir не является допустимым вариантом при использовании импортных таблиц.

Чтобы импортировать все таблицы в конкретном каталоге, используйте --warehouse-dir вместо --target-dir.

Пример:

$ sqoop импорт-все-таблицы --connect JDBC: MySQL: // Localhost/фильмы --username корень --password ххххх --warehouse-Dir «/ пользователь/Cloudera/sqoop/allMoviesTables '-m 1