简单介绍
在导入开始之前,Sqoop使用JDBC来检查将要导入的表。他检索出表中所有的列以及列的SQL数据类型。这些SQL类型(varchar、integer)被映射到Java数据类型(String、Integer等),在MapReduce应用中将使用这些对应的Java类型来保存字段的值。Sqoop的代码生成器使用这些信息来创建对应表的类,用于保存从表中抽取的记录。Sqoop启动的MapReduce作业用到一个InputFormat,他可以通过JDBC从一个数据库表中读取部分内容。
Hadoop提供的DataDriverDB InputFormat能为查询结果进行划分传给指定个数的map任务。为了获取更好的导入性能,查询会根据一个“划分列”来进行划分。Sqoop会选择一个合适的列作为划分列(通常是表的主键)。在生成反序列化代码和配置InputFormat之后,Sqoop将作业发送到MapReduce集群。Map任务将执行查询并将ResultSet中的数据反序列化到生成类的实例,这些数据要么直接保存在SequenceFile文件中,要么在写到HDFS之前被转换成分割的文本。Sqoop不需要每次都导入整张表,用户也可以在查询中加入到where子句,以此来限定需要导入的记录。
任务:
1.练习使用Sqoop将数据在Mysql与HDFS之间的导入导出。
2.练习使用Sqoop将数据从Mysql中导入到HBase中。
3.练习使用Sqoop将数据在Mysql与Hive之间的导入导出。
步骤:
1.启动hadoop
jps
cd /apps/hadoop/sbin
./start-all.sh
2.在Linux本地新建/data/sqoop2目录。
mkdir -p /data/sqoop2
切换到/data/sqoop2目录下,下载文件。
3.开启mysql服务。
sudo service mysql start
mysql -u root -p 123
4.在Mysql中创建数据库mydb,并使用mydb数据库。
create database mydb;
use mydb;
在mydb数据库中创建表record。
create table record
(
id varchar(100),
buyer_id varchar(100),
dt varchar(100),
ip varchar(100),
opt_type varchar(100)
);
5.将Linux本地/data/sqoop2/buyer_log里的内容,导入的mydb数据库record表中。
load data infile '/data/sqoop2/buyer_log' into table record fields terminated by '\t';
查看record表中内容。
select * from record;
6,另开一个窗口,使用Sqoop查看Mysql中的数据库。此步目的是检查Sqoop以及Mysql是否可以正常使用。
sqoop list-databases \
--connect jdbc:mysql://localhost:3306/ \
--username root \
--password 123
使用Sqoop查看Mysql中的表 (在jdbc连接字符串中添加了数据库的名称。用于直接访问数据库实例)。
sqoop list-tables \
--connect jdbc:mysql://localhost:3306/mydb \
--username root \
--password 123
使用Sqoop将Mysql中的数据导入到HDFS
1.使用Sqoop将Mysql中mydb数据库record表里的数据导入到HDFS/mysqoop2目录里。(HDFS上的/mysqoop2目录,不需要提前创建)。
1.sqoop import \
2.--connect jdbc:mysql://localhost:3306/mydb \
3.--username root \
4.--password strongs \
5.--table record -m 1 \
6.--target-dir /mysqoop2
导入过程:
1.zhangyu@d8690154f9f9:/$ sqoop import \
2.> --connect jdbc:mysql://localhost:3306/mydb \
3.> --username root \
4.> --password strongs \
5.> --table record -m 1 \
6.> --target-dir /mysqoop2
2.查看HDFS上/mysqoop2目录下的文件内容。
1.hadoop fs -cat /mysqoop2/part-m-00000
将HDFS中数据存入到Mysql数据库中
1.在Mysql窗口,mydb数据库下,新建一张表recordfromhdfs,表结构与record表相同。将HDFS上/mysqoop2/part-m-00000里的数据,导入到Mysql中的recordfromhdfs表中。
连接Mysql,并创建表recordfromhdfs。
1.use mydb
2.create table recordfromhdfs like record;
2.在另一个窗口,开始导数据。
1.sqoop export \
2.--connect jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8 \
3.--username root \
4.--password strongs \
5.--table recordfromhdfs \
6.--export-dir hdfs://localhost:9000/mysqoop2/part-m-00000
注意connect后面 连接字符串要带上编码方式characterEncoding=UTF-8,否则中文数据会有乱码的情况产生。
3.查看Mysql中recordfromhdfs表中内容:
select * from recordfromhdfs;
将Mysql中数据导入到HBase中
1.使用Sqoop将Mysql中mydb数据库record表中的数据,导入到HBase中hbaserecord表中,同时以dt为rowkey。
输入jps查看HBase相关进程是否已启动,若未启动,则需切换到/apps/hbase/bin目录下,启动HBase。
1.cd /apps/hbase/bin
2../start-hbase.sh
2.在Linux命令行中,输入hbase shell,进入HBase命令行模式。
hbase shell
3.开始导数据。
1.sqoop import \
2.–connect jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8 \
3.–username root \
4.–password strongs \
5.–table record \
6.–hbase-create-table \
7.–hbase-table hbaserecord \
8.–column-family mycf \
9.–hbase-row-key dt -m 1
4.查看HBase中,都有哪些表。
list
5.查看HBase表hbaserecord里的内容。
scan 'hbaserecord'
使用Sqoop将HBase中数据导出到Mysql中
暂时无法直接接口实现,需要借助其他途径去处理,比如:HBase=>HDFS=>Mysql或 HDFS=>Hive=>Mysql
使用Sqoop将Mysql中record表中的数据,导入到Hive中的hiverecord表中。
使用vim编辑用户环境变量
vim ~/.bashrc
将以下内容追加到#hadoop下:
1.#hadoop
2.export HADOOP_HOME=/apps/hadoop
3.export PATH=$HADOOP_HOME/bin:$PATH
4.export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/apps/hive/lib/*
执行source,使用户环境变量生效。
source /etc/profile
1.开启Hive,在Hive中创建hiverecord表,包含(id,buyer_id,dt,ip,opt_type)五个字段,字符类型均为varchar(100),分隔符为‘,’
hive
create table hiverecord (id varchar(100),buyer_id varchar(100),dt varchar(100), ip varchar(100), opt_type varchar(100))
row format delimited fields terminated by ',' stored as textfile;
在linux命令行下,使用Sqoop将Mysql中record表导入Hive中。
1.sqoop import \
2.--connect jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8 \
3.--username root \
4.--password strongs \
5.--table record \
6.--hive-import \
7.--hive-table hiverecord \
8.--fields-terminated-by ',' -m 1
在hive下,查看Hive中hiverecord表。
select * from hiverecord;
使用Sqoop将Hive表hiverecord表中的数据,导出到Mysql中的recordfromhive表中。
1.首先在Mysql中创建表recordfromhive。
create table recordfromhive like record;
2.在linux命令行下,使用sqoop开始导数据。
1.sqoop export \
2.--connect jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8 \
3.--username root \
4.--password strongs \
5.--table recordfromhive \
6.--export-dir /user/hive/warehouse/hiverecord/part-m-00000 \
7.--input-fields-terminated-by ','
3.导入完成,查看Mysql中recordfromhive表。
select * from recordfromhive;