分享

请教个难题:map方法中如何才能加载spring中的bean?

wjhdtx 发表于 2014-11-19 16:45:46 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 7 24725
需求是这样的,mapreduce分析日志时,在map方法中会访问数据库得到某些值,我使用了spring来连接db进行查询,但在map方法得不到spring中的bean

QQ图片20141119152614.jpg


如上图所示,在mapreduce中的前两个地方可以得到spring中的bean,能进行数据访问,但在最后一处即map方法中,得不到spring中的bean,报错为:
  1. Error: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.hiveview.service.api.BaseDataService] is defined
  2.         at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:296)
复制代码

请问,如何在map方法中加载sprnig中的bean???
(麻烦,谢谢)

已有(7)人评论

跳转到指定楼层
muyannian 发表于 2014-11-19 17:24:13
这应该跟配置有关系,map是被分发的,很可能spring包没有过去。所以找不到类了。

下面内容,可能对你有帮助
Spring Hadoop 快速入门:如何配置Spring及验证mapreduce
http://www.aboutyun.com/thread-10020-1-1.html

Spring hadoop 访问hbase 入门教程
http://www.aboutyun.com/thread-9489-1-1.html

spring-data-hadoop maven配置详解及如何调试
http://www.aboutyun.com/thread-10021-1-1.html

Spring for Apache Hadoop介绍及官方文档下载
http://www.aboutyun.com/thread-10019-1-1.html
回复

使用道具 举报

wjhdtx 发表于 2014-11-19 17:41:26
muyannian 发表于 2014-11-19 17:24
这应该跟配置有关系,map是被分发的,很可能spring包没有过去。所以找不到类了。

下面内容,可能对你有 ...

先谢谢你的回复。

map任务分发到slave机器上我是知道的,会在salve中创建java子进程来运行map任务。

我是将mapreduce打了个jar包,在hadoop集群中的机器上运行hadoop jar命令来执行。该jar包中有lib目录,lib目录中依赖有的第三方jar包(比如spring相关的jar包)。

纠正你一点的是,第三方的jar包肯定会过去的(包括spring以及其他的),我之前解析json的时候在map中用过json的第三方jar。

我这并不是在spring中运行mapreduce程序,而是在mapreduce中调用spring中的bean。

求大神!!!!(谢谢)

回复

使用道具 举报

muyannian 发表于 2014-11-19 17:53:31
wjhdtx 发表于 2014-11-19 17:41
先谢谢你的回复。

map任务分发到slave机器上我是知道的,会在salve中创建java子进程来运行map任务。
直接调用恐怕不行,需要做一定的配置,才可以。

可以参考下面的,改一下配置,这方面的资料不是太多。
Spring Hadoop 快速入门:如何配置Spring及验证mapreduce
http://www.aboutyun.com/thread-10020-1-1.html
回复

使用道具 举报

wjhdtx 发表于 2014-11-19 18:21:27
muyannian 发表于 2014-11-19 17:53
直接调用恐怕不行,需要做一定的配置,才可以。

可以参考下面的,改一下配置,这方面的资料不是太多。
...

简单看了一下,你说的这个是在spring中运行mapreduce,和我的需求应该不一样。

就算我通过spring来调用mapreduce,我在mapreduce中也逃不掉调用spring中的bean来访问数据库。
回复

使用道具 举报

bioger_hit 发表于 2014-11-19 21:40:14
本帖最后由 bioger_hit 于 2014-11-19 21:43 编辑
楼主框架不是说能调用就能调用的。在rest api中不能调用Java api,同样Java  api也不能调用rest api。
如果楼主这不是谁调用谁的问题,而是你的用法要符合规则。
想在spring中使用mapreduce就需要配置hadoop的spring,同样调用spring bean也是这样。

楼主切忌浮躁,spring这块研究还是不多的,即使配置了也会遇到问题,难度还是不小的。
要么这么问题先放放,要么楼主自己研究下。
但是在spring中使用mapreduce,需要配置这是肯定的,而且是绕不过的。

回复

使用道具 举报

wjhdtx 发表于 2014-11-20 09:30:59
本帖最后由 wjhdtx 于 2014-11-20 09:39 编辑
bioger_hit 发表于 2014-11-19 21:40
本帖最后由 bioger_hit 于 2014-11-19 21:43 编辑
楼主框架不是说能调用就能调用的。在rest api中不能调 ...

你说的rest api是反射 api吗??

我知道的是在TaskTracker(yarn之前这么叫,暂且这么叫)中,调用方式是:TaskRunner 创建子进程 MapTask,在 MapTask 中又创建了MapRunner,在MapRunner中会调用map方法。
我想jar包是不是在TaskRunner中加载,而map方法是在TaskRunner创建的子进程中运行的,所以得不到?

  1. public void run(RecordReader<K1, V1> input, OutputCollector<K2, V2> output,
  2.                 Reporter reporter)
  3.   throws IOException {
  4.   try {
  5.     K1 key = input.createKey();
  6.     V1 value = input.createValue();
  7.     while (input.next(key, value)) {
  8.       mapper.map(key, value, output, reporter);
  9.       if(incrProcCount) {
  10.         reporter.incrCounter(SkipBadRecords.COUNTER_GROUP,
  11.             SkipBadRecords.COUNTER_MAP_PROCESSED_RECORDS, 1);
  12.       }
  13.     }
  14.   } finally {
  15.     mapper.close();
  16.   }
  17. }
复制代码

实在不行不用spring了,退回到原始社会,自己写代码来搞


回复

使用道具 举报

、一毛 发表于 2015-12-11 08:46:33
你可以 在 map/reduce 的setup中获取到提交机的实体bean,然后在m、r中操作
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条