当前位置: 主页 > 数据库

mysql将数导入数据库-mysql 数据导入

发布时间:2023-02-08 22:23   浏览次数:次   作者:佚名

数据库通常是Hadoop数据输出的目标之一,企业通常会将数据移回生产数据库供生产系统消费,或者将数据移至OLAP数据库以实现商业智能和分析功能。

(注:本文为大型专题《Hadoop从入门到精通》的第五章,本专题其他文章见文末链接,本专题前半部分还将与您在不久的将来。请继续关注本主题!)

5.3.3 数据库

在本节中,我们将使用 Apache Sqoop 将数据从 Hadoop 导出到 MySQL 数据库。 Sqoop是一个简单的数据库导入导出工具。 我们将介绍从HDFS导出数据到Sqoop的过程。 我们还将介绍如何使用常规连接器,以及如何使用快速连接器执行批量导入。

实践:使用Sqoop导出数据到MySQL

Hadoop 擅长与大多数关系数据库一起工作,因此通常将 OLTP 数据提取到 HDFS 中,执行一些分析,然后将其导出回数据库。

问题

希望将数据写入关系数据库,同时确保写入是幂​​等的。

解决方案

此技术描述了如何使用 Sqoop 将文本文件导出到关系数据库,还描述了如何配置 Sqoop 以使用带有自定义字段和记录分隔符的文件。 我们还将介绍幂等导出,以确保失败的导出不会使数据库处于不一致状态。

讨论

此技术假定已经安装了 MySQL 并创建了模式。

Sqoop导出需要导出的数据库表已经存在,Sqoop可以支持表中行的插入和更新。

将数据导出到数据库共享

我们在导入部分检查的很多参数,不同的是导出需要--export-dir参数来确定导出的HDFS目录,并且还会创建另一个用于导出的选项文件,以防止不安全地提供密码:

mysql 导入mysqldump数据_mysql将数导入数据库_mysql 数据导入

第一步是将数据从 MySQL 导出到 HDFS 以确保一个好的起点,如以下命令所示:

mysql 导入mysqldump数据_mysql 数据导入_mysql将数导入数据库

Sqoop导入的结果是在HDFS中有很多CSV文件,可以在下面的代码中看到:

mysql 数据导入_mysql 导入mysqldump数据_mysql将数导入数据库

Sqoop从HDFS导出到MySQL,会指定目标表为stocks_export,数据从HDFS stock目录导出:

mysql 数据导入_mysql将数导入数据库_mysql 导入mysqldump数据

默认情况下,Sqoop export 将在目标数据库表上执行 INSERT,可以使用 --update-mode 参数支持更新。 updateonly 的值意味着如果没有匹配的键,更新将失败。 如果不存在匹配的键,则直接插入 allowInsert 的值。 用于执行更新的表列名称在 --update-key 参数中提供。

以下示例显示仅应尝试使用主键进行更新:

mysql 导入mysqldump数据_mysql 数据导入_mysql将数导入数据库

输入数据格式

可以使用表 5.7 中列出的几个选项来覆盖用于解析输入数据的默认 Sqoop 设置。

mysql 数据导入_mysql 导入mysqldump数据_mysql将数导入数据库

表 5.7 输入数据的格式选项

幂等输出

执行输出的 Sqoop 映射任务使用多个事务进行数据库写入。 如果 Sqoop 导出 MapReduce 作业失败,表可能包含部分写入。 对于幂等数据库写入,可以指示 Sqoop 对临时表执行 MapReduce 写入。 作业成功完成后,临时表将在单个事务中移动到目标表,这是幂等的,事件顺序如图 5.19 所示。

mysql 数据导入_mysql将数导入数据库_mysql 导入mysqldump数据

图 5.19 Sqoop 事件的分段序列,有助于确保幂等输出

在下面的示例中,暂存表是 stocks_staging,并且 Sqoop 还被告知在使用 --clear-staging-table 参数启动 MapReduce 作业之前清除它:

mysql将数导入数据库_mysql 数据导入_mysql 导入mysqldump数据

直接输出

在导入技术中使用快速连接器,这是对使用 mysqldump 实用程序的优化。 Sqoop 导出还支持使用 mysqlimport 工具的快速连接器。 与 mysqldump 一样,集群中的所有节点都需要安装 mysqlimport 并在用于运行 MapReduce 作业的用户路径中可用。 与导入一样,-diand 参数可以使用快速连接器:

mysql 数据导入_mysql将数导入数据库_mysql 导入mysqldump数据

使用 mysqlimport 进行幂等输出

Sqoop 不支持对临时表使用快速连接器mysql将数导入数据库,这就是使用常规连接器实现幂等输入的方式。 但是仍然可以通过快速连接器实现幂等输入,最后需要做一些额外的工作。 需要使用快速连接器写入临时表,然后触发INSERT语句,以原子方式将数据复制到目标表mysql将数导入数据库,步骤如下:

mysql将数导入数据库_mysql 导入mysqldump数据_mysql 数据导入

这打破了早先关于在命令行上公开凭据的规则,但是很容易编写可以从配置文件中读取这些设置的脚本。

总结

与使用 MapReduce 中提供的 DBInputFormat 格式类相比,Sqoop 提供了一种简化的使用模型。 但是,使用 DBInputFormat 类将提供额外的灵活性,以便在执行数据库导出的同一 MapReduce 作业中转换或预处理数据。 Sqoop 的优点是你不需要写任何代码,而且有一些有用的概念,比如分段,可以帮助实现幂等性。

5.3.4 非数据库

MapReduce 是一种将数据批量加载到外部系统的强大而高效的方法。 到目前为止,我们已经介绍了如何使用 Sqoop 加载关系数据,现在我们将看看 NoSQL 系统,特别是 HBase。

Apache HBase 是一种分布式键/值、面向列的数据存储。 在本章的前半部分,我们了解了如何将数据从 HBase 导入 HDFS,以及如何使用 HBase 作为 MapReduce 作业的数据源。 将数据加载到 HBase 中最有效的方法是通过其内置的批量加载机制,但这种方法绕过了预写日志 (WAL),这意味着正在加载的数据不会复制到从 HBase 节点。

HBase 还附带一个 org.apache.hadoop.hbase.mapreduce.Export 类,它将从 HDFS 加载 HBase 表,类似于本章前面的幂等导出工作原理。 但是,我们必须以SequenceFile的形式提供数据,它有缺点,包括不支持版本控制,你可以在自己的MapReduce作业中使用TableOutputFormat类将数据导出到HBase,但这种方法比批量加载工具慢。

我们现在已经完成了对 Hadoop 输出工具的检查。 介绍了如何使用HDFS File Slurper将数据移出到文件系统,以及如何使用Sqoop对关系数据库进行幂等输入,总结了Hadoop数据输入HBase的方法。