2016-05-10 6 views
0

Ich reiche das Jar-Paket ein, Topologie kann Normalbetrieb sein. aber ich kann das Ergebnis nicht in MySQL schreiben und kann das Protokoll nicht abrufen. Ich habe bereits eine Tabelle in meiner Datenbank namens result erstellt.Wie kann ich Ergebnisse in MySQL in einer Storm-Topologie schreiben?

Ich weiß nicht, was soll ich tun?

#coding=utf-8 
import MySQLdb 
import logging 
from pyleus.storm import SimpleBolt 

log = logging.getLogger('log_results') 


def write_result(freqset,count): 

    st = '' 
    for i in freqset: 
     st = st + i + ',' 
    sql = "select * from result where freqset = " + "'"+ st +"'" 
    cur.execute(sql) 
    returned_value = cur.fetchone() 
    if returned_value != None: 
     supnum = returned_value[1]+count 
     sql1 = "update result set supnum = %s where freqset = '%s';" %(str(supnum),st) 
     cur.execute(sql1) 
     conn.commit() 
    else: 
     value = [st,count] 
     sql2 = 'insert into result values(%s,%s)' 
     cur.execute(sql2,value) 
     conn.commit() 



class LogResultsBolt(SimpleBolt): 

    def process_tuple(self, tup): 
     freqset, count = tup.values 
     log.debug("%s: %d", freqset, count) 
     write_result(freqset, count) 

if __name__ == '__main__': 

    logging.basicConfig(
      level=logging.DEBUG, 
      filename='/tmp/results.log', 
      format="%(message)s", 
      filemode='a', 
     ) 

    try: 
     conn = MySQLdb.connect(host='10.1.1.5',user='root',passwd='',db='datamining',port=3306) 
     cur = conn.cursor() 
     LogResultsBolt().run() 
     cur.close() 
     conn.close() 
    except MySQLdb.Error,e: 
     log.debug("{0} {1}".format(e.args[0], e.args[1])) 

Ich habe die Debug-Nachricht erhalten:

11814 [Thread-12-result-count] ERROR backtype.storm.daemon.executor - 
java.lang.RuntimeException: Error when launching multilang subprocess 
Traceback (most recent call last): 
    File "/usr/lib64/python2.7/runpy.py", line 162, in _run_module_as_main 
    "__main__", fname, loader, pkg_name) 
    File "/usr/lib64/python2.7/runpy.py", line 72, in _run_code 
    exec code in run_globals 
    File "/tmp/e16601e5-a293-4233-bb9e-0e68090a44d6/supervisor/stormdist/association-miner-1-1462975821/resources/association-miner/result.py", line 2, in <module> 
    import MySQLdb 
ImportError: No module named MySQLdb 

Meine topology.yaml Datei:

name: association-miner 

topology: 

    - spout: 
     name: trans-spout 
     module: association-miner.spout 

    - bolt: 
     name: minning 
     module: association-miner.minning 
     parallelism_hint: 3 
     groupings: 
      - shuffle_grouping: trans-spout 

    - bolt: 
     name: result-count 
     module: association-miner.result 
     groupings: 
      - global_grouping: minning 

Ich habe bereits 'MySQL-Python' in requirements.txt

writen
+0

Versuchen Sie, dies einmal auf globaler Ebene zu instanziieren: 'conn = MySQLdb.connect (host = '10 .1.1.5 ', user =' root ', passwd =' ', db =' datamining ', port = 3306)' und Schließen Sie es, wenn Ihr Bolzen stoppt. (Btw, 'cur.execute (sql1) conn.commit' <- Dieser Teil fehlt die Klammern conn.commit() – mkaran

+0

Wie für die Protokollierung, kann ich nicht sehen, wo Sie den Code anmelden.Also, wenn Sie festlegen ein bestimmter absoluter Pfad/Datei für den Logger, auf der man schreiben kann, sollte man in der Lage sein, die Ergebnisse zu sehen. (Verwandte werden nicht arbeiten, da Storms mehrsprachige Inhalte in temporäre Ordner verschoben werden, um zu laufen - es hat mich eine Weile verwirrt.) .) – mkaran

+0

Troubleshooting Storm kann leider ein wenig trickreich sein, es hat mir viel Zeit gekostet. Ich würde vorschlagen, mit dem Logging zu beginnen, um einen besseren Blick auf das Problem mit MySQL zu bekommen und von dort weiterzugehen :). Lass es mich wissen, viel Glück! – mkaran

Antwort

0

Ich verwende 'Pip installieren MySQL-Python' für jeden VM, und dann die Topo logy kann normaler Betrieb sein.