2013-07-09 20 views
1

我想使用狐猴+ clojure運行一些多步驟的工作。Clojure +狐猴

我有問題將多個輸入作爲參數傳遞給clojure +狐猴。

至於我的工作,我嘗試運行EMR流工作

狐猴運行$ {} CONF_DIR /run-pipeline.clj --master實例類型$ {} MASTER_INSTANCE_TYPE --slave-實例 - 第一步鍵入$ {SLAVE_INSTANCE_TYPE} --num-instances $ {NUM_INSTANCES} --ami-version $ {AMI_VERSION} --hadoop-version $ {HADOOP_VERSION} - bucket $ {BUCKET} --jar-src-path $ {CONF_DIR} /run-pipeline.clj --input_folder「$ {input_folder}」--output-folder「$ {output_folder}」--reduce-tasks「$ {REDUCE_TASKS}」--map-tasks「$ {MAP_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/*")])) 
... 

這工作得很好,但是當我試圖通過輸入文件,我得到錯誤的列表

狐猴運行$ {} CONF_DIR /run-pipeline.clj --master實例類型$ {} MASTER_INSTANCE_TYPE - slave-instance-type $ {SLAVE_INSTANCE_TYPE} --num-instances $ {NUM_INSTANCES} --ami-version $ {AMI_VERSION} --hadoop-version $ {HADOOP_VERSION} - bucket $ {BUCKET} --jar-src-path $ {input_folder1}「--input_folder」$ {input_folder1}「--input_folder」$ {input_folder2}「--input_folder」$ {input_folder3}「--input_folder」$ {input_folder}「--output-文件夾「$ {output_folder}」--reduce-tasks「$ {REDUCE_TASKS}」--map-tasks「$ {MAP_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行

感謝

+0

你還在試圖解決這個問題嗎? – Virmundi

回答

0

我認爲這個問題是您正在使用的陣列功能。在你正在使用的第一個工作示例中(進入數組)。

從文檔:

(成陣列ASEQ)

(成陣列型ASEQ)

返回與設置爲在ASEQ值分量的數組。 數組的組件類型是如果提供的類型,或者是aseq中第一個 值的類型(如果存在)或Object。 aseq中的所有值必須爲 與組件類型兼容。原型 類型的類對象可以使用例如Integer/TYPE獲得。

因爲您創建的字符串作爲參數到數組中,clojure正確地爲您創建了一個「字符串」數組。

在你的第二個例子中,你使用(數組)。從該文檔:

(到陣列COLL)

返回包含COLL的內容,其可以 是任何集合對象的陣列。映射到java.util.Collection.toArray()。

在這種情況下,您創建了一個「對象」數組。根據StreamingStep的AWS Java API,這不符合「String」的類型。

我的建議是使用(進入數組),與字符串的類型說明。例如:(into-array String [「hello」「goodby」])。明確的類型說明很好,在我看來,爲了將來的閱讀澄清。但正如你可以看到的文件,(數組)會猜測你的打字。