分享

利用sqoop 将 hive/hdfs数据 导入 Oracle中

starrycheng 发表于 2015-12-2 13:18:50 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 15792
首先我们要安装好sqoop
笔者我用的是sqoop1
其次我们需要ojdbc6.jar 这个jar 包下载地址如下:
http://www.oracle.com/technetwor ... -112010-090769.html

将解压的包 复制到sqoop安装目录下的lib 目录中

最后执行我们的导入命令即可
[mw_shl_code=bash,true]sqoop  export --table FDC_JPLP   --connect jdbc:oracle:thin:@localhost:port:test1   --username test --password test     --export-dir /user/hive/warehouse/data_w.db/seq_fdc_jplp     --columns  goal_ocityid,goal_issueid,compete_issueid,ncompete_rank  --input-fields-terminated-by '\001'     --input-lines-terminated-by '\n'[/mw_shl_code]

注意要指定 –columns 参数 否则会报错 找不到 columns
用法: –columns

查询数据是否导入成功
[mw_shl_code=bash,true]sqoop  eval   --connect jdbc:oracle:thin:@localhost:port:test1 --query "select * from FDC_JPLP"  --username fccsreport --password fccsoracle10g_report
[/mw_shl_code]

当然你也可以使用Oracle相关的管理工具查看。

说明:做数据导入 导出操作的时候请注意 两边表字段类型尽量要保持一致 否则会出现数据类型转化错误



已有(3)人评论

跳转到指定楼层
starrycheng 发表于 2015-12-2 13:19:24
SQOOP与ORACLE交互要注意的地方

SQOOP与ORACLE交互的时候,用户名和表名需呀大小,否则会不显示任何结果。
如下:

[hadoop@htbbs bin]$ ./sqoop  list-tables --connect "jdbc:oracle:thin:@htbbs:1521:htdb" --username YANSP --password test
Warning: /usr/lib/hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: $HADOOP_HOME is deprecated.


13/05/20 15:25:13 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
13/05/20 15:25:13 INFO manager.SqlManager: Using default fetchSize of 1000
13/05/20 15:25:13 INFO manager.OracleManager: Time zone has been set to GMT
T
TEST
ODCH_EXT_TABLE
[hadoop@htbbs bin]$ ./sqoop  list-tables --connect "jdbc:oracle:thin:@htbbs:1521:htdb" --username yansp --password test
Warning: /usr/lib/hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: $HADOOP_HOME is deprecated.


13/05/20 15:26:59 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
13/05/20 15:26:59 INFO manager.SqlManager: Using default fetchSize of 1000
13/05/20 15:26:59 INFO manager.OracleManager: Time zone has been set to GMT
[hadoop@htbbs bin]$

用户名用小写不会显示任何结果,大写是可以的。
这是因为在ORACLE中,用户名和表名存在数据库中默认是大写的。

如下:

SQL> show user
USER is "YANSP"
SQL> select table_name from user_tables;


TABLE_NAME
------------------------------------------------------------
T
TEST
ODCH_EXT_TABLE


SQL> SELECT USERNAME FROM USER_USERS;


USERNAME
------------------------------------------------------------
YANSP


SQL>



仅供参考。

回复

使用道具 举报

starrycheng 发表于 2015-12-2 13:25:12
利用SQOOP将ORACLE到HDFS



利用SQOOP将ORACLE到HDFS


利用SQOOP将ORACLE到HDFS



#Oracle的连接字符串,其中包含了URL,SID,和PORT
URL=jdbc:oracle:thin:@132.232.19.79:10521:szdw
#使用的用户名
USERNAME=szdw
#使用的密码
PASSWORD=szdw
#需要从Oracle中导入的表名
TableNAME=proc_resource_admin
#需要从Oracle中导入的表中的字段名
COLUMNS=AREA_ID,TEAM_NAME
#将Oracle中的数据导入到HDFS后的存放路径
HADFPATH=/home/hadoop/data/proc_resource_admin
#执行导入逻辑。将Oracle中的数据导入到HDFS中
sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HAFSPATH  --num-mappers 1 --table $TABLENAME --COLUMNS $columns --fields-terminated-by '\t';
执行这个脚本之后,导入程序就完成了。

接下来,用户可以自己创建外部表,将外部表的路径和HDFS中存放Oracle数据的路径对应上即可。

注意:这个程序导入到HDFS中的数据是文本格式,所以在创建Hive外部表的时候,不需要指定文件的格式为RCFile,而使用默认的TextFile即可。数据间的分隔符为'\t'。如果多次导入同一个表中的数据,数据以append的形式插入到HDFS目录中。

并行导入
假设有这样这个sqoop命令,需要将Oracle中的数据导入到HDFS中:

sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH  --m 1 --table $TABLENAME --columns $columns --fields-terminated-by '\t'  --where "data_desc='2011-02-26'";

请注意,在这个命令中,有一个参数“-m”,代表的含义是使用多少个并行,这个参数的值是1,说明没有开启并行功能。

现在,我们可以将“-m”参数的值调大,使用并行导入的功能,如下面这个命令:

sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH  --m 4 --table $TABLENAME --columns $columns --fields-terminated-by '\t'  --where "data_desc='2011-02-26'";

一般来说,Sqoop就会开启4个进程,同时进行数据的导入操作。

但是,如果从Oracle中导入的表没有主键,那么会出现如下的错误提示:

ERROR tool.ImportTool: Error during import: No primary key could be found for table creater_user.popt_cas_redirect_his. Please specify one with --split-by or perform a sequential import with '-m 1'.

在这种情况下,为了更好的使用Sqoop的并行导入功能,我们就需要从原理上理解Sqoop并行导入的实现机制。

如果需要并行导入的Oracle表的主键是id,并行的数量是4,那么Sqoop首先会执行如下一个查询:

select max(id) as max, select min(id) as min from table [where 如果指定了where子句];

通过这个查询,获取到需要拆分字段(id)的最大值和最小值,假设分别是1和1000。

然后,Sqoop会根据需要并行导入的数量,进行拆分查询,比如上面的这个例子,并行导入将拆分为如下4条SQL同时执行:

select * from table where 0 <= id < 250;

select * from table where 250 <= id < 500;

select * from table where 500 <= id < 750;

select * from table where 750 <= id < 1000;

注意,这个拆分的字段需要是整数。

从上面的例子可以看出,如果需要导入的表没有主键,我们应该如何手动选取一个合适的拆分字段,以及选择合适的并行数。

再举一个实际的例子来说明:

我们要从Oracle中导入creater_user.popt_cas_redirect_his。

这个表没有主键,所以我们需要手动选取一个合适的拆分字段。

首先看看这个表都有哪些字段:

然后,我假设ds_name字段是一个可以选取的拆分字段,然后执行下面的sql去验证我的想法:

select min(ds_name), max(ds_name) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26'

发现结果不理想,min和max的值都是相等的。所以这个字段不合适作为拆分字段。

再测试一下另一个字段:CLIENTIP
select min(CLIENTIP), max(CLIENTIP) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26'

这个结果还是不错的。所以我们使用CLIENTIP字段作为拆分字段。

所以,我们使用如下命令并行导入:

sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH  --m 12 --split-by CLIENTIP --table $TABLENAME --columns $columns --fields-terminated-by '\t'  --where "data_desc='2011-02-26'";

这次执行这个命令,可以看到,消耗的时间为:20mins, 35sec,导入了33,222,896条数据。

另外,如果觉得这种拆分不能很好满足我们的需求,可以同时执行多个Sqoop命令,然后在where的参数后面指定拆分的规则。如:

sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH  --m 1 --table $oTABLENAME --columns $columns --fields-terminated-by '\t'  --where "data_desc='2011-02-26' logtime<10:00:00"

sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH  --m 1 --table $oTABLENAME --columns $columns --fields-terminated-by '\t'  --where "data_desc='2011-02-26' logtime>=10:00:00"

从而达到并行导入的目的。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条