【头歌】Sqoop数据导入 - 详解

玛卡巴卡的卡巴卡玛  金牌会员 | 2024-6-19 04:46:38 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 527|帖子 527|积分 1581

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

第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-uri>指定JDBC连接字符串--driver <class-name>指定要利用的JDBC驱动程序类--hadoop-mapred-home <dir>指定$HADOOP_MAPRED_HOME路径-P从控制台读取输入的暗码--username <username>设置认证用户名--password <password>设置认证暗码--verbose打印详细的运行信息--as-textfile将数据导入到平常文本文件(默认)--delete-target-dir如果指定目次存在,则先删撤除--direct利用直接导入模式(优化导入速度)--num-mappers <n>(简写:-m)利用n个map使命并行导入数据--query <statement>(简写:-e)导入的查询语句--split-by <column-name>指定按照哪个列去分割数据--table<table-name>导入的源表表名--target-dir <dir>导入HDFS的目的路径--warehouse-dir <dir>HDFS存放表的根路径 配置环境
留意:如果这个环境不配置的话,可能会造成后续关卡不能正常实现。 1、启动Hadoop。
  1. start-all.sh
复制代码

2、Hive 连接 MySQL 初始化。
  1. schematool -dbType mysql -initSchema
复制代码

编程要求

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

完成操纵后点击评测,通关后测试集输出:
  1. Hadoop平台已开启
  2. default
复制代码
参考答案

  1. #以下为命令行
  2. start-all.sh
  3. schematool -dbType mysql -initSchema
复制代码

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

使命描述

本关使命:利用 Sqoop 工具将 MySQL 中的数据导入到 HDFS 中来。
干系知识

为了完成本关使命,你须要掌握:
1、数据库( MySQL )建表。
2、Mysql 数据导入至 HDFS 中。
数据库( MySQL )建表
用命令进入 MySQL 客户端。
  1. mysql -uroot -p123123 -h127.0.0.1
复制代码

创建数据库hdfsdb(格式默认为utf8),并在数据库内建立表student,其表结构如下:
名类状态stu_noint主键stu_namevarchar(20)学生姓名stu_ageint学生年龄 在表内插入数据。
stu_nostu_namestu_age202001zhangsan18202002lisi19202003wangwu20 查抄是否成功。

MySQL数据导入至HDFS中
1、简单导入。
  1. sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student
复制代码
这里没有指定 HDFS 的目次 默认会将数据存到系统当前登任命户下 以表名称命名的文件夹下。

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

留意:如果数据库没有设置主键,语法须要加上--split by指定一个列去分割或用-m 1指定一个 Map 使命。
2、指定 HDFS 目次/user/root/hdfsdb导入,指定一个 MapReduce 使命。
  1. 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 使命。 

3、指定查询学生的学号与学生姓名存入到/user/root/hdfsdb2中,指定一个MapReduce 使命,并以|分隔。
  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
复制代码


  • --query:通过用 sql 语句来将数据导入,where $CONDITIONS是query中固定语法,不可删去。
  • --fields-terminated-by:数据通过什么来隔开。

编程要求

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


  • 指定 HDFS 目次/user/root/hdfsdb3
  • 查询学生姓名与年龄。
  • 指定一个 Mapreduce 使命。
  • 存储以-来分割。
测试说明

点击测评,当你的结果与预期输出一致时,即为通过。
  1. zhangsan-18
  2. lisi-19
  3. wangwu-20
复制代码
参考答案 

  1. #以下为命令行内容
  2. mysql -uroot -p123123 -h127.0.0.1
复制代码
  1. #以下为MySQL内容
  2. #创建hdfsdb数据库
  3. create database hdfsdb;
  4. #切换hdfsdb数据库
  5. use hdfsdb;
  6. #创建student表
  7. create table student(stu_no int primary key,stu_name varchar(20),stu_age int);
  8. #插入三条数据
  9. insert into `student` values(202001,'zhangsan',18);
  10. insert into `student` values(202002,'lisi',19);
  11. insert into `student` values(202003,'wangwu',20);
  12. exit;
复制代码
  1. #以下为命令行内容
  2. #MySQL数据导入至HDFS中-简单导入
  3. sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student
  4. #指定 HDFS 目录/user/root/hdfsdb导入,指定一个 MapReduce 任务
  5. sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student --target-dir /user/root/hdfsdb -m 1
  6. #指定查询学生的学号与学生姓名存入到/user/root/hdfsdb2中,指定一个MapReduce任务,并以“|”分隔
  7. 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
  8. #编程实现内容
  9. 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、直接导入。 我们可以利用上一关的数据库,如果没有的话,须要重新创建。
  1. 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包,我们在 Hive 的lib目次下,拷贝到 Sqoop 的lib目次下即可。
  1. 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:如果输出文件存在,则先删除。
  1. 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来查察是否成功传输。

2、通过传输至HDFS上,Hive再从HDFS导入数据。 MySQL数据导入至Hive。
  1. sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student -m 1
复制代码
Hive依据格式建表。
  1. hive> create table test1(
  2. > stu_no int,stu_name string,stu_age int)
  3. > row format delimited
  4. > fields terminated by ",";
复制代码
从HDFS导入数据。
  1. load data inpath '/user/root/student/part-m-00000' into table test1;
复制代码

查察是否成功。
编程要求

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


  • 指定一个Mapreduce使命。
  • 指定分隔符为,。
测试说明

点击测评,当你的结果与预期输出一致时,即为通过。 
  1. 202003,wangwu,20
复制代码
参考答案

  1. ##确认没有重置命令行,没有超时清空,上一关的数据库还在##如果重置过命令行,请先按次序重做以下注释内容(粘贴到本地代码编辑器以VSCode为例,将BEGIN到END内容复制到本地编辑器,快捷键Ctrl+/取消一层注释):##----------------BEGIN----------------## 命令行#start-all.sh#schematool -dbType mysql -initSchema
  2. #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 数据导入至Hivesqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student  --hive-import  -m1  --hive-table test
  3. #报错缺少了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/
  4. #再次实行导入(前次实行的若存在先删除)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
  5. #成功之后我们可以通过hive来查察是否成功转输hive
复制代码
  1. --以下为hive
  2. --查看表
  3. show tables;
  4. --出现上一关的数据则成功导入
  5. select * from test;
  6. exit;
复制代码
  1. #以下为命令行#通过传输至HDFS上,Hive再从HDFS导入数据sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student -m 1
  2. hive
复制代码
  1. --以下为hivecreate table test1(stu_no int,stu_name string,stu_age int)row format delimitedfields terminated by ",";--从HDFS导入数据load data inpath '/user/root/student/part-m-00000' into table test1;
  2. --查察是否成功select * from test1;--编程要求#将学生年龄大于20的学生信息放入Hive表test2中,要求如下:----指定一个Mapreduce使命。----指定分隔符为‘,’。--创建test2表create table test2(stu_no int,stu_name string,stu_age int)row format delimitedfields terminated by ",";exit;
复制代码
  1. #以下为命令行
  2. 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
  3. hive
复制代码
  1. --以下为hive
  2. load data inpath '/user/root/hdfsdb6/part-m-00000' into table test2;
复制代码

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表