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
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
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
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