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'
да каждая строка начинается с новой строки на них. Таким образом, второй метод работает до 20 строк, а затем я получаю перезагрузку соединения с драйвером opentsdb. –
ОК, пожалуйста (а) покажите нам некоторые примеры данных, чтобы людям не приходилось угадывать, на что это похоже, и (б) обновлять ответ, чтобы объяснить, что он работает на 20 или около того строк до сбоя, потому что, как написано подразумевает, что он вообще не работает. – abarnert
Между тем, если OpenTSDB по какой-то причине не любит получать целую кучу отдельных команд подряд, как насчет того, чтобы просто объединить их вместе и отправить одну большую партию? Другими словами, 's.sendall (''. Join (data_list))' работает для целых 100 строк, когда ваш цикл выходит из строя после 20? – abarnert