sqoop的基本常用操作

什么是sqoop?

sql to hadoop(hive) 支持将结构化的数据导入到HDFS上或者是hive上

 sqoop的原理:

将导入或导出命令翻译成mapreduce程序来实现,在翻译mapreduce的过程中主要是对inputformat和outputformat进行定制。

sqoop基本操作:

测sqoop能否连接数据库
 bin/sqoop list-databases --connect jdbc:mysql://hadoop101:3306/ --username root --password isea


export操作:

建立测试表
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('Catalina', 'FeMale');

mysql> select * from staff;
+----+----------+--------+
| id | name     | sex    |
+----+----------+--------+
|  1 | Catalina | FeMale |
+----+----------+--------+
1 row in set (0.00 sec)


使用sqoop连接到mysql数据库,指定mysql中库和表的名字,指定HDFS上的路径名,文件的分隔符,
Mapper的个数
bin/sqoop import \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password isea \
--table staff \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"


从表中查询特定的字段,导入到HDFS上
bin/sqoop import \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password isea \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from staff where id <=1 and $CONDITIONS;'


直接使用sqoop将mysql表中的特定字段导入到HDFS上
bin/sqoop import \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password isea \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns id,sex \
--table staff




sqoop支持一些的比快速简化的SQL
bin/sqoop import \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password isea \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff \
--where "id=1"



将数据到如到hive数据仓库中,这个过程会分为两步,在HDFS上默认的目录是 /user/isea 
第一步是将数据写入到HDFS上,第二步是HDFS上的数据移动到hive中
bin/sqoop import \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password isea \
--table staff \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table staff_hive

可以在hive中查看到数据
hive> select * from staff_hive;
OK
1	Catalina	FeMale
Time taken: 4.254 seconds, Fetched: 1 row(s)



将mysql的数据借助sqoop导入到HBASE中:
bin/sqoop import \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password isea \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_company" \
--num-mappers 1 \
--split-by "_"


如果出现:
Exception in thread "main" java.lang.NoSuchMethodError:org.apache.hadoop.hbase.HTableDescriptor.addFamily
(Lorg/apache/hadoop/hbase/HColumnDescriptor;)


手动建表之后再执行上述的语句
create 'hbase_company','info'

查询之后得出:
hbase(main):091:0> scan 'hbase_company'
ROW                                    COLUMN+CELL                                                                                                   
 1                                     column=info:name, timestamp=1545202735237, value=Catalina                                                     
 1                                     column=info:sex, timestamp=1545202735237, value=FeMale  



bin/sqoop import \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password isea \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id","name" \
--hbase-table "hbase_company" \
--num-mappers 1 \
--split-by "_"

将会增加一条数据
 1_Catalina        column=info:sex, timestamp=1545202988430, value=FeMale    


export导出操作:


HIVE/HDFS到mysql数据库中

bin/sqoop export \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password isea \
--table staff \
--num-mappers 1 \
--export-dir /user/hive/warehouse/staff_hive \
--input-fields-terminated-by "\t"

mysql> select * from staff;
Empty set (0.00 sec)


mysql> select * from staff;
+----+----------+--------+
| id | name     | sex    |
+----+----------+--------+
|  1 | Catalina | FeMale |
+----+----------+--------+
1 row in set (0.00 sec)





脚本打包:需要使用opt格式大打包sqoop命令,然后再执行。

mkdir opt

vim job_hdfs_to_mysql.opt
export
--connect
jdbc:mysql://hadoop101:3306/company
--username
root
--password
isea
--table
staff
--num-mappers
1
--export-dir
/user/hive/warehouse/staff_hive
--input-fields-terminated-by
"\t"

执行
bin/sqoop --options-file opt/job_hdfs_to_mysql.opt


在跑的MapReduce的过程中,如果出现
18/12/19 15:20:47 INFO mapreduce.Job:  map 0% reduce 0%
18/12/19 15:21:01 INFO mapreduce.Job:  map 100% reduce 0%
之后,一直卡在那里不动的情况,具体的原因可以去历史服务器去看看,8088端口,在查看之前,先将任务终
止并将MRAppMaster,kill掉,YARNchild也要kill掉(是MapTask),这样才能查看到具体的log日志信息。

查看log日志之后发现是多个重复的逐渐的错误,清空表之后重试

就可以发现有表中有了数据
发布了115 篇原创文章 · 获赞 180 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_31807385/article/details/85107181