sqoop导入多个表

时间:2013-06-19 14:41:37

标签: hadoop hive hdfs sqoop

我们正在使用Cloudera CDH 4,我们可以按预期将Oracle数据库中的表导入我们的HDFS仓库。问题是我们的数据库中有数千个表,而sqoop一次只支持导入一个表。

有哪些选项可用于将多个表导入HDFS或Hive?例如,将oracle中的200个表一次导入HDFS或Hive的最佳方法是什么?

到目前为止,我看到的唯一解决方案是为每个表导入创建一个sqoop作业,然后单独运行它们。由于Hadoop设计用于处理大型数据集,因此似乎应该有更好的方法。

7 个答案:

答案 0 :(得分:4)

  1. 假设每个表的sqoop配置相同,您可以列出需要导入的所有表,然后迭代它们启动sqoop作业(理想情况下异步启动它们)。您可以运行以下命令从Oracle获取表列表: SELECT owner, table_name FROM dba_tables reference

  2. Sqoop确实提供了导入所有表格的选项。检查此link。但是有一些限制。

  3. 修改sqoop源代码并根据需要重新编译它。 sqoop代码库有很好的文档记录和良好的安排。

答案 1 :(得分:4)

U可以使用“import-all-tables”选项一次将所有表加载到HDFS中。

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

如果我们要排除一些要加载到hdfs的表,我们可以使用“--exclude-tables”选项

例如:

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

如果我们想要存储在指定的目录中,那么你可以使用“--warehouse-dir”选项

例如:

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

答案 2 :(得分:2)

- 使用import-all-tables时,target-dir不是有效选项。

要导入特定目录中的所有表格,请使用 - warehouse-dir 而不是--target-dir。

示例:

$ sqoop import-all-tables --connect jdbc:mysql:// localhost / movies --username root --password xxxxx --warehouse-dir&#39; / user / cloudera / sqoop / allMoviesTables&#39; -m 1

答案 3 :(得分:1)

答案 4 :(得分:1)

最好的选择是做我的shell脚本

准备一个包含DBNAME.TABLENAME列表的输入文件2)shell脚本将此文件作为输入,逐行迭代并为每一行执行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

答案 5 :(得分:0)

您可以使用Sqoop&#34; import-all-tables&#34;功能导入数据库中的所有表。这还有另一个参数--exclude-tables,您可以在其中排除一些您不想在数据库中导入的表格。

注意:--exclude-tables仅适用于import-all-tables命令。

答案 6 :(得分:0)

如果表的数量非常少,则通过 sqoop 导入多个表。 为每个表创建 sqoop 导入,如下所示。

  • sqoop import --connect jdbc:mysql://localhost/XXXX --username XXXX
    密码=XXXX
    --表XXTABLE_1XX*
  • sqoop import --connect jdbc:mysql://localhost/XXXX --username XXXX
    密码=XXXX
    --表XXTABLE_2XX*

等等。

但是如果没有表是 100 或 1000 甚至更多呢?以下将是理想的解决方案。

在这种情况下,准备从包含要导入的表名列表的文本文件中获取输入的 shell 脚本,迭代,为每个表运行 scoop 导入作业