【发布时间】:2013-11-26 00:55:01
【问题描述】:
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 放入 HBASE 之上的 opentsdb 驱动程序。
可以看出,此方法为每行推出的数据调用 netcat 实用程序。
问题: 1.)有没有更好的方法来完成这项任务,不必每次都为我想要推送的每一行数据打开一个 TCP 连接?我每分钟运行一次,这导致大量连接处于 TIME_WAIT 状态。
2.) 我可以使用持久 TCP 套接字一次推送 1000 行吗?我已经查看了 python 中的 netcat 实现,但是当我推送所有行时,它们似乎会导致对等方的连接重置
例如: 当我尝试使用以下方法时,我不断收到错误消息:error(104, 'Connection reset by peer')
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 驱动程序获得连接重置。
-
好的,请 (a) 向我们展示一些示例数据,这样人们就不必猜测它的样子,并且 (b) 更新答案以说明它适用于 20 行左右在失败之前,因为正如所写的那样,它意味着它根本不起作用。
-
同时,如果 OpenTSDB 出于某种原因不喜欢连续获取一大堆单独的命令,那么将它们连接在一起并发送一大批呢?换句话说,当您的循环在 20 之后失败时,
s.sendall(''.join(data_list))是否适用于整整 100 行? -
嗯 - 我在每行之后添加了一个明确的 '\n' 似乎正在工作......非常感谢。由于您的建议/答案在 cmets 中,我无法接受
-
好的,我写了它作为答案,有更多细节。