我有一个python螺栓,它解析文件中的信息。有问题的bolt接收文件路径,解析文件,然后从for循环中发出许多元组。
问题是,当它运行时,只发出两个元组,然后挂起。在日志中,我可以看到已经从文件中解析了正确数量的键,并且发出了前两个元组,但是在这之后,就没有其他与bolt相关的日志了(仅度量日志)
38640[thread-19]信息backtype.storm.task.shellbolt-shelllogpid:14644, name:parsefilebolt number 钥匙数量=1373
38870[thread-21]info backtype.storm.daemon.task-发射:parsefilebolt默认值[“177328623”]
38870[thread-21]info backtype.storm.daemon.task-发射:parsefilebolt默认值[“177328532”]
下面是产生问题的代码的简化版本。如代码中所述,如果我手动输入一些键,而不是从文件中解析它们,它们都会成功发出。
import gzip
import storm
class ParseFileBolt(storm.BasicBolt):
def process(self, tup):
file_path = tup.values[0]
# If I parse keys from a file only two get emitted
keys = get_keys(file_path)
# e.g keys = {'393548331', '177329025', '123456789'}
# If I manually enter the keys they all get emitted
#keys = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
storm.logInfo("Number of keys = {0}".format(len(keys)))
for key in keys:
storm.emit([key])
def get_keys(file_name):
with gzip.open(file_name, 'rt') as file:
key_set = set()
for line in file:
if line.startswith("#"):
continue
else:
columns = line.split("|")
key = columns[0].strip(' \t\n\r')
key_set.add(key)
return key_set
ParseFileBolt().run()
正在分析的文件是一个.gz文件,其中包含一个以#开头的头行,后跟以“|”分隔的数据行。
# Header Row
177328623|columns1|column2|column3
177328532|columns1|column2|column3
123456789|columns1|column2|column3
...
我在windows上使用apache-storm-0.9.4。本地和远程群集上都会出现此问题。
如果您对这个问题有任何想法,我们将不胜感激。
暂无答案!
目前还没有任何答案,快来回答吧!