- 概述
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
- 遇到的问题:
- 在导入数据的时候,忘了启动yarn了,所有会报错,因为import导入数据实际上会转成MapReduce来执行导入,但是MapReduce是运行到yarn上的:所以启动一下yarn就可以了:start-yarn.sh
- 在执行命令的时候出现如下错误:
原因是端口不对,不知道为什么端口不是默认的1521,。出现这种情况只需要 早dos窗口输入 lsnrctl status这个命令查看一下实际端口即可。
3. 在dos命令下,连接数据库 sqlplus scott/tiger 报错 ORA-12560: TNS: 协议适配器错误,原因是OracleServiceORCL没有启动起来,在服务下启动一下即可
请关注我的微信公众号: manong_xiaodong