sqoop简单使用
sql to hadoop
用来实现关系型数据库与hdfs之间的转换,hdfs <=>mysql
sqoop2跟1 不兼容 ,2不投入生产
sqoop原理
将导入或导出命令反应成mapreduce程序来实现
在翻译出的mapreduce中主要是对inputformat和outoutformat进行定制
sqoop官方的参数大全 http://sqoop.apache.org/docs/1.4.5/SqoopUserGuide.html
参数 | 介绍 |
--connect jdbc:mysql://ip:3306/databasename | #指定JDBC的URL 其中database指的是(Mysql或者Oracle)中的数据库名 |
--table tablename | #要读取数据库database中的表名 |
--username root | #用户名 |
--password | #密码 |
--target-dir /path | #指的是HDFS中导入表的存放目录(注意:是目录) |
--m 1 | #并发的map数量1,如果不设置默认启动4个map task执行数据导入,则需要指定一个列来作为划分map task任务的依据 |
--hcatalog-table --hcatalog-database | #指定hive表 #指定hive库 |
-- where ’查询条件‘ | #导入查询出来的内容,表的子集 |
--incremental append | #增量导入 |
--check-column:column_id | #指定增量导入时的参考列 |
--last-value:num | #上一次导入column_id的最后一个值 |
--null-string ‘’ | #导入的字段为空时,用指定的字符进行替换 |
--create-hive-table | #创建hive表 |
--list-tables | #列出某个表 |
--list-database | #列出所有数据库 |
--fields-terminated-by | #设定导入数据后每行的分隔符 |
1.测试sqoop是否能够成功连接数据库
sqoop list-databases --connect jdbc:mysql://10.120.21.151/ --username hive --password p0o9i8u7y6
导入数据
在sqoop中,‘导入’概念指从非大数据集群向大数据集群中传数据,叫做:导入,即使用import关键字
1.确定Mysql服务开启正常
2.在Mysql中新建一张表并插入一些数据
mysql -uroot -pp0o9I*U&
mysql> create database testbase;
mysql> create table test(id int , name CHAR);
mysql> insert into test values(1,'w');
mysql> insert into test values(2,'s');
3.导入数据
(1)全部导入
sqoop import --connect jdbc:mysql://10.120.21.151/metastore \
--username hive \
--password p0o9i8u7y6 \
--table t1 \
--target-dir /user/hive/t1 \
--num-mappers 1 \
--fields-terminated-by "\t"
以下是重新在mysql和hive中创建的测试数据
从hdfs到mysql
把需要输出的文件上传至hdfs中,设置好hdfs中目录和文件的权限,不然可能会报权限不够的错误
Sqoop export
sqoop export \
--connect jdbc:mysql://10.193.130.192/my_wiki \
--username bigvoid \
-P (此处用--password的话会报错) \
--table export_test \
--num-mappers 1 \
--export-dir /user/super/export \
--input-fields-terminated-by “\t”
--password的报错
检查导入的数据
集成了kerberos的需注意登录相应的用户进行操作
Sqoop expot 将hive表导入mysql中
- 全部导入
全部导入
sqoop export \
--connect jdbc:mysql://10.193.130.192:3306/my_wiki \
--username bigvoid \
-P \
--table export_test(mysql表) \
--hcatalog-database fsimage(hive数据库) \
--hcatalog-table h_m(hive表)
检查导入数据
2. 部分导入
指定导入(指定列导入):
sqoop export \
--connect jdbc:mysql://10.193.130.192:3306/my_wiki \
--username bigvoid -P --table export_test(mysql表) \
--columns "id" \
--hcatalog-database fsimage(hive数据库) \
--hcatalog-table h_m(hive表)
检查导入的数据
Mysql到hive
(1)导入数据到HDFS中
(1)导入数据到HDFS中sqoop export \
sqoop import \
--connect jdbc:mysql://10.193.130.192:3306/my_wiki(mysql库) \
--username bigvoid -P --table export_test(mysql表) \
--target-dir /user/super/import --num-mappers 1 \
--hive-table h_m(hive表)\
-m 1 \
--split-by date \
--direct \
--fields-terminated-by '\t
检查导入文件
hadoop fs -ls /user/super
(2)加载数据
Load data inpath ‘/user/super/import’ into table h_m;
(3)检查数据
直接从mysql导入hive 不需要load data加载
sqoop import \
--connect jdbc:mysql://10.193.130.192:3306/my_wiki \
--username bigvoid \
-P \
--table export_test \
--fields-terminated-by '\t' \
--delete-target-dir \
--num-mappers 1 \
--hive-import \
--hive-database fsimage \
--hive-table m_h
检查导入数据
增量导入
Append方式
(1)创建一个mysql appendtest表
插入三条数据
(2)用sqoop语句创建一个跟mysql一样的appendtest表
用sqoop语句创建一个跟mysql一样的appendtest表
sqoop create-hive-table \
--connect jdbc:mysql://10.193.130.192:3306/my_wiki \
--username bigvoid -P \
--table appendtest \
--hive-database fsimage \
--hive-table appendtest
进行导入,将id>0的三条数据进行导入
(3)进行导入,将id>0的三条数据进行导入
sqoop import \
--connect jdbc:mysql://10.193.130.192/my_wiki \
--username bigvoid -P --table appendtest \
--hive-import -m 1 \
--hive-database fsimage \
--hive-table appendtest \
--incremental append \
--check-column id \
--last-value 0
(4)检查导入数据
(5)向mysql表中再次插入数据
再次执行增量导入 上一次导入的时候将--last-value 设置0
此次导入时将值设置为3
(6)再次执行增量导入 上一次导入的时候将--last-value 设置0此次导入时将值设置为3
sqoop import \
--connect jdbc:mysql://10.193.130.192/my_wiki \
--username bigvoid \
-P \
--table appendtest \
--hive-import -m 1 \
--hive-database fsimage \
--hive-table appendtest \
--incremental append \
--check-column id \
--last-value 3
查询导入数据