设置HADOOP_HOME
$ HADOOP_HOME=/path/to/some/hadoop sqoop import --arguments...
下载合适的Sqoop并解压到硬盘,所谓合适即Sqoop的版本应该和Hadoop的版本相匹配。笔者的Hadoop版本是1.03,下载的Sqoop是版本1.4.2。
$ tar zvxf sqoop-1.4.2.bin__hadoop-1.0.0.tar.gz
下载合适的JDBC驱动,将下载的JDBC的驱动放到Sqoop的lib文件夹下。
导入数据
$ sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.56.111:1521:DBNAME --username USERNAME --password PASSWORD --verbose -m 1 --table TABLENAME
DBNAME:数据库名
USERNAME:用户名
PASSWORD:密码
TABLENAME:表名
-m:导入数据的进程的并发数,默认是4。如果导入的数据不大的话,不妨设置成1,这样导入更快。一般来说Sqoop会使用主键来平均地分割数据。并发导入的时候可以设置相关的分割列等等,具体的做法参考官方的文档。
如果Oracle是安装在远程的电脑上,要确保Sqoop可以ping通Oracle所在的电脑。例如如果Oracle安装在Win7上面,可能需要关闭Win7的防火墙。另外,需要将Oracle配置成可以远程访问的。
注意,用户名和表名应该要是大写的,除非它们在创建的时候是名字是放在引号中的大小写混合的形式。
一个很奇怪的错误
笔者在导入数据的过程中,发现一个问题,就是导入时没有提示任何错误,在HDFS中也看到生成了相关的文件,但是在Hive中使用命令show TABLES时却没有看到新导入的表格。此时有两种解决方案。一种是在Hive中手动地使用CREAT命令创建出表格,然后再SELECT一个,会发现表里有数据了。因此笔者猜测(只是猜测)可能是因为导入之后表格的元数据没有写入到Hive中。笔者查找了相关的资料,发现Hive默认是将元数据存储在derby中,所以笔者考虑将derby换成MySQL。
1、Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。2、所以sqoop可以支持大多数的传统关系型数据库。如:Mysql、Oracle、Postgres等。
Sqoop是一款用于把关系型数据库中的数据导入到hdfs中或者hive中的工具,当然也支持把数据从hdfs或者hive导入到关系型数据库中。Sqoop也是基于Mapreduce来做的数据导入。
关于sqoop的原理
sqoop的原理比较简单,就是根据用户指定的sql或者字段参数,从数据库中读取数据导入到hive或者hdfs中。也支持基于数据库导出工具导出,不过受限于数据库的版本。
在导出的过程中,sqoop会自动切分mapreduce任务。比如某个字段的主键是从1到1000,那么当设置num-mappers为2时,第一个mr任务会读取1-500的数据,第二个mr任务会读取500-1000的数据。如果是字符串还有其他的划分方法.
关于架构
sqoop目前有两个大版本,第一个版本比较简单,只能使用命令行
第二个版本引入了sqoop server,统一处理连接等信息,并提供多种连接方式,还引入了权限控制,另外规范了连接的各项配置。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)