Hadoop MapReduce DBInputFormat 和 DBOutputFormat

标签 hadoop mapreduce hdfs

我需要从 MYSQL 导入数据,运行 MR 并将其导出回 MYSQL。 我能够使用 DBInputFormat 和 DBOutputFormat 在单个 MR 作业中成功完成一些记录。 当我将输入记录扩展到 100+ 百万条记录时,MR 作业挂起。 替代方法是将数据导出到 HDFS ,运行 MR 作业并推送回 My SQL。

对于包含大约 4 亿条记录的庞大数据集,使用 DBInputFormat 和 DBOutputFormat 还是使用 HDFS 作为数据源和目标,哪个选项更好。

使用 HDFS 在我的 MR 作业前后增加了一个步骤。 由于数据存储在 HDFS 上,因此它会被复制(默认 3)并且需要更多的硬盘空间。 谢谢 鲁佩什

最佳答案

我认为最好的方法应该是使用 SQOOP 来处理这种情况。Apache Sqoop 是一种工具,用于在 Apache Hadoop 和结构化数据存储(例如关系数据库,如 MySQL 或 Oracle)之间高效地传输大量数据。Sqoop 自动化了大多数在这个过程中,依赖于数据库来描述要导入的数据的模式。 Sqoop 使用 MapReduce 导入和导出数据,提供并行操作和容错能力。请查看此链接并探索 Sqoop 以获取详细信息。 SQOOP details

为了使用 DBInputFormat,您需要编写一个类,将数据库记录中的列反序列化为单独的数据字段以供使用。这非常乏味——而且完全是算法。 Sqoop 自动生成类定义来反序列化数据库中的数据。这些类也可用于以 Hadoop 的 SequenceFile 格式存储结果,这也允许您利用 HDFS 中的内置压缩。这些类被写成 .java 文件,您可以稍后将其合并到您自己的数据处理管道中。类定义是利用 JDBC 读取有关数据库和表的元数据的能力创建的。

当调用 Sqoop 时,它会检索表的元数据,写出要导入的列的类定义,并启动 MapReduce 作业以正确导入表体。

关于Hadoop MapReduce DBInputFormat 和 DBOutputFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17875572/

相关文章:

java - 如何使用 MultipleInputs 在映射器中获取文档 ID

scala - 我的MapReduce作业中未调用Reducer任务

java - 尝试使用 java 连接远程服务器中的 HBase 时出现连接问题

apache-spark - JTS 拓扑套件中的 STRtree : bulk load data and build index

java - 关于在 hdfs 中传输文件

java - 使用 Java API 查找提交 yarn 应用程序的用户

apache-spark - Spark 容器手动配置

mapreduce - 如何进行具有多个 map 功能的 riak mapred 查询

java - Hadoop 如何获取没有存储在 HDFS 上的输入数据?

hadoop - 不允许用户冒充匿名 (state=08S01,code=0) org.apache.hadoop.security.authorize.AuthorizationException