2013-11-26 4 views
0
def put_data(line = '', dest_host = 'server', dest_port = '876'): 
    ''' This method once invoked pushes data to dest_host and dest_port ''' 
    if line: 
     cmd = '/bin/echo put ' + line + '| ' + '/bin/nc -w 15 server port' 
     print('TCP put using command: ' + cmd) 
     os.system(cmd) 

Я использую вышеуказанный метод для того, чтобы TCP помещал строки данных в драйвер opentsdb поверх HBASE.python tcp put connection reset

Этот метод, как видно, вызывает утилиту netcat для каждой строки данных, которая выталкивается.

Вопросы: 1.) Есть ли лучший способ выполнить эту задачу, не открывая TCP-соединение каждый раз для каждой строки данных, которую я хочу нажать? Я запускаю это каждую минуту, и это вызывает большое количество соединений в состоянии TIME_WAIT.

2.) Могу ли я нажимать 1000 строк за раз, используя постоянный TCP-сокет? Я просмотрел реализации netcat в python, но они, похоже, вызывают перезагрузку соединения со сверстниками, когда я нажимаю все строки

Например: Когда я пытаюсь использовать метод ниже, я продолжаю получать ошибку: error (104, «переподключение одноранговой»)

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(server, port) 
for line in data_list: 
    s.sendall(line) 
s.close() 

error(104, 'Connection reset by peer') 

Примеры строк данных, толкнул:

line1 = 'fin.wait2 1385428269 0.0 host=srv1 testname=tcp source=nag03 product=rebuild' 
line2 = 'established 1385428269 11.0 host=srv2 testname=tcp source=nag03 product=rebuild' 
line3 = 'fin.wait1 1385428269 0.0 host=srv3 testname=tcp source=nag03 product=rebuild' 
line4 = 'last.ack 1385428269 0.0 host=srv4 testname=tcp source=nag03 product=rebuild' 
line5 = 'unknown 1385428269 0.0 host=srv5 testname=tcp source=nag03 product=rebuild' 
line6 = 'syn.recv 1385428269 0.0 host=srv6 testname=tcp source=nag03 product=rebuild' 
+0

да каждая строка начинается с новой строки на них. Таким образом, второй метод работает до 20 строк, а затем я получаю перезагрузку соединения с драйвером opentsdb. –

+0

ОК, пожалуйста (а) покажите нам некоторые примеры данных, чтобы людям не приходилось угадывать, на что это похоже, и (б) обновлять ответ, чтобы объяснить, что он работает на 20 или около того строк до сбоя, потому что, как написано подразумевает, что он вообще не работает. – abarnert

+0

Между тем, если OpenTSDB по какой-то причине не любит получать целую кучу отдельных команд подряд, как насчет того, чтобы просто объединить их вместе и отправить одну большую партию? Другими словами, 's.sendall (''. Join (data_list))' работает для целых 100 строк, когда ваш цикл выходит из строя после 20? – abarnert

ответ

1

проблема заключается в том, что ваши линии не имеют новой строки на конце.

Ваш код netcat передает строки netcat с использованием echo, который без каких-либо аргументов добавит новую строку в конец, поэтому она работает.

Но ваш код на Python socket не добавляет новые символы.

Итак, вы хотите, чтобы отправить его пять команд, как это:

put fin.wait2 1385428269 0.0 host=srv1 testname=tcp source=nag03 product=rebuild 
put established 1385428269 11.0 host=srv2 testname=tcp source=nag03 product=rebuild 
put fin.wait1 1385428269 0.0 host=srv3 testname=tcp source=nag03 product=rebuild 
put last.ack 1385428269 0.0 host=srv4 testname=tcp source=nag03 product=rebuild 
put unknown 1385428269 0.0 host=srv5 testname=tcp source=nag03 product=rebuild 
put syn.recv 1385428269 0.0 host=srv6 testname=tcp source=nag03 product=rebuild 

... но вместо этого, вы пошлете одну большую строку:

put fin.wait2 1385428269 0.0 host=srv1 testname=tcp source=nag03 product=rebuildput established 1385428269 11.0 host=srv2 testname=tcp source=nag03 product=rebuildput fin.wait1 1385428269 0.0 host=srv3 testname=tcp source=nag03 product=rebuildput last.ack 1385428269 0.0 host=srv4 testname=tcp source=nag03 product=rebuildput unknown 1385428269 0.0 host=srv5 testname=tcp source=nag03 product=rebuildput syn.recv 1385428269 0.0 host=srv6 testname=tcp source=nag03 product=rebuild 

Либо она становится запутываемый ваши данные и зависание, отклоняя слишком длинную линию как попытку DoS или просто ожидая новой линии, которая, как предполагается, закончит линию, и никогда не получит ее и, в конечном счете, отключит время.

Независимо от основной проблемы, основная причина в том, что нехватка новых строк и исправление заключается в их размещении.

Пока мы это делаем, ваш код netcat добавляет put в начале каждой команды, а ваш код socket этого не делает, и вам, вероятно, также потребуется исправить это. Итак:

for line in data_list: 
    s.sendall('put {}\n'.format(line)) 
+0

Да, было важно поставить «put» также - спасибо, указав это тоже. –