(二)Sqoop使用教程
一.Sqoop简介
Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
二.Sqoop原理
将导入或导出命令翻译成mapduce程序来实现。在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。
三.下载安装
参照此https://www.cnblogs.com/Agent9527/p/13195068.html进行安装。
四.Sqoop简单使用案例
4.1导入数据
在Sqoop中“导入”是指从非大数据集群(RDBMS)向大数据集群(HDFS\Hive\HBase)中传输数据,叫做:导入,即使用import关键字。与其相反称之为导出,即使用关键字“export”。
4.2从RDBMS到HDFS
确定Mysql服务开启正常;在Mysql数据库中新建一张表并插入数据。
Mysql建库建表 create database company; create table company.staff( id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255)); 插入测试数据 insert into company.staff(name,sex) values("Thcmas","Male");
insert into company.staff(name,sex) values(‘Catalina’,’ReMale’);
Mysql --> HDFS 注意:粘贴以下时把“#号”前面的空格以及“#号”后面的内容删掉。
1.全部导入 sqoop import \ # 启动sqoop命令 导入 \换行符 --connect jdbc:mysql://主机名:3306/库 \ # 连接(固定) --username root \ # 连接mysql的账号名 --password 密码 \ # 连接mysql的账号密码 --table 表 \ # 即将导入的表名 --target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建) --delete-target-dir \ # 删除原先已有的表 --num-mappers 1 \ # map工作数(自己确定就行了) --fields-terminated-by "\t" # 指定分隔符不指定会粘到一块 2.查询select导入 sqoop import \ # 启动sqoop导入 \换行符 --connect jdbc:mysql://主机名:3306/库 \ # 连接(固定) --username root \ # 连接mysql的账号名 --password 密码 \ # 连接mysql的账号密码 --target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建?) --delete-target-dir \ # 删除原先已有的表 --num-mappers 1 \ # map工作数(自己确定就行了) --fields-terminated-by "\t" # 指定分隔符 --query " 列1,列2,列3 from 表 where 列1 <=1 and \$CONDITIONS;" # 保证在多个map任务时保证数据顺序前后一致 3.指定columns导入 sqoop import \ # 启动sqoop导入 \换行符 --connect jdbc:mysql://主机名:3306/库 \ # 连接(固定) --username root \ # 连接mysql的账号名 --password 密码 \ # 连接mysql的账号密码 --table 表 \ # 即将导入HDFS的表名 --columns 列1,列2 \ # 指定列名导出 --target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建?) --delete-target-dir \ # 删除原先已有的表 --num-mappers 1 \ # map工作数(自己确定就行了) --fields-terminated-by "\t" # 指定分隔符 4.关键字where+columns筛选导入 sqoop import \ # 启动sqoop导入 \换行符 --connect jdbc:mysql://主机名:3306/库 \ # 连接(固定) --username root \ # 连接mysql的账号名 --password 密码 \ # 连接mysql的账号密码 --table 表 \ # 即将导入HDFS的表名 --columns 列1,列2 \ # 指定列名导入 --where 列1条件 \ # 指定列条件进行导入 --target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建?) --delete-target-dir \ # 删除原先HDFS已有的表 --fields-terminated-by "\t" # 指定分隔符 --num-mappers 1 \ # map工作数(自己确定就行了)
Mysql --> HDFS --> Hive
sqoop import \ # 启动sqoop导入 \换行符 --connect jdbc:mysql://主机名:3306/库 \ # 连接(固定) --username root \ # 连接mysql的账号名 --password 密码 \ # 连接mysql的账号密码 --table 表 \ # 即将导入HDFS的表名 --columns 列1,列2 \ # 指定列名导入 --where 列1条件 \ # 指定列条件进行导入 --hive-import \ # 又从HDFS导入hive --hive-database 库\ # 导入的指定库名 --hive-table 表 \ # 将要导入的hive表 --hive-overwrite \ # 覆盖原先hive已有的表 --fields-terminated-by "\t" # 指定分隔 --num-mappers 1 \ # map工作数(自己确定就行了)这放后面好看点
RDBMS --> HDFS --> HBase
sqoop import \ # 启动sqoop导入 \换行符 --connect jdbc:mysql://主机名:3306/库 \ # 连接(固定) --username root \ # 连接mysql的账号名 --password 密码 \ # 连接mysql的账号密码 --table 表 \ # 即将导入HDFS的表名 --columns 列1,列2 \ # 指定列名导入 --where 列1条件 \ # 指定列条件进行导入 --hbase-create-table \ # 是否创建表? --hbase-table "表名" \ # 指定要导入的HBase中的表名 --column-family "hbase列族" \ # 指定要导入的HBase表的列族 --hbase-row-key "mysql列" \ # 指定mysql中的某一列作为HBase表中的rowkey --split-by id \ # 指定mysql中的某一列作为分区导入。默认是主键 --num-mappers 1 \ # map工作数(自己确定就行了)
4.3(从HDFS/Hive导出到RDBMS) HDFS与Hive语法一样
sqoop export \ # 启动sqoop导出 \换行符 --connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)导出到mysql的库名 --username root \ # 连接mysql的账号名 --password 密码 \ # 连接mysql的账号密码 --table 表 \ # 导出到mysql的表名 --export-dir /路径名/路径名/路径名 \ # 从hdfs&hive导出的hive/hdfs文件路径 --input-fields-terminated-by "\t" \ # 从hdfs&hive导出的指定切割符 --num-mappers 1 \ # map工作数
五. Shell拓展
可利用shell编写脚本实现;减少麻烦
# vim test.sh Linux下编译名为test.sh的shell脚本。扩展名并不影响脚本执行,见名知意就好。添加以下内如。 #!/bin/bash #告诉系统这个脚本需要什么解释器来执行 sqoop import \ # 启动sqoop命令 导入 \换行符 --connect jdbc:mysql://主机名:3306/库 \ # 连接(固定) --username root \ # 连接mysql的账号名 --password 密码 \ # 连接mysql的账号密码 --table 表 \ # 即将导入的表名 --target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建) --delete-target-dir \ # 删除原先已有的表 --num-mappers 1 \ # map工作数(自己确定就行了) --fields-terminated-by "\t" # 指定分隔符不指定会粘到一块 :wq 保存退出 chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本