风暴在输入文档被完全解析之前终止(使用streamparse)

时间:2015-05-18 21:09:20

标签: python stream apache-storm

我正在使用Parse.ly/streamparse(https://github.com/Parsely/streamparse)编写一个风暴拓扑,其中包含一个spout,它从json文档中发出元组,以便为​​指定的字段进行解析并保持运行总数为每个指定字段中的实例,以及每个字段中最常见的十个实例。它工作正常,除了进程在读完输入json之前被杀死。我还是很陌生,所以我的第一个方法是简单地检查我的风暴拓扑中的每个文件,看看它是否可能导致提前终止进程的任何代码,但我没有发现任何类型。谷歌也让我失望了。

我觉得有些文件可能是相关的(拓扑中有太多的东西可供我实际发布)

脱粒机:

class MemberCounter {
  int numDemocrats;
  int numRepblican;
  int numIndepent;
};

MemberCounter countMembers(List<MemberOfCongress> members) {
  MemberCounter counter = new MemberCounter();

  for (MemberOfCongress party : members) {
    if (party.getParty().equals("D")) {
      counter.numDemocrats++;
    }
    else if (party.getParty().equals("R")){
      counter.numRepblican++;
    }
    else if (party.getParty().equals("I")){
      counter.numIndepent++;
    }
  }

  return counter;
}

topology.clj:

$nomOrigine = $_FILES["monfichier"]["name"];
$elementsChemin = pathinfo($nomOrigine);
try {
    $objPHPExcel = PHPExcel_IOFactory::load($nomOrigine);
    $objWorksheet = $objPHPExcel->getActiveSheet();
} catch(Exception $e) {
    die(_'Error loading file "'.pathinfo($nomOrigine,PATHINFO_BASENAME).'": '.$e->getMessage()_);
}

省略所有应用计数/等的输出:

from __future__ import absolute_import, print_function, unicode_literals

import itertools
import json
from streamparse.spout import Spout

class actor_data(Spout):

    records = []
    name = "/Users/randallbanks/Virtualenvs/test/first_harvest_topology/data/405labs/reports/drive/drive_2014-01-01_to_2015-02-17.macie.json"


    def initialize(self, stormconf, context):
        # load our json file into a python dictionary 
        with open(self.name) as data_file:
            for line in data_file:
                self.records.append(json.loads(line.strip()))


    def next_tuple(self):
        if len(self.records) > 0:
            self.emit([self.records.pop()])

由于30k字符限制,我不得不省略输出开头的大部分内容,主要是成功连接的语句

我的CWD包含我的整个拓扑(只询问您是否需要查看任何其他文件)

(ns first_harvest_topology
  (:use     [streamparse.specs])
  (:gen-class))

(defn first_harvest_topology [options]
   [
    ;; spout configuration
    {"actor-data" (python-spout-spec
          options
          "spouts.actorData.actor_data"
          ["actor_data"]
          )
    }
    ;; bolt configurations
    {"appID-Bolt" (python-bolt-spec
          options
          {"actor-data" :shuffle}
          "bolts.getAppID_Bolt.getAppID"
          ["appID" "user" "docTitle" "eventDesc"]
          )

    "appCount-Bolt" (python-bolt-spec
          options
          {"appID-Bolt" :shuffle}
          "bolts.appCount_Bolt.appCount"
          ["most_common_app" "most_common_user" "most_common_docTitle" "most_common_eventDesc"]
          )

    "mostCommon-Bolt" (python-bolt-spec
         options
         {"appCount-Bolt" :shuffle}
         "bolts.tenMostCommon_Bolt.mostCommon"
         [];does not emit any fields
         )
    }
  ]
)

1 个答案:

答案 0 :(得分:0)

我和你一样,是一个像streamparse一样的新人。但我可以看到一些可能有帮助的事情。

如果您使用&#34;稀疏运行&#34;那么你必须拥有你的&#34; virtualenvs&#34;文件夹包含以下内容的文件:

streamparse # always required for streamparse projects

并且您必须将其命名为具有txt扩展名的拓扑(在本例中为first_harvest_topology.txt)。 我可以看到你有文件,但不在virtualenvs文件夹中。

另一个问题可能是,如果你只是运行&#34;稀疏运行&#34;,那么这个命令只运行5秒钟。尝试使用&#34;稀疏运行-t x&#34;其中x是您要运行代码的秒数。如果你使用&#34; -t 0&#34;你的代码会一直运行直到你杀了它(你应该试试这个)

你可能已经解决了你的问题(这篇文章是2个月大),但它可以帮助另一个有类似问题的人。希望这有帮助