我试图运行一些多步骤的工作使用狐猴+clojure。
我不同意将多个输入作为参数传递给clojure+lemur。
作为我的工作的第一步,我试图运行电子病历流作业
lemur run${conf\u-dir}/run-pipeline.clj——主示例类型${master\u-instance}——从示例类型${slave\u-instance}——num示例${num\u-instances}——ami版本${ami version}——hadoop版本${hadoop\u-version}——bucket${bucket}——jar src路径${conf\u-dir}/run-pipeline.clj——输入文件夹${input\u-folder}——输出文件夹“${output\u folder}”--减少任务“${reduce\u tasks}”--Map任务“${map\u tasks}”
对于单个输入文件,我的代码如下所示
(import com.amazonaws.services.elasticmapreduce.util.StepFactory)
(import com.amazonaws.services.elasticmapreduce.model.StepConfig)
(import com.amazonaws.services.elasticmapreduce.util.StreamingStep)
(defn create-step-parsing [eopts]
(def step (new StreamingStep))
(.withInputs step (into-array [(str (:input-folder eopts) "/inputs/*")]))
...
这工作得很好,但当我试图传递输入文件列表时,会出现错误
lemur run${conf\u dir}/run-pipeline.clj--主示例类型${master\u instance\u type}--从示例类型${slave\u instance\u type}--num示例${num\u instances}--ami版本${ami\u版本}--hadoop版本${hadoop\u版本}--bucket${bucket}--jar src路径${conf\u dir}/run-pipeline.clj--input\u文件夹${input\u folder1}--input\u文件夹“${input\u folder2}”--输入\u文件夹“${input\u folder3}”--输入\u文件夹“${input\u folder}”--输出文件夹“${output\u folder}”--减少任务“${reduce\u tasks}”--Map任务“${map\u tasks}”
(defn create-normalizer-step [eopts]
(def step (new StreamingStep))
(.withInputs step (to-array (:input-folder eopts)))
这是我得到的错误
15:44:05 Exception in thread "main" java.lang.ClassCastException
15:44:05 at java.lang.Class.cast(Class.java:2990)
15:44:05 at clojure.lang.Reflector.boxArg(Reflector.java:429)
15:44:05 at clojure.lang.Reflector.boxArgs(Reflector.java:462)
15:44:05 at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:57)
15:44:05 at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:30)
15:44:05 at run_pipeline17$create_normalizer_step.invoke(run-pipeline.clj:18)
15:44:05 at run_pipeline17$run_pipeline.invoke(run-pipeline.clj:209)
15:44:05 at lemur.core$fire_BANG_.doInvoke(core.clj:711)
15:44:05 at clojure.lang.RestFn.invoke(RestFn.java:423)
15:44:05 at run_pipeline17$eval178.invoke(run-pipeline.clj:222)
15:44:05 at clojure.lang.Compiler.eval(Compiler.java:6465)
15:44:05 at clojure.lang.Compiler.load(Compiler.java:6902)
15:44:05 at clojure.lang.Compiler.loadFile(Compiler.java:6863)
15:44:05 at clojure.lang.RT$3.invoke(RT.java:305)
15:44:05 at lemur.core$execute_jobdef.invoke(core.clj:742)
15:44:05 at lemur.core$_main$fn__1388.invoke(core.clj:929)
15:44:05 at lemur.core$_main.doInvoke(core.clj:924)
15:44:05 at clojure.lang.RestFn.applyTo(RestFn.java:137)
15:44:05 at lemur.core.main(Unknown Source)
我添加的代码是从第17行到第19行。
谢谢
1条答案
按热度按时间rqenqsqc1#
我认为问题在于你使用的数组函数。在第一个工作示例中,您正在使用(into array)。
从文档中:
(进入阵列aseq)
(进入数组类型aseq)
返回一个数组,其中组件设置为aseq中的值。数组的组件类型是type(如果提供),或者aseq中第一个值的类型(如果存在),或者object。aseq中的所有值必须与组件类型兼容。原语类型的类对象可以使用例如integer/type来获得。
因为您正在创建字符串作为into数组的参数,所以clojure正确地为您创建了一个“string”数组。
在第二个不完整的示例中,使用(to array)。从文档中:
(到数组coll)
返回包含coll内容的对象数组,可以是任何集合。Map到java.util.collection.toarray()。
在本例中,您创建了一个“object”数组。这与streamingstep的aws java api中的“string”类型不兼容。
我的建议是使用(into array),类型规范为string。例如:(into array string[“hello”“goodby”])。在我看来,显式类型规范对于将来的阅读是很好的。但正如您从文档中看到的,(into array)将为您猜测键入的内容。