我有一个python bolt来解析文件中的信息。有问题的螺栓接收文件路径,解析文件,然后从for循环中发出一些元组。
问题是当它运行时只发出两个元组然后它就会挂起。在日志中,我可以看到已经从文件中解析了正确数量的键,并且已经发出了前两个元组,但在此之后没有与该螺栓相关的其他日志。 (仅指标日志)
38640 [Thread-19] INFO backtype.storm.task.ShellBolt - ShellLog pid:14644,name:ParseFileBolt键数= 1373
38870 [Thread-21] INFO backtype.storm.daemon.task - Emitting: ParseFileBolt默认[“177328623”]
38870 [Thread-21] INFO backtype.storm.daemon.task - Emitting: 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。 本地和远程群集都会出现此问题。
对这个问题的任何想法都会受到高度赞赏。