Hadoop MapReduce中把分析数据写入mysql中

Hadoop MapReduce中把分析数据写入mysql中,第1张

你的job类并没有设置outputformat,如需要输出到数据库,需要特定的输出如下:

job.setJarByClass(TextCheckerJob.class)

job.setMapperClass(TextMapper.class)

job.setReducerClass(TextReduce.class)

job.setInputFormatClass(TextInputFormat.class)

job.setOutputFormatClass(MysqlDBOutputFormat.class)

job.setMapOutputKeyClass(Text.class)

job.setMapOutputValueClass(Text.class)

job.setOutputKeyClass(Text.class)

job.setOutputValueClass(Text.class)

job.setNumReduceTasks(1)

MysqlDBOutputFormat.setOutput(job, "data_chck_result", new String[] { "tblName", "colName", "wrongValue", "count" })

同时,job初始化之前,你需要把连接数据库的信息写入conf中,如下

conf.set("mapreduce.jdbc.driver.class", clazz)

conf.set("mapreduce.jdbc.username", username)

conf.set("mapreduce.jdbc.password", password)

conf.set("mapreduce.jdbc.url", url)

上面的MysqlDBOutputFormat类是我自己重写了,你可以直接使用DBOutputFormat这个类

使用python写MapReduce的“诀窍”是利用Hadoop流的API,通过STDIN(标准输入)、STDOUT(标准输出)在Map函数和Reduce函数之间传递数据。

我们唯一需要做的是利用Python的sys.stdin读取输入数据,并把我们的输出传送给sys.stdout。Hadoop流将会帮助我们处理别的任何事情。

首先将文件名发送给名称节点名称节点根据文件名找到对应数据块信息,再根据数据块信息。

hadoopmapreduce通常针对hdfs中存储的数据运行。该系统是围绕数据局部性设计的,要求数据采用hdfs格式。也就是说,为了提高性能,map任务在存储数据的同一块硬件上运行。

也就是说,如果出于某种原因,您的数据必须存储在hdfs之外,然后使用mapreduce进行处理,那么这是可以做到的,但要做的工作要多一些,而且效率不如本地处理hdfs中的数据。

所以让我们来看两个用例。从日志文件开始。日志文件,因为它们不是特别可访问的。它们只需要被卡在某个地方,然后保存起来,以备日后分析。hdfs非常适合这种情况。如果你真的需要一个日志,你可以得到它,但一般人会寻找输出的分析。所以将日志存储在hdfs中并正常处理它们。

然而,hdfs和hadoop map reduce理想格式的数据(单个大平面文件中的许多记录)并不是我认为高度可访问的。hadoopmapreduce希望输入文件的大小为多兆字节,每个文件有许多记录。你越是偏离这个案子,你的表现就越会下降。有时您的数据需要随时在线,而hdfs对此并不理想。例如,我们将以你的书为例。如果这些书籍用于需要以在线方式访问内容(即编辑和注解)的应用程序中,则可以选择将它们存储在数据库中。然后,当您需要运行批处理分析时,可以使用自定义inputformat从数据库中检索记录并在mapreduce中处理它们。

我目前正在用一个网络爬虫来完成这个任务,它将网页单独存储在amazons3中。网页太小,无法作为mapreduce的一个有效输入,因此我有一个定制的inputformat,为每个mapper提供几个文件。这个mapreduce作业的输出最终被写回s3,因为我使用的是amazonemr,hadoop集群就消失了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9232500.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存