Sqoop数据导入导出(MySQL,HDFS,Hive,HBse)

系统环境

Linux Ubuntu 16.04

jdk-7u75-linux-x64

hive-1.1.0-cdh5.4.5

hadoop-2.6.0-cdh5.4.5

sqoop-1.4.5-cdh5.4.5

hbase-1.0.0-cdh5.4.5

mysql-5.7.24

相关知识

在导入开始之前,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子句,以此来限定需要导入的记录。

在这里插入图片描述

			(Sqoop数据导入原理图)

Sqoop导出功能的架构与其导入功能非常相似,在执行导出操作之前,Sqoop会根据数据库连接字符串来选择一个导出方法。一般为JDBC。然后,Sqoop会根据目标表的定义生成一个Java类。这个生成的类能够从文本文件中解析记录,并能够向表中插入合适类型的值。接着会启动一个MapReduce作业,从HDFS中读取源数据文件,使用生成的类解析记录,并且执行选定的导出方法。

在这里插入图片描述

			(Sqoop 数据导出原理图)

任务内容

1.练习使用Sqoop将数据在Mysql与HDFS之间的导入导出。

2.练习使用Sqoop将数据从Mysql中导入到HBase中。

3.练习使用Sqoop将数据在Mysql与Hive之间的导入导出。

任务步骤

现有buyer_log表,存储了买家行为日志,包含四个字段(ID,用户ID,时间,IP,操作类型)。

ID     用户ID       时间                    IP          操作类型
461    10181    2010-03-26 19:45:07    123.127.164.252    1
462    10262    2010-03-26 19:55:10    123.127.164.252    1
463    20001    2010-03-29 14:28:02    221.208.129.117    2
464    20001    2010-03-29 14:28:02    221.208.129.117    1
465    20002    2010-03-30 10:56:35    222.44.94.235    2
466    20002    2010-03-30 10:56:35    222.44.94.235    1
481    10181    2010-03-31 16:48:43    123.127.164.252    1
482    10181    2010-04-01 17:35:05    123.127.164.252    1
483    10181    2010-04-02 10:34:20    123.127.164.252    1
484    20001    2010-04-04 16:38:22    221.208.129.38    1

1.首先检查Hadoop相关进程,是否已经启动。若未启动,切换到/apps/hadoop/sbin目录下,启动Hadoop。

jps  
cd /apps/hadoop/sbin  
./start-all.sh  

在这里插入图片描述
2.在Linux本地新建/data/sqoop2目录。

mkdir -p /data/sqoop2  

切换到/data/sqoop2目录下,使用wget命令,下载http://192.168.1.100:60000/allfiles/sqoop2中的文件。

cd /data/sqoop2
wget http://192.168.1.100:60000/allfiles/sqoop2/buyer_log

在这里插入图片描述
3.开启mysql服务。(密码:zhangyu)

sudo service mysql start  

连接Mysql,用户名为root,密码为strongs。

 mysql -u root -p  

在这里插入图片描述
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 strongs

在这里插入图片描述
使用Sqoop查看Mysql中的表 (在jdbc连接字符串中添加了数据库的名称。用于直接访问数据库实例)。

sqoop list-tables \
--connect jdbc:mysql://localhost:3306/mydb \
--username root \
--password strongs

在这里插入图片描述

使用Sqoop将Mysql中的数据导入到HDFS

1.使用Sqoop将Mysql中mydb数据库record表里的数据导入到HDFS/mysqoop2目录里。(HDFS上的/mysqoop2目录,不需要提前创建)。

sqoop import \
--connect jdbc:mysql://localhost:3306/mydb \
--username root \
--password strongs \
--table record -m 1 \
--target-dir /mysqoop2

在这里插入图片描述
2.查看HDFS上/mysqoop2目录下的文件内容。

hadoop fs -cat /mysqoop2/part-m-00000 

在这里插入图片描述

将HDFS中数据存入到Mysql数据库中

1.在Mysql窗口,mydb数据库下,新建一张表recordfromhdfs,表结构与record表相同。将HDFS上/mysqoop2/part-m-00000里的数据,导入到Mysql中的recordfromhdfs表中。

连接Mysql,并创建表recordfromhdfs。

  use mydb  
    create table recordfromhdfs like record;  

在这里插入图片描述
2.在另一个窗口,开始导数据。

sqoop export \
--connect jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8 \
--username root \
--password strongs \
--table recordfromhdfs \
--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。

cd /apps/hbase/bin  
./start-hbase.sh  

2.在Linux命令行中,输入hbase shell,进入HBase命令行模式。

   hbase shell  

在这里插入图片描述
3.开始导数据

sqoop import \
--connect jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8 \
--username root \
--password strongs \
--table record \
--hbase-create-table \
--hbase-table hbaserecord \
--column-family mycf \
--hbase-row-key dt -m 1

在这里插入图片描述
4.查看HBase中,都有哪些表。
在这里插入图片描述
5.查看HBase表hbaserecord里的内容。
在这里插入图片描述
使用Sqoop将HBase中数据导出到Mysql中,暂时无法直接接口实现,需要借助其他途径去处理,比如:HBase=>HDFS=>Mysql或 HDFS=>Hive=>Mysql

使用Sqoop将Mysql中record表中的数据,导入到Hive中的hiverecord表中。

使用vim编辑用户环境变量

vim ~/.bashrc  

将以下内容追加到#hadoop下:

#hadoop
export HADOOP_HOME=/apps/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
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;

在这里插入图片描述
2.在linux命令行下,使用Sqoop将Mysql中record表导入Hive中。

sqoop import \
--connect jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8 \
--username root \
--password strongs \
--table record \
--hive-import \
--hive-table hiverecord \
--fields-terminated-by ',' -m 1

3.在hive下,查看Hive中hiverecord表。

select * from hiverecord;  

使用Sqoop将Hive表hiverecord表中的数据,导出到Mysql中的recordfromhive表中。

1.首先在Mysql中创建表recordfromhive。

   create table recordfromhive like record;  

在这里插入图片描述
2.在linux命令行下,使用sqoop开始导数据。

sqoop export \
--connect jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8 \
--username root \
--password strongs \
--table recordfromhive \
--export-dir /user/hive/warehouse/hiverecord/part-m-00000 \
--input-fields-terminated-by ','

3.导入完成,查看Mysql中recordfromhive表。

select * from recordfromhive;  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章