Hadoop入门 - Sqoop

  • 概述

Sqoop是一个开源工具,主要功能是用于在Hadoop与传统数据库库之间进行数据的传递,可以把传统的关系型数据库中的数据(比如Oracle,Mysql等数据库)导入到HDFS,也可以把HDFS中的数据导入到关系型数据库。

为了练习Sqoop我们需要装一个数据库mysql或者Oracle,我机器上装的是Oracle,在装Oracle的时候手动选择上他创建orcl数据库,这样我的话我们就不用手动的去创建数据库,插入数据了,这样比较简单一点。

  • 配置 sqoop开发环境

首先下载sqoop的安装包,并解压到指定目录,解压命令 tar -zxvf xxx -C   ~/xx/    这个解压命令就不多说了。

解压好之后配置环境变量,很简单: 打开 vi  ~/.bash_profie 这个文件,加入sqoop的目录:

SQOOP_HOME=/root/training/sqoop-1.4.5.bin__hadoop-0.23
export SQOOP_HOME

PATH=$SQOOP_HOME/bin:$PATH
export PATH

然后source ~/.bash 使之生效。

  • sqoop 命令

我们可以使用sqoop help 列出sqoop的命令:

  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information

codegen 命令是根据关系数据库的表生成Java类和jar包:

1. sqoop codegen --connect jdbc:oracle:thin:@192.168.246.133:1522/orcl --username scott --password tiger --table EMP  --outdir  /root/sqoop/

这个命令很简单,--connect 连接到你的数据库所在的ip,输入用户名和密码, --table表示Oracle数据库中的表EMP,然后输出到/root/sqoop/这个目录下。有必要提一下的是 这个地方用的jdbc连接,所以你需要一个jdbc驱动,拷贝到sqoop目录下的lib目下即可

2. create-hive-table 根据关系型数据库的表,生成与之对应的hive表。 当然你的机器上应该已经装好了hive

sqoop create-hive-table --connect jdbc:oracle:thin:@192.168.246.133:1522/orcl --username SCOTT --password tiger 
--table EMP --hive-table emp_hive

在hive中查看会发现已经了有了这个emp_hive这个表结构,但是没有数据的,只是表结构而已,下面会说一下如何导入数据

3. eval 快速的对关系型数据块进行操作,比如查看关系型数据库的数据:

sqoop eval 
--connect jdbc:oracle:thin:@192.168.246.133:1522/orcl --username SCOTT --password tiger
--query 'select * from emp';

   4.  import   将数据表中的数据导入到dfs,hive HBASE

前面我们已经在hive中创建了一个与emp对应的表结构,但是没有数据,现在我们用import将数据导入到hive中。

sqoop import 
--connect jdbc:oracle:thin:@192.168.246.133:1522/orcl --username SCOTT --password tiger
--table EMP
--target-dir /sqoop/emp/  
--hive-import --hive-table  emp_hive;

注意这里的 --target-dir是hdfs的目录,会把数据保存到hdfs,因为毕竟hive只是hdfs文件的映射,而正在存储数据还是在hdfs上,所以这个时候我们是在hive中查询就可以查到数据了:

如果不是导入到hive,只是导入到hdfs,这样就可以了:

sqoop import 
--connect jdbc:oracle:thin:@192.168.246.133:1522/orcl --username SCOTT --password tiger
--table EMP
--target-dir /sqoop/emp/  

在实际情况中可能不会将将全部的数据导入到hdfs,我们可能只是会选择其中的一部分,或者某一列导入到数hdfs,我们首先清除我们刚刚导入到hive表结构中的数据,当然hive没有delete这个命令,我们可以用插入的方式:

insert overwrite table emp_hive select * from emp_hive where 1=0;

接下来执行查询语句来导入:

sqoop import \
--connect jdbc:oracle:thin:@192.168.246.133:1522/orcl --username SCOTT --password tiger \
--query 'select * from emp where deptno=20 and $CONTITONS' \
--split-by empno --target-dir /sqoop/emp1/  \
--hive-import --hive-table emp_hive \
--m 1;

上面这句话执行的时候,查询条件必须上and $CONTITONS这个,否则会报错,具体原因是为啥很令人费解可以看下这个博客,反正我是没怎么理解为啥,就当是官方规定吧.

5. import-all-tables 导入这个这个数据库下的所有的表到hdfs

sqoop import-all-tables \
--connect jdbc:oracle:thin:@192.168.246.133:1522/orcl --username SCOTT --password tiger \
-m 1

导入到 hive  :

sqoop import-all-tables \
--connect jdbc:oracle:thin:@192.168.246.133:1522/orcl --username SCOTT --password tiger \
-m 1 \
--import-hive

 6. list-database 这个列出所有的数据库,需要注意的是这个命令在Oracle与mysql结果不一样,在Oracle中列出的所有的用户,而在mysql中是所有的数据库;

sqoop list-databases \
--connect jdbc:oracle:thin:@192.168.256.133:1522/scott --username SYSTEM --password password

7. list-tables 列出当前数据库下的所有的表:

sqoop list-tables --connect jdbc:oracle:thin:@192.168.246.133:1522/orcl --username SYSTEM --password password

 

  • 遇到的问题:
  1. 在导入数据的时候,忘了启动yarn了,所有会报错,因为import导入数据实际上会转成MapReduce来执行导入,但是MapReduce是运行到yarn上的:所以启动一下yarn就可以了:start-yarn.sh
  2. 在执行命令的时候出现如下错误:

原因是端口不对,不知道为什么端口不是默认的1521,。出现这种情况只需要 早dos窗口输入 lsnrctl status这个命令查看一下实际端口即可。

  3. 在dos命令下,连接数据库 sqlplus scott/tiger 报错 ORA-12560: TNS: 协议适配器错误,原因是OracleServiceORCL没有启动起来,在服务下启动一下即可

请关注我的微信公众号: manong_xiaodong

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟红尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值