级联接收模式.update不工作

时间:2014-08-22 14:49:01

标签: hadoop cascading

我刚开始级联编程并且有一个需要运行可变迭代次数的级联作业。在每次迭代期间,它从上一次迭代生成的文件(Tap)准备就绪,并将计算数据写入两个单独的SinkTaps。

  • One Tap(Tap Final)用于从每次迭代中收集数据。
  • 另一个Tap(Tap intermediate)用于收集需要在下一次迭代中计算的数据。

我正在使用SinkMode.UPDATE进行“点击决赛”来实现这一目标。它在本地模式下工作正常。但在集群模式下失败了。抱怨已经存在的文件(“Tap final”)。

我正在运行CDH4.4并级联2.5.2。好像没有人经历过同样的问题。

如果有人知道任何可能的解决方法,请告诉我。感谢

Caused by: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://dv-db.machines:8020/tmp/xxxx/cluster/97916 already exists
at org.apache.hadoop.mapred.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:126)
at org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:419)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:332)
at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1269)
at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1266)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1266)
at org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:606)
at org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:601)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:601)
at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:586)
at cascading.flow.hadoop.planner.HadoopFlowStepJob.internalNonBlockingStart(HadoopFlowStepJob.java:105)
at cascading.flow.planner.FlowStepJob.blockOnJob(FlowStepJob.java:196)
at cascading.flow.planner.FlowStepJob.start(FlowStepJob.java:149)
at cascading.flow.planner.FlowStepJob.call(FlowStepJob.java:124)
at cascading.flow.planner.FlowStepJob.call(FlowStepJob.java:43)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

2 个答案:

答案 0 :(得分:0)

如果您可以在问题中添加级联流代码,那么更好地理解问题会很有帮助。

似乎在群集模式下的不同作业之间使用具有相同名称的作业文件。一个简单的解决方案,如果你没有同时运行它将被设置为最大并发步骤为1。

Flow flow = flowConnector.connect("name", sources, sinks, outPipe1, outPipe2);
flow.setMaxConcurrentSteps(jobProperties, 1);

答案 1 :(得分:0)

UPDATE仅适用于支持就地更新的接收器(如数据库)。

如果你正在使用Hfs(文件系统接收器),那么你需要使用SinkMode.REPLACE。