4.2 Sqoop数据导入导出(Hadoop3.0)

4.2 Sqoop数据导入导出(Hadoop3.0)

【实验目的】

1.掌握Sqoop的各种导入操作

2.掌握Sqoop的各种导出操作

【实验原理】

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

https://adminmanage.ipieuvre.com/cs/doc/3/161/exper/31704857109108894198563/img/01.png

(Sqoop数据导入原理图)

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

https://adminmanage.ipieuvre.com/cs/doc/3/161/exper/31704857109108894198563/img/02.png

(Sqoop 数据导出原理图)

【实验环境】

AnolisOS8.8

Java 1.8.0

Hadoop-3.0.0

Eclipse-JEE 2022.03

mysql-8.0.26

Pycharm

sqoop-1.4.5-cdh5.4.5

【实验内容】

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

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

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

【实验步骤】

切换到vmuser用户(密码vm123456)

现有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。

cd /apps/hadoop/sbin

./start-all.sh

使用jps查看启动的进程

2.在Linux本地新建/data/sqoop2目录。

mkdir -p /data/sqoop2

sudo chown -R vmuser:vmuser /data/sqoop2

切换到/data/sqoop2目录下,使用wget命令,下载文件。

cd /data/sqoop2

wget http://sqoop2/buyer_log

3.开启mysql服务。

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

mysql -h localhost -P 3306 -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)

);

查看secure_file_priv参数,发现secure_file_priv=”具体文件路径“ ,只允许从这个路径导入导出,改成secure_file_priv=空,就可以从任意路径导入导出

show variables like '%secure_file_priv%';

从上面的输出中可以看出,–secure-file-priv默认开启了,并设置为/var/lib/mysql-files/,这样我们就知道我们应该将数据文件放在哪个目录中。

From

https://deepinout.com/mysql/mysql-questions/87_mysql_how_should_i_resolve_securefilepriv_in_mysql.html

以下部分可以不做修改

配置secure_file_priv,实现mysql任意文件读写,【Ctrl+z】退出mysql

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

在文件的[mysqld]下面添加secure_file_priv=即可

https://blog.csdn.net/qq_578978992/article/details/122218315

1通过which mysqld 命令查看mysql的安装位置

2 通过 /usr/sbin/mysqld --verbose --help |grep -A 1 'Default options' 命令查看mysql使用的配置文件默认路径,其中 /usr/sbin/mysqld 是第一步中获取到mysql的安装路径。

3 在该配置文件中查找并编辑 [mysqld] 部分。如果没有这个部分,则添加以下内容:

[mysqld]

secure-file-priv=""

skip-grant-tables

4 保存更改后重新启动 MySQL 服务器,使其生效。

systemctl restart mysqld

5 确认 secure_file_priv 已经被成功地设置为了空值。可以使用以下命令来验证:

SHOW VARIABLES LIKE 'secure_file_priv';

5.使用mydb数据库,将Linux本地/data/sqoop2/buyer_log里的内容,导入的mydb数据库record表中。

use mydb;

load data infile '/data/sqoop2/buyer_log' into table record fields terminated by '\t';

查看record表中内容。

select * from record;

6,另开一个窗口,在新窗口切换到vmuser用户(密码vm123456)

进入到/data/sqoop2目录下

cd /data/sqoop2

使用Sqoop查看Mysql中的数据库。此步目的是检查Sqoop以及Mysql是否可以正常使用。

sqoop list-databases \

--connect jdbc:mysql://localhost:3306/ \

--username root \

--password strongs

关于Sqoop的命令参数详细介绍:

可参考官网:Sqoop官网

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

sqoop list-tables \

--connect jdbc:mysql://localhost:3306/mydb \

--username root \

--password strongs

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

权限设置

sudo chown -R vmuser:vmuser /apps/sqoop/bin/

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

<如果数据导入不成功,可以考虑 buyer_log 拷贝到/var/lib/mysql-files/ >

sqoop import \

--connect jdbc:mysql://localhost:3306/mydb \

--username root \

--password strongs \

--table record -m 1 \

--target-dir /mysqoop2 \

--bindir ./

部分导入过程:

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 \

--bindir ./

-m 2

注意connect后面 连接字符串要带上编码方式characterEncoding=UTF-8,否则中文数据会有乱码的情况产生。

3.查看Mysql中recordfromhdfs表中内容:

select * from recordfromhdfs;

至此,实验结束!

posted @ 2024-06-05 10:41  jhtchina  阅读(66)  评论(0编辑  收藏  举报