我想要实现的目标:
我已经设置了一个包含Hadoop任务的Spring Batch Job来处理一些更大的文件。 为了让多个Reducers为这项工作而运行,我需要设置Reducers的数量为setNumOfReduceTasks。我正试图通过JobFactorybean设置此内容。
我在classpath中的bean配置:/META-INF/spring/batch-common.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="jobFactoryBean" class="org.springframework.data.hadoop.mapreduce.JobFactoryBean" p:numberReducers="5"/>
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean" />
<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher" p:jobRepository-ref="jobRepository" />
</beans>
XML包含在:
中 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:property-placeholder location="classpath:batch.properties,classpath:hadoop.properties"
ignore-resource-not-found="true" ignore-unresolvable="true" />
<import resource="classpath:/META-INF/spring/batch-common.xml" />
<import resource="classpath:/META-INF/spring/hadoop-context.xml" />
<import resource="classpath:/META-INF/spring/sort-context.xml" />
</beans>
我通过
获取jUnit测试的bean JobLauncher launcher = ctx.getBean(JobLauncher.class);
Map<String, Job> jobs = ctx.getBeansOfType(Job.class);
JobFactoryBean jfb = ctx.getBean(JobFactoryBean.class);
jUnit Test停止并显示错误:
No bean named '&jobFactoryBean' is defined
所以:没有加载JobFactoryBean,而是正确加载了其他的,没有错误。
没有线
JobFactoryBean jfb = ctx.getBean(JobFactoryBean.class);
项目测试运行,但每个作业只有一个Reducer。
方法
ctx.getBean("jobFactoryBean");
返回Hadoop作业。我希望在那里得到factoryBean ......
为了测试它,我已经扩展了Reducer的构造函数来记录Reducer的每个创建,以便在生成一个时获得通知。到目前为止,我只在日志中输入一个条目。
我有一个2个VM,每个分配2个内核和2 GB内存,我正在尝试对由Gutenberg项目中的多本书组成的75MB文件进行排序。
编辑:
我尝试过的另一件事是通过属性设置hadoop作业中的reducer数量,但没有结果。
<job id="search-jobSherlockOk" input-path="${sherlock.input.path}"
output-path="${sherlockOK.output.path}"
mapper="com.romediusweiss.hadoopSort.mapReduce.SortMapperWords"
reducer="com.romediusweiss.hadoopSort.mapReduce.SortBlockReducer"
partitioner="com.romediusweiss.hadoopSort.mapReduce.SortPartitioner"
number-reducers="2"
validate-paths="false" />
mapreduce-site.xml中的设置位于两个节点上:
<property>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>10</value>
</property>
...以及为什么:
我需要在同一台机器或完全分布式环境中使用不同的Reducers来测试分区程序的行为。第一种方法会更容易。
P.s。:具有更高声誉的用户可以创建标签“spring-data-hadoop”谢谢!
答案 0 :(得分:1)
在Spring论坛上回答了问题,并将其发布(建议将其用于Spring Data Hadoop问题)。
完整的答案在这里http://forum.springsource.org/showthread.php?130500-Additional-Reducers,但简而言之,减速器的数量由输入分割的数量决定。见http://wiki.apache.org/hadoop/HowManyMapsAndReduces