2016-08-27 154 views
1

我試圖部署使用MultiLang博爾特的拓撲(用Python編寫的)丟失的資源文件夾:風暴部署時JAR拓撲

builder.setBolt("avro-parser", new AvroBolt(), 3).shuffleGrouping("main-kafka-spout"); 
builder.setBolt("nlp-analyzer", new NLPBolt("/python/analyzer/audio_parser.py"), 2).shuffleGrouping("avro-parser"); 

我可以提交拓撲結構沒有問題,但檢查日誌文件我看到這個錯誤:

java.lang.RuntimeException: Error when launching multilang subprocess 

    at org.apache.storm.utils.ShellProcess.launch(ShellProcess.java:89) ~[storm-core-1.0.1.jar:1.0.1] 
    at org.apache.storm.task.ShellBolt.prepare(ShellBolt.java:131) ~[storm-core-1.0.1.jar:1.0.1] 
    at org.apache.storm.daemon.executor$fn__7953$fn__7966.invoke(executor.clj:792) ~[storm-core-1.0.1.jar:1.0.1] 
    at org.apache.storm.util$async_loop$fn__625.invoke(util.clj:482) [storm-core-1.0.1.jar:1.0.1] 
    at clojure.lang.AFn.run(AFn.java:22) [clojure-1.7.0.jar:?] 
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_91] 
Caused by: java.io.IOException: Cannot run program "/usr/bin/python" (in directory "/var/lib/storm/supervisor/stormdist/sintonea-topology-main-22-1472285031/resources"): error=2, No such file or directory 
    at java.lang.ProcessBuilder.start(Unknown Source) ~[?:1.8.0_91] 
    at org.apache.storm.utils.ShellProcess.launch(ShellProcess.java:82) ~[storm-core-1.0.1.jar:1.0.1] 
    ... 5 more 
Caused by: java.io.IOException: error=2, No such file or directory 
    at java.lang.UNIXProcess.forkAndExec(Native Method) ~[?:1.8.0_91] 
    at java.lang.UNIXProcess.<init>(Unknown Source) ~[?:1.8.0_91] 
    at java.lang.ProcessImpl.start(Unknown Source) ~[?:1.8.0_91] 
    at java.lang.ProcessBuilder.start(Unknown Source) ~[?:1.8.0_91] 
    at org.apache.storm.utils.ShellProcess 

當然,我注意到,我沒有「資源」文件夾中指定的日誌跟蹤:

/var/lib/storm/supervisor/stormdist/sintonea-topology-main-22-1472285031/resources

如果您在該目錄中執行「ls」的命令,你會看到它:

stormcode.ser stormconf.ser stormjar.jar 

爲什麼暴風雨不在該目錄中創建一個資源文件夾?

我的src/main /資源內的兩個資源文件夾:

  • 模式:包含的Avro方案文件
  • 蟒蛇:包含Python代碼

這些文件夾複製到JAR在根目錄中而不是/ resources文件夾。

這怎麼可能?我有一個以這種方式使用的架構中的AvroBolt和它的不給任何問題(與DummyBolt代替MultiLang博爾特測試):

我搬到我的資源文件夾

_schema = parser.parse(getClass().getResourceAsStream("/schema/caller_request.avsc")); 

編輯到

baseDirectory.value/"multilang"

看完這個:

http://storm.apache.org/releases/current/Creating-a-new-Storm-project.html

現在的資源文件夾中創建和複製的,但我仍然有同樣的問題:

Serializer Exception: 
/usr/bin/python: can't open file '/resources/python/analyzer/audio_parser.py': [Errno 2] No such file or directory 

EDIT 2

我找到了一個解決方法(在創建兩個不同的文件夾資源級別):

  1. 在src的父目錄(一級上)中創建一個multilang /資源。複製python文件夾:{base-directory}/multilang/resources/python/*。py
  2. 保留原文件夾src/main/schema:{base-directory}/src/main/resources/schema/caller_request。 AVSC。

並添加到我的構建。SBT:

unmanagedResourceDirectories in Compile += { baseDirectory.value/"multilang" } 
unmanagedClasspath in Compile += baseDirectory.value/"multilang" 

併成立了我的ShellBot爲(忽略詞 「資源」 或路徑 「/」):

NLPBolt nlpBolt = new NLPBolt("python/analyzer/audio_parser.py"); 

和:

_schema = parser.parse(getClass().getResourceAsStream("/schema/caller_request.avsc")); 

看來工作,但我不喜歡這個解決方案。有什麼想法嗎?

編輯3

順便提一下,此代碼:

import storm 
#from nltk.stem.snowball import SnowballStemmer 
from es_tagger import SpanishTagger 

config = utils.load_json('python/analyzer/data/config.json') 

class AudioParserBolt(storm.BasicBolt): 

產生以下錯誤:

Serializer Exception: 
Traceback (most recent call last): 
    File "python/analyzer/audio_parser.py", line 27, in <module> 
    class AudioParserBolt(storm.BasicBolt): 
AttributeError: 'module' object has no attribute 'BasicBolt' 
+0

我的Python腳本旁邊的storm.py代碼的複製/粘貼爲最後一個問題做了訣竅。我將發佈這3個編輯作爲答案。 – cabreracanal

回答

2

所以,這基本上是我做得到它的工作:

  1. 創建文件夾$ {basedir}/multilang/resources - >複製裏面的python代碼。
  2. 從$ {basedir}/src/main/resources中刪除python代碼,並僅保留Avro方案。
  3. 添加到build.sbt文件:

unmanagedResourceDirectories in Compile += { baseDirectory.value/"multilang" } unmanagedClasspath in Compile += baseDirectory.value/"multilang"

https://github.com/apache/storm/blob/master/storm-multilang/python/src/main/resources/resources/storm.py及複印件
  • 下載storm.py /粘貼到$ {BASEDIR}/multilang /資源/ python文件夾。
  • 在Python代碼中,註釋或刪除任何打印指令(由於打印寫入標準輸出引發Java元素解析元組)。
  • 如果你的Python過程有點慢(我的是一個NLP的過程,需要一點點設置第一次),告訴你的拓撲等待多一點:
  • config.put(Config.TOPOLOGY_SUBPROCESS_TIMEOUT_SECS,);

  • 進行大量的試驗和錯誤=)
  • 你需要使用一個外部文件在你的Python代碼,就像一個配置文件,這樣稱呼它(父目錄將在任何時間是我們之前創建的multilang /資源):

    config = utils.load_json('python/analyzer/data/config.json')