【头歌】Sqoop数据导入 - 详解
作者:mmseoamin日期:2023-12-21

【提示】点击目录每一关参考答案可以快速复制。

目录

第1关:Sqoop数据导入语法学习

任务描述

相关知识

编程要求

测试说明

参考答案

第2关:Mysql导入数据至HDFS上

任务描述

相关知识

编程要求

测试说明

参考答案 

第3关:Mysql导入数据至Hive中

任务描述

相关知识

编程要求

测试说明

参考答案


第1关:Sqoop数据导入语法学习

任务描述

本关任务:学习Sqoop 导入( import )的基本参数并配置好环境。

相关知识

为了完成本关任务,你需要掌握: 1、Sqoop 导入( import )的基本参数。 2、配置环境。 注意:本关实训 Sqoop 的安装与配置建立在 Hadoop 、 Hive 、 MySQL 已安装配置好的情况下。

Sqoop 的基本参数

Sqoop 能够让 Hadoop 上的 HDFS 和 Hive 跟关系型数据库之间进行数据导入与导出,多亏了import和export这两个工具。本实训主要是针对import(导入)来讲。 现如今我们一直储放数据都是在关系数据库中,但是数据量到达一定的规模后,我们需要数据清理加分析,如果使用关系数据库我们工作量会大大提高,这个时候我们就可以将数据从关系数据库导入(import)到Hadoop平台上进行处理。

我们要学 Sqoop 的导入也必须先知道里面的基本参数。

输入sqoop help import可以查看里面参数含义,但是是英文,接下来选取几个常见的参数来分析:

选项含义说明
--connect 指定JDBC连接字符串
--driver 指定要使用的JDBC驱动程序类
--hadoop-mapred-home 指定$HADOOP_MAPRED_HOME路径
-P从控制台读取输入的密码
--username 设置认证用户名
--password 设置认证密码
--verbose打印详细的运行信息
--as-textfile将数据导入到普通文本文件(默认)
--delete-target-dir如果指定目录存在,则先删除掉
--direct使用直接导入模式(优化导入速度)
--num-mappers (简写:-m)使用n个map任务并行导入数据
--query (简写:-e)导入的查询语句
--split-by 指定按照哪个列去分割数据
--table导入的源表表名
--target-dir 导入HDFS的目标路径
--warehouse-dir HDFS存放表的根路径

配置环境

注意:如果这个环境不配置的话,可能会造成后续关卡不能正常实现。 1、启动Hadoop。

start-all.sh

【头歌】Sqoop数据导入 - 详解,第1张

2、Hive 连接 MySQL 初始化。

schematool -dbType mysql -initSchema

【头歌】Sqoop数据导入 - 详解,第2张

编程要求

在右侧命令行进行操作: 1.启动Hadoop服务; 2.Hive 连接 MySQL 初始化。

测试说明

完成操作后点击评测,通关后测试集输出:

Hadoop平台已开启
default

参考答案

#以下为命令行
start-all.sh
schematool -dbType mysql -initSchema

第2关:Mysql导入数据至HDFS上

任务描述

本关任务:利用 Sqoop 工具将 MySQL 中的数据导入到 HDFS 中来。

相关知识

为了完成本关任务,你需要掌握:

1、数据库( MySQL )建表。

2、Mysql 数据导入至 HDFS 中。

数据库( MySQL )建表

用命令进入 MySQL 客户端。

mysql -uroot -p123123 -h127.0.0.1

【头歌】Sqoop数据导入 - 详解,第3张

创建数据库hdfsdb(格式默认为utf8),并在数据库内建立表student,其表结构如下:

状态
stu_noint主键
stu_namevarchar(20)学生姓名
stu_ageint学生年龄

在表内插入数据。

stu_nostu_namestu_age
202001zhangsan18
202002lisi19
202003wangwu20

检查是否成功。

【头歌】Sqoop数据导入 - 详解,第4张

MySQL数据导入至HDFS中

1、简单导入。

sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student

这里没有指定 HDFS 的目录 默认会将数据存到系统当前登录用户下 以表名称命名的文件夹下。

【头歌】Sqoop数据导入 - 详解,第5张

系统默认为逗号隔开,如下图:

【头歌】Sqoop数据导入 - 详解,第6张

注意:如果数据库没有设置主键,语法需要加上--split by指定一个列去分割或用-m 1指定一个 Map 任务。

2、指定 HDFS 目录/user/root/hdfsdb导入,指定一个 MapReduce 任务。

sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --usernameroot --password 123123 --table student --target-dir /user/root/hdfsdb -m 1
  • --target-dir:指定 HDFS 目录。
  • -m 1:指定一个 MapReduce 任务。 

    【头歌】Sqoop数据导入 - 详解,第7张

    3、指定查询学生的学号与学生姓名存入到/user/root/hdfsdb2中,指定一个MapReduce 任务,并以|分隔。

    sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --query 'select stu_no, stu_name from student where $CONDITIONS' --target-dir /user/root/hdfsdb2 --fields-terminated-by '|' -m 1
    • --query:通过用 sql 语句来将数据导入,where $CONDITIONS是query中固定语法,不可删去。
    • --fields-terminated-by:数据通过什么来隔开。

      【头歌】Sqoop数据导入 - 详解,第8张

      编程要求

      根据上述,将 MySQL 数据库hdfsdb中的表数据导入至HDFS中,要求如下:

      • 指定 HDFS 目录/user/root/hdfsdb3。
      • 查询学生姓名与年龄。
      • 指定一个 Mapreduce 任务。
      • 存储以-来分割。

        测试说明

        点击测评,当你的结果与预期输出一致时,即为通过。

        zhangsan-18
        lisi-19
        wangwu-20

        参考答案 

        #以下为命令行内容
        mysql -uroot -p123123 -h127.0.0.1
        
        #以下为MySQL内容
        #创建hdfsdb数据库
        create database hdfsdb;
        #切换hdfsdb数据库
        use hdfsdb;
        #创建student表
        create table student(stu_no int primary key,stu_name varchar(20),stu_age int);
        #插入三条数据
        insert into `student` values(202001,'zhangsan',18);
        insert into `student` values(202002,'lisi',19);
        insert into `student` values(202003,'wangwu',20);
        exit;
        #以下为命令行内容
        #MySQL数据导入至HDFS中-简单导入
        sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student
        #指定 HDFS 目录/user/root/hdfsdb导入,指定一个 MapReduce 任务
        sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student --target-dir /user/root/hdfsdb -m 1
        #指定查询学生的学号与学生姓名存入到/user/root/hdfsdb2中,指定一个MapReduce任务,并以“|”分隔
        sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --query 'select stu_no, stu_name from student where $CONDITIONS' --target-dir /user/root/hdfsdb2  --fields-terminated-by '|' -m 1
        #编程实现内容
        sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --query 'select stu_name,stu_age from student where $CONDITIONS' --target-dir /user/root/hdfsdb3  --fields-terminated-by '-' -m 1
        

        第3关:Mysql导入数据至Hive中

        任务描述

        本关任务:利用 Sqoop 工具将 MySQL 中的数据导入到 Hive 中来。

        相关知识

        为了完成本关任务,你需要掌握:MySQL 数据导入至 Hive 中。

        MySQL 数据导入至Hive

        1、直接导入。 我们可以使用上一关的数据库,如果没有的话,需要重新创建。

        sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student  --hive-import  -m1  --hive-table test
        

        这里会发生一个报错,如图:

        【头歌】Sqoop数据导入 - 详解,第9张

        解决方法 这里缺少了hive-common-3.1.0.jar包,我们在 Hive 的lib目录下,拷贝到 Sqoop 的lib目录下即可。

        cp /opt/hive/lib/hive-common-3.1.0.jar /opt/sqoop-1.4.7.bin__hadoop-2.6.0/lib/
        

        这边输出文件经过上次已经创建好了,所以我们要不自己手动删除,要不用sqoop参数: --delete-target-dir:如果输出文件存在,则先删除。

        sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student  --hive-import --delete-target-dir  -m1  --hive-table test
        

        成功之后我们可以通过hive来查看是否成功传输。

        【头歌】Sqoop数据导入 - 详解,第10张

        2、通过传输至HDFS上,Hive再从HDFS导入数据。 MySQL数据导入至Hive。

        sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student -m 1
        

        Hive依据格式建表。

        hive> create table test1(
        > stu_no int,stu_name string,stu_age int)
        > row format delimited
        > fields terminated by ",";

        从HDFS导入数据。

        load data inpath '/user/root/student/part-m-00000' into table test1;
        

        【头歌】Sqoop数据导入 - 详解,第11张

        查看是否成功。

        编程要求

        将学生年龄大于20的学生信息放入Hive表test2中,要求如下:

        • 指定一个Mapreduce任务。
        • 指定分隔符为,。

          测试说明

          点击测评,当你的结果与预期输出一致时,即为通过。 

          202003,wangwu,20

          参考答案

          ##确认没有重置命令行,没有超时清空,上一关的数据库还在
          ##如果重置过命令行,请先按顺序重做以下注释内容(粘贴到本地代码编辑器以VSCode为例,将BEGIN到END内容复制到本地编辑器,快捷键Ctrl+/取消一层注释):
          ##----------------BEGIN----------------
          ## 命令行
          #start-all.sh
          #schematool -dbType mysql -initSchema
          #mysql -uroot -p123123 -h127.0.0.1
          ## MYSQL
          #create database hdfsdb;
          #use hdfsdb;
          #create table student(stu_no int primary key,stu_name varchar(20),stu_age int);
          #insert into `student` values(202001,'zhangsan',18);
          #insert into `student` values(202002,'lisi',19);
          #insert into `student` values(202003,'wangwu',20);
          #exit;
          ## 命令行
          #sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student
          #sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student --target-dir /user/root/hdfsdb -m 1
          #sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --query 'select stu_no, stu_name from student where $CONDITIONS' --target-dir /user/root/hdfsdb2  --fields-terminated-by '|' -m 1
          #sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --query 'select stu_name,stu_age from student where $CONDITIONS' --target-dir /user/root/hdfsdb3  --fields-terminated-by '-' -m 1
          ##-----------------END-----------------
          #以下为命令行
          #MySQL 数据导入至Hive
          sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student  --hive-import  -m1  --hive-table test
          #报错缺少了hive-common-3.1.0.jar包,复制到 Sqoop 的lib目录下
          cp /opt/hive/lib/hive-common-3.1.0.jar /opt/sqoop-1.4.7.bin__hadoop-2.6.0/lib/
          #再次执行导入(上次执行的若存在先删除)
          sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student  --hive-import --delete-target-dir  -m1  --hive-table test
          #成功之后我们可以通过hive来查看是否成功转输
          hive
          --以下为hive
          --查看表
          show tables;
          --出现上一关的数据则成功导入
          select * from test;
          exit;
          #以下为命令行
          #通过传输至HDFS上,Hive再从HDFS导入数据
          sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student -m 1
          hive
          --以下为hive
          create table test1(
          stu_no int,stu_name string,stu_age int)
          row format delimited
          fields terminated by ",";
          --从HDFS导入数据
          load data inpath '/user/root/student/part-m-00000' into table test1;
          --查看是否成功
          select * from test1;
          --编程要求
          #将学生年龄大于20的学生信息放入Hive表test2中,要求如下:
          ----指定一个Mapreduce任务。
          ----指定分隔符为‘,’。
          --创建test2表
          create table test2(
          stu_no int,stu_name string,stu_age int)
          row format delimited
          fields terminated by ",";
          exit;
           
          
          #以下为命令行
          sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --query 'select stu_no, stu_name,stu_age from student where stu_age>=20 and $CONDITIONS' --target-dir /user/root/hdfsdb6   --fields-terminated-by ',' -m 1
          hive
          --以下为hive
          load data inpath '/user/root/hdfsdb6/part-m-00000' into table test2;

          至此,所有内容都完成辣。如果存在任何问题欢迎大佬指教🥰!