【问题标题】:sqoop import multiple tablessqoop 导入多个表
【发布时间】:2021-07-05 14:53:45
【问题描述】:

我们正在使用 Cloudera CDH 4,并且能够按预期将表从我们的 Oracle 数据库导入我们的 HDFS 仓库。问题是我们的数据库中有成千上万的表,而 sqoop 一次只支持导入一个表。

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

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

【问题讨论】:

    标签: hadoop hive hdfs sqoop


    【解决方案1】:

    您可以使用“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'
    

    【讨论】:

    • 你能告诉我如何直接将这些表导入到 hive 中的特定数据库中
    • 这是不正确的。您不能将 --target-dir 用于多个表,必须使用仓库目录。两者的区别是一个是基于表的,另一个是基于数据库的。
    【解决方案2】:
    1. 假设每个表的 sqoop 配置相同,您可以列出需要导入的所有表,然后迭代它们以启动 sqoop 作业(理想情况下是异步启动它们)。您可以运行以下命令从 Oracle 获取表列表: SELECT owner, table_name FROM dba_tablesreference

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

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

    【讨论】:

      【解决方案3】:

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

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

      示例:

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

      【讨论】:

        【解决方案4】:

        最好的选择是做我的 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】:
          【解决方案6】:

          您可以使用 Sqoop "import-all-tables" 功能导入数据库中的所有表。这还有另一个参数--exclude-tables,您可以通过它排除一些您不想在数据库中导入的表。

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

          【讨论】:

            【解决方案7】:

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

            • sqoop 导入 --connect jdbc:mysql://localhost/XXXX --username XXXX
              密码=XXXX
              --table XXTABLE_1XX*
            • sqoop 导入 --connect jdbc:mysql://localhost/XXXX --username XXXX
              密码=XXXX
              --table XXTABLE_2XX*

            等等。

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-04-26
              • 2016-08-07
              • 2017-02-03
              • 2016-11-25
              • 1970-01-01
              • 2016-02-14
              相关资源
              最近更新 更多