什么是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日志之后发现是多个重复的逐渐的错误,清空表之后重试
就可以发现有表中有了数据