开发者学堂课程【Sqoop 企业级大数据迁移方案实战:导入 Import--全量数据导入 Hdfs】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/718/detail/12834
导入 Import--全量数据导入 Hdfs
内容介绍:
一、Sqoop 导入
二、全量导入 mysql 表数据到 HDFS
一、Sqoop 导入
“导入工具”导入单个表从 RDBNS 到 HDFS.表中的每一行被视为 HDFS 的记录。所有记录都存储为文本文件的文本数据
下面的语法用于将数据导入 HDFS.
$ sqoop import (generic args) (import args)
Sqoop 测试表数据
在 mysql 中创建数据库 userdb,然后执行参考资料中的 sql 脚本:
创建三张表: emp 雇员表、emp_ add 雇员地址表、emp_ conn 雇员联系表。
首先需要明确一下所谓的导入,是从 RDBMS 导入到 HDFS,在导入的时候,使用的是 import,后面需要跟许多的参数,这些参数都可以想象得到,比如说从 Mysql 里面的一个表,导入到 HDFS 路径下,需要明确数据库的路径是哪里、用户名密码、哪一个库、哪一个表名,以及导出路径。这些相关的信息都是以参数的形式拼接在命令后面就可以,而且非常的固定,只需要针对于业务环境进行修改即可。
为了演示相关的导入操作,准备了一个 scoop 的操作数据,在参考资料下面,有一个 scoop test data,里面有一个userdb.sql 脚本,首先需要在 mysql 里面创建数据库 userdb,复制表名,使用工具来进行创建,打开 navicat,选择新建数据库。
创建好数据库以后,把刚才的脚本,运行一下,打开数据库以后在 userdb 单击右键运行 SQL 文件
点击开始,右键刷新以后,发现多了三个表,分别是 emp、emp_add 和,emp_conn,emp 是雇员信息表,包括姓名,部门,薪水,职位之类。第二个表是 emp_addz 是雇员联系地址表,包括住在哪个街道等信息。emp_conn 是联系信息表包括手机号、email 等等信息,根据以上三个表来进行简单操作。
二、全量导入 mysql 表数据到 HDFS
1.全量导入 mysql 表数据到 HDFS
下面的命令用于从 MySQL 数据库服务器中的 emp 表导入 HDFS.
bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--delete-target-dir \
--target-dir /sqoopresult \
--table emp -m 1
其中--target-dir 可以用来指定导出数据存放至 HDFS 的目录:
mysql jdbe url 请使用 ip 地址。
为了验证在 HDFS 导入的数据,请使用以下命令查看导入的数据: .
hdfs df's -cat /sqoopresult/ part- m000000
可以看出它会在 HDFS 上默认用逗号,分隔 emp 表的数据和字段。可以通过
- -fields-terminated-by '\t' 来指定分隔符。
首先需要解释一下全量数据,在进行大数据分析的时候,经常涉及到把某个表中的全部数据部分的数据导出来,所谓的全量数据,指的是从0开始到现在所有的数据都是全量,比如说今天导入数据以后过了一天,明天又进行导入,那么中间这一天增加的数据称为增量数据,所谓全量数据直白说,就是把表的全部数据都拿过来。需要有很多的参数去描述相关的关系,比如 mysql 的位置、用户名、密码,在哪一个表,路径是什么,这些就是她的导出命令。
使用 bin 下的 sqoop Import 进行导入,这是一个固定搭配,接下来指定相应的信息,首先是连接地址,用户密码,接下来导出的参数 target-dir,导出相应路径,如果 Sqoopresult 存在的话,就进行相应分组,如果在这路径当中,这参数之前被创建好了可能会出错,这参数可以根据需求可加可不加。后面--table emp 参数是指名表名,要把 Mysql 当中的表全量数据导出来,导出的是 emp 雇员信息表,后面的-m1当下先不解释,为了掩饰,不建议从讲义当中进行复制,因为复制下来可能会有格式的问题,把课程相关的内容,都放在了课程资料当中,打开课程资料,查看Sqoop 脚本,从上面来进行复制,避免一些格式问题。保证文档里面的相关用户名和本地环境保持一致。
复制代码到服务器上,在 Sqoop 根目录下执行,没有按回车的时候,并没有去执行。说明脚本还在等待确定,在执行这一步的时候,前提是要确保 Hadoop 已经成功启动,因为需要去运行 MR 程序,MR 程序进行资源调度管理,可以使用 jPS 进行验证,发现相关参数都已经正常启动。
在浏览器输入 node-1:8088/cluster,查看所有应用信息。可以看到,一个运行的程序名为 map reduce,刚才已经成功结束了,代码显示,最后成功收取了五条代码记录,看到这里,就是代表已经导出成功。
因为表中的数据正好就是五条,具体的正确与否需要去进行验证,刚才导出的路径是 sqoopresult,在资料当中是sqoopresult212,接下来去验证一下这路径,还是打开浏览器,通过页面访问,打开 hadoop 的 Browse Directory,发现 sqoopresult212文件已经存在了,首先一个0 B 大小的文件已经 success,这表是一个 MR 程序,他是一个成功的,下面就是文件 part-m-00000,m 说明 sqoop 在进行数据,导出导入的时候,这 MR 程序是一个特殊的 MR 程序,没有什么阶段,没有 reduce 阶段,只有 map 阶段,因为他进行数据导入导出的时候,不需要进行数据的集合,只要读一条记录,对方记录一条就可以,所以他只有 map 阶段。
所以刚才的--m 指的就是有几个 map 来运行,比如说表特别多,可以指定2或3及其以上。
接下来看一下数据,打开数据选择 download,下载到本地来进行一个验证,发现数据是一个非常标准的结构化数据,数据当中的一行记录,再导出以后还是一行的记录,默认的分隔符是逗号,以上就完成了数据从 MySQL 表到HDFS 指定路径当中。
这里有几个事项需要注意,第一个就是 mysql 地址,如果说 sqoop 和 MySQL 在同一台机子上,这里建议使用 IP 或者主机名,因为在操作中可能有不稳定的 bug,比如联系失败等等错误。另外,在指定目录的时候,如果有多余的内容要删除掉,最后一个问题是分隔符的问题,没有写的时候默认是一个逗号分隔符,是可以指定分隔符的,使用- -fields-terminated-by '\t' 就可以来指定分隔符,\t就是制表符。
接下来做一个相关的验证,比如说指定分隔符叫\t,把命令再复制一遍,把212更改为213,在导出的时候,加上- -fields-terminated-by '\t' 参数,复制命令来运行,运行完成以后,打开浏览器做验证来看一下,重新 download,发现分隔符就变成制表符了,接下来就可以根据业务来进行导出修改。