0

I have successfully installed SQOOP now the problem is that how to implement it with RDBMS and how to load data from RDBMS to HDFS using SQOOP.

4

3 回答 3

2

通过使用 Sqoop,您可以将数据直接加载到 Hive 表或将数据存储在 HDFS 的某个目标目录中

  1. 如果您需要将数据从 RDBMS 复制到某个目录

    sqoop import 
    --connect ConnectionString
    --username username 
    --password Your_Database_Password  {In case no password Do not Specify it} 
    --table tableName
    --col column_name(s)    {In case you need to call specific columns}
    --target-dir '/tmp/myfolder'
    --boundary-query 'Select min,max from table name'
    --m 5 {set number of mappers to 5}   
    --fields-terminated-by ','   {how do you want your data to look in target file}
    

边界查询:这是您可以指定的。如果你不指定 this ,那么默认情况下 this 作为一个内部查询运行,它加起来是一个复杂的查询。如果您明确指定它,那么它会作为普通查询运行,因此性能会提高。

此外,您可能希望限制观察的数量,例如基于列 ID,并假设您需要从 ID 1 到 1000 的数据。然后使用边界条件和拆分,您将能够限制您的导入数据。

    --boundary-query "select 0,1000 from employee' 
    --split-by ID

拆分依据:您在 Sqoop 导入上使用拆分依据来指定需要拆分的列。默认情况下,如果不指定,sqoop 会将表的主键作为 Split_by 列。

Split By 从表中提取数据并根据映射器的数量将它们存储在不同的文件夹中。默认情况下,映射器的数量为 4。

这似乎不需要,但如果您有复合主键或根本没有主键,那么 sqoop 无法获取数据并可能出错。

注意:如果将映射器的数量设置为 1,您可能不会遇到任何问题。在这种情况下,由于只有一个映射器,因此不使用按条件拆分。所以查询运行良好。这可以使用 --m 1 来完成

  1. 如果您需要将数据从 RDBMS 复制到 Hive 表中

      sqoop import 
    --connect ConnectionString
    --username username 
    --password Your_Database_Password  {In case no password Do not Specify it} 
    --table tableName
    --boundary-query 'Select min,max from table name'
    --m 5 {set number of mappers to 5}   
    --hive-import 
    --hive-table serviceorderdb.productinfo 
    --m 1
    
  2. 运行查询而不是调用整个表本身

        sqoop import 
    --connect ConnectionString
    --username username 
    --password Your_Database_Password  
    --query 'select name from employees where name like '%s' and $CONDITIONS'
    --m 5 {set number of mappers to 5}   
    --target-dir '/tmp/myfolder'         
    --fields-terminated-by ','   {how do you want your data to look in target file}
    

您可能会看到 $conditions 作为额外参数 $CONDITIONS。这是因为这次您没有指定表并明确指定了查询。当 Sqoop 运行时,它会搜索它没有找到的边界条件。然后它搜索一个表和一个用于应用边界查询的主键,它又找不到。因此,我们使用 $CONDITIONS 明确指定我们不使用查询并使用查询结果中的默认边界条件。

  1. 检查您的连接是否设置正确:为此,您可以调用列表数据库,如果您看到您的数据已填充,那么您的连接就很好。

    $ sqoop list-databases 
    --connect jdbc:mysql://localhost/ 
    --username root
    --password  pwd
    

不同数据库的连接字符串:

    MYSQL: jdbc:mysql://<hostname>:<port>/<dbname>
           jdbc:mysql://127.0.0.1:3306/test_database

    Oracle :@//host_name:port_number/service_name
            jdbc:oracle:thin:scott/tiger@//myhost:1521/myservicename

您可以从以下网址了解有关 sqoop 导入的更多信息:https ://sqoop.apache.org/docs/1.4.1-incubating/SqoopUserGuide.html

于 2015-10-08T14:30:54.713 回答
1

通过使用sqoop import命令,您可以将数据从 RDBMS 导入 HDFS、Hive 和 HBase

sqoop import --connect jdbc:mysql://localhost:portnumber/DBName --username root --table emp --password root -m1

通过使用此命令,数据将存储在 HDFS 中。

于 2014-01-29T07:11:23.373 回答
-1

运行 sqoop 导入的示例命令(将数据从 RDBMS 加载到 HDFS):

Postgres

sqoop import --connect jdbc:postgresql://postgresHost/databaseName
--username username --password 123 --table tableName

MySQL

sqoop import --connect jdbc:mysql://mysqlHost/databaseName --username username --password 123 --table tableName

甲骨文*

sqoop import --connect jdbc:oracle:thin:@oracleHost:1521/databaseName --username USERNAME --password 123 --table TABLENAME

SQL 服务器

sqoop import --connect 'jdbc:sqlserver://sqlserverhost:1433;database=dbname;username=<username>;password=<password>' --table tableName

*如果您没有以正确的大小写同时指定用户名和表,Sqoop 将不会从表中找到任何列。通常,将两者都指定为大写即可解决问题。

阅读 Sqoop 用户指南:https ://sqoop.apache.org/docs/1.4.5/SqoopUserGuide.html

我还推荐 Apache Sqoop Cookbook。您将学习如何使用导入和导出工具、执行增量导入作业、保存作业、解决 jdbc 驱动程序问题等等。http://shop.oreilly.com/product/0636920029519.do

于 2015-04-13T13:37:03.220 回答