我需要从mysql导入数据,运行mr并将其导出回mysql。我能够在一个mr作业中使用dbinputformat和dboutputformat成功地完成一些记录。当我将输入记录扩展到1亿多条记录时,job先生挂起了。另一种方法是将数据导出到hdfs,运行mrjob并推回到sql。
对于一个大约有4亿多条记录的巨大数据集,使用dbinputformat和dboutputformat或者使用hdfs作为数据源和目标哪个选项更好。
使用hdfs在mr作业前后增加了一个步骤。因为数据存储在hdfs上,所以它将被复制(默认值为3),并且需要更多的硬盘空间。谢谢,鲁佩什
1条答案
按热度按时间polkgigr1#
我认为最好的方法应该是使用sqoop来处理这种情况。apache sqoop是一种设计用于在apache hadoop和结构化数据存储(如mysql或oracle等关系数据库)之间高效传输大量数据的工具。sqoop自动化了大部分过程,依赖数据库来描述要导入的数据的模式。sqoop使用mapreduce导入和导出数据,提供了并行操作和容错功能。请查看此链接并探索sqoop以获取详细信息。sqoop详细信息
为了使用dbinputformat,您需要编写一个类,将数据库记录中的列反序列化为要处理的各个数据字段。这是相当乏味和完全算法。sqoop自动生成类定义来反序列化数据库中的数据。这些类还可以用于以hadoop的sequencefile格式存储结果,这也允许您利用hdfs中的内置压缩。这些类被写成.java文件,您可以稍后将其合并到自己的数据处理管道中。类定义是利用jdbc读取数据库和表的元数据的能力创建的。
调用sqoop时,它检索表的元数据,写出要导入的列的类定义,并启动mapreduce作业以正确导入表体。