数据导出/迁移的概念
在做数据导出之前,我们看一下已经完成的操作:数据分析阶段将指标统计完成,也将统计完成的指标放到Hive数据表中,并且指标数据存储到HDFS分布式文件存储系统。
指标统计完成之后,我们最终是想将我们的指标数据做成可视化大屏进行展示,Hive中的数据无法、很难直接连接到JavaWeb或者EE技术直接进行数据展示。 因此我们需要将Hive中统计出来的数据指标表迁移到我们的MySQL数据库中,由MySQL数据库连接web技术进行可视化展示。
Hive数仓指标表的数据都存储在HDFS分布式文件存储系统,如果想要将Hive的数据导出,有以下几种导出方式:
(1)使用insert命令导出数据到一个目录
(2)HDFS的相关命令:hdfs dfs -get/-move/-copyToLocalFile,将Hive数仓的数据导出到本地的文件中
(3)hive -e 和重定向 >> 命令将数据导出到一个文件中
(4)使用hive自带的export命令导出数据到一个文件夹中(主要做数据仓库的迁移 )
(5)第三方软件技术sqoop技术实现数据迁移,实现将Hive数仓中的数据迁移到MySQL中
数据迁移技术SQOOP
一、SQOOP技术的相关概念
(1) sqoop技术也是apache的顶尖项目,主要是做数据迁移的。
(2)sqoop是将数据在Hadoop和关系型数据库之间的数据传递,基于MapReduce完成。核心是对MR程序的InputFormat和OutputFormat进行定制。
(3)sqoop也是使用命令进行数据的导入和导出的,只不过底层也是会翻译成为MR程序执行。
二、sqoop中两个核心概念
导入:将关系型数据库表数据(比如MySQL)中表数据导入到大数据集群(比如Hive、HBase、HDFS)
导出:将大数据集群的数据(Hive、HBase、HDFS数据)导出到非大数据集群的关系型数据库,比如MySQL
三、SQOOP的安装
sqoop软件是基于Java和Hadoop的,所以必须先把Java和Hadoop软件配置好。
1、首先下载上传解压sqoop、再配置sqoop的相关配置文件。
配置的sqoop配置文件是sqoop-env.sh,重点需要配置Hadoop的相关依赖环境:
export HADOOP_COMMON_HOME=/opt/module/hadoop-2.8.5
export HADOOP_MAPRED_HOME=/opt/module/hadoop-2.8.5
export HIVE_HOME=/opt/module/hive-2.3.8
sqoop可以实现将Hive、HBase中表数据导出到MySQL数据库中,需要sqoop具备连接MySQL的条件——mysql-connector-java-xxxx.jar(需要把此jar包放在sqoop下)
cp /opt/module/hive-2.3.8/lib/mysql-connector-java-5.1.27.jar /opt/module/sqoop-1.4.7/lib/
2、配置sqoop的环境变量(vim /etc/profile)
四、SQOOP的使用
1、检测sqoop是否安装成功
sqoop help
sqoop version
sqoop可以用来查看某个数据库管理系统中有哪些数据库存在
2、sqoop查看MySQL数据库中有哪些数据库存在
sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password root
list-databases代表查看所有数据库,connect代表连接哪个数据库,username代表连接数据库的用户名,password代表连接数据库密码。
这个命令执行成功的前提条件是:你已经将对应数据库的驱动jar包放到了sqoop的lib目录下。
五、sqoop实现将MySQL数据导入到Hive数据仓库
【注意】需要将hive的相关jar包放到sqoop环境下
cp /opt/module/hive-2.3.8/lib/hive-common-2.3.8.jar /opt/module/sqoop-1.4.7/lib/
将MySQL中test数据库下的test表数据导入到Hive数据仓库中。
sqoop import #导入
--connect jdbc:mysql://localhost:3306/test # 连接MySQL的那个数据库
--username root #连接MySQL的用户名
--password root #连接MySQL的密码
--table test # 指定MySQL要向Hive数据仓库导入当前数据下那张数据表的数据
--num-mappers 1 # 将导入任务转成MR程序运行 需要一个Map任务
--hive-import # 将数据导入到hive数仓
--fields-terminated-by "\t" #指定hive数仓导入完成之后表字段之间分隔符
--hive-overwrite # 表中有数据 覆盖写
--hive-table 数据库名.表名 # 导入到Hive的那个表中 表可以不存在 会自动创建
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table test --num-mappers 1 --hive-import --fields-terminated-by "\t" --hive-overwrite --hive-table 数据库名.表名
将MySQL表中数据导入到Hive数仓的时候,hive数据仓库中表可以不用提前存在,会自动创建。
六、sqoop实现将Hive/HDFS数据导入到MySQL数据表中
sqoop的导入分为:将数据导入到HDFS和将数据导入到Hive数仓,或者其他。每种导入方式不一样。
sqoop的导出只有一种命令,就是将Hive/HDFS数据导出到Mysql中。因为hive存储的表数据也在HDFS上存储着,所以HDFS的导出和Hive的导出命令一致的。
案例:实现项目功能,将age_pvs的数据导出到MySQL数据库中。
将MySQL数据导入到hive表中,hive表可以不用提前存在,但是如果要将Hive数据表的数据导入到MySQL中,那么MySQL中对应的表必须提前存在,并且和hive表结构保持一致。
导出命令:
sqoop export # 导出数据
--connect jdbc:mysql://localhost:3306/project #连接MySQL数据库
--username root #连接用户名
--password 123456 #连接密码
--table staff # 导入到MySQL的那张表中
--num-mappers 1 #转成一个MR任务运行
--export-dir /user/hive/warehouse/staff_hive #hive数据表数据在HDFS上对应的路径
--input-fields-terminated-by "\t" #hive表字段和字段之间的分隔符
sqoop的另外一种导出方式:
vim一个xxx.opt文件,然后将sqoop导出命令放到文件中。注意:sqoop关键字需要删除、而且参数和参数值需要分行写
使用 sqoop --options-file xxx.opt
sqoop实现数据迁移(导入、导出)主要是将迁移操作转换成为MR程序去运行,在表现形式上,就是将MR程序的InputFormat和OutputFormat进行重写或者自定义。