2016-03-07 2 views
1

Scrapy Clusters - отличный новый способ масштабирования больших, непрерывных проектов. Он настраивается внутри виртуальной машины и запускается с несколькими экземплярами из разных инструментов.Scrapy Clusters kafka_monitor.py прерван

Я построил виртуальную машину и установил необходимые инструменты, такие как Redis, Kafka и zookeeper.

Я просто застрял на простой строке до моего первого тестового сканирования, и я не знаю, является ли это проблемой python, проблемой установки или что.

Когда я пытаюсь

python kafka_monitor.py run

я получаю:

Traceback (most recent call last): File "kafka_monitor.py", line 512, in sys.exit(main())
File "kafka_monitor.py", line 497, in main kafka_monitor.run()
File "kafka_monitor.py", line 413, in run self._setup_kafka()
File "kafka_monitor.py", line 232, in _setup_kafka ret_val = _hidden_setup()
File "/usr/local/lib/python2.7/dist-packages/scutils/method_timer.py", line 46, in f2 retval = f(*args)
File "kafka_monitor.py", line 218, in _hidden_setup self.kafka_conn = KafkaClient(self.settings['KAFKA_HOSTS'])

TypeError: ____init___() takes exactly 1 argument (2 given)

settings.py включает в себя:

KAFKA_HOSTS = 'localhost:9092' 
KAFKA_INCOMING_TOPIC = 'demo.incoming' 
KAFKA_GROUP = 'demo-group' 
KAFKA_FEED_TIMEOUT = 5 
KAFKA_CONN_TIMEOUT = 5 

И в соответствии с указаниями Quick Start я сделал localsettings.py, а

# Here, 'scdev' is the host with Kafka, Redis, and Zookeeper 
REDIS_HOST = 'scdev' 
KAFKA_HOSTS = 'scdev:9092' 
ZOOKEEPER_HOSTS = 'scdev:2181' 

Даже если я иду в kafka_monitor.py и изменения линии 218 (из этого intital TRACEBACK ошибки выше)

От:

self.kafka_conn = KafkaClient(self.settings['KAFKA_HOSTS']) 

Для:

self.kafka_conn = KafkaClient(self.settings['scdev:9092']) 

Я получаю такая же ошибка.

+0

Похоже, вам нужно удалить аргумент из вызова 'KafkaClient()'. Medsage вводит в заблуждение, так как 'self' всегда передается в качестве первого аргумента. Таким образом, один аргумент приводит к двум. –

+0

Спасибо, что я сделал эксперимент с этим: с 'self.kafka_conn = KafkaClient()' Я получаю 'AttributeError: объект KafkaClient 'не имеет атрибута' secure_topic_exists'' –

+0

Кажется, что у вас есть некоторая версия несовместимости между kafka_monitor и KafkaClient() , Я бы поискал версию KafkaClient с make_topic_exists и удостоверился, что у меня установлена ​​эта версия. –

ответ

2

Хотя я не знаю, какова ваша среда, я настоятельно рекомендую следовать руководству Quickstart во введении here, в котором рассказывается о том, как настроить и протестировать ваш клон репо и даже предоставить виртуальную машину для запуска и проверить все. Я не могу воспроизвести вашу проблему, но вот несколько тестов, которые я провел против kafka-python (поддерживается) и pykafka (неподдерживаемый).

Здесь scdev - это просто виртуальная машина с запуском Kafka. Использование Python 2.7.10.

Кафка-питон 0.9.5 (возлагали в requirements.txt):

>>> from kafka import KafkaClient 
>>> k = KafkaClient() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __init__() takes at least 2 arguments (1 given) 
>>> k = KafkaClient('scdev:9092') 
>>> k.ensure_topic_exists('test') 
>>> 

Обратите внимание, что вы не можете вызвать KafkaClient() конструктор без аргументов, так что я на самом деле не знаю, как вы его получили работать.

pykafka 2.2.1 (последняя на PyPI)

>>> from pykafka import KafkaClient 
>>> k = KafkaClient() 
>>> k.ensure_topic_exists() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'KafkaClient' object has no attribute 'ensure_topic_exists' 
>>> k2 = KafkaClient('scdev:9092') 
>>> 

Обратите внимание, что в настоящее время работает, но мы используем совершенно другую библиотеку, и я получаю ту же ошибку атрибута. Я не знаю, изменили ли вы импорт пакетов, но я не могу найти reference для pykafka в рамках проекта.

kafka-python 1.0.1 (позднее PyPI)

>>> from kafka import KafkaClient 
>>> k = KafkaClient() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/madisonb/.local/share/virtualenvs/sc3/lib/python2.7/site-packages/kafka/__init__.py", line 41, in __init__ 
    super(KafkaClient, self).__init__(*args, **kwargs) 
TypeError: __init__() takes at least 2 arguments (1 given) 
>>> k = KafkaClient('scdev:9092') 
>>> k.ensure_topic_exists('test') 
>>> 

Просто тройной проверки, что он работает на самом последнем пакете PyPi.

Также важно отметить, что переменная settings, на которую ссылается в вопросе, представляет собой просто словарь элементов из ваших файлов настроек. Поэтому вызов self.settings['scdev:9092'] является спорным, потому что этот ключ не существует. Действительно, self.settings['KAFKA_HOSTS'] просто поиск по словарю, который, как представляется, быть строкой 'scdev:9092'

EDIT:

Я могу воспроизвести ошибку __init__(), используя синтаксис, представленный kafka_monitor.py с Кафки-Python 1.0.1.

>>> from kafka.client import KafkaClient # new syntax for importing KafkaClient 
>>> k = KafkaClient() 
>>> k.ensure_topic_exists('test') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'KafkaClient' object has no attribute 'ensure_topic_exists' 
>>> k2 = KafkaClient('scdev:9092') 
Exception AttributeError: "'KafkaClient' object has no attribute '_wake_r'" in <bound method KafkaClient.__del__ of <kafka.client_async.KafkaClient object at 0x102c51d50>> ignored 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __init__() takes exactly 1 argument (2 given) 
>>> 

Похоже, что версии, которые вы установили, не соответствуют файлу requirements.txt. Это только вызовет у вас больше проблем, которые я предлагаю pip install -r requirements.txt, и выясните, устраняет ли это проблему.

2

Успех!

@Madison Bahmer благодарит за то, что он меня направил в правильном направлении. Я хочу просто прояснить, как я его запустил.

Первая строка фактического кода (так 3 строки) в kafka_monitor.py гласит:

from kafka.client import KafkaClient 

Я изменил его:

from kafka import KafkaClient 

Это получил его на работу!

Является ли это близоруким решением? Будет ли что-то перерыв в будущем без:

from kafka.client import KafkaClient 

я не знаю, но я буду обновлять это в будущем, если проблемы, специфичные для этой arrise.

+0

Обновление: снова спасибо @Madison Bahmer, если я вернусь к kafka-python 0.9 .5 «pip install kafka-python == 0.9.5», тогда мне не нужно изменять kafka_monitor.py, что, вероятно, лучший способ действия, так как эта версия является текущей рекомендуемой версией в файле требований. Txt –