下面是我当前的python脚本,它在本地运行,有6个cpu核。
我可以将它转换为pyspark并在hadoop集群中运行它吗 cores
成为 500
?
我有一千个文件要下载,所以我想启动并行进程尽可能多。
请注意,我的函数正在尝试连接到数据源并下载数据文件。
pool = Pool(cores=5)
pool.map(myfunction, arg_list)
pool.close()
def myfunction(args)
(url,account,password,output_file_name) = args
page = requests.get(url, auth=HTTPBasicAuth(account,password), timeout=None)
tables = lh.document_fromstring(page.content)
rows = tables.xpath('//table[@id="Report1_Grid1"]/tr')
body = [[td.text for td in rows[rowindex]] for rowindex in range(1, len(rows))]
tbl = pd.DataFrame(body)
pd.DataFrame.to_csv(output_file_name)
1条答案
按热度按时间yzckvree1#
仅仅在hadoop集群上运行它并不会真正改变任何事情。我在这里假设您当前运行的pc和群集在同一网络中,而您正在下载的服务器不是。然后,您可以将大部分时间花在等待字节通过导线实际到达,而向其投入更多的计算能力不会改变任何事情。
如果你的下行链路是饱和的,你真的不能改变什么。如果您有多个位置(可能您有多个数据中心),那么您可以在每个位置运行一个下载程序,进行处理,然后在单个位置进行聚合。
如果服务器的上行链路有问题(或者服务器只是不想给你更多的字节/秒),而你想从多个服务器下载(或者服务器被“欺骗”给你更多的字节/秒,如果你有多个连接),你可以简单地运行更多的请求,但同样的,你并不需要一个集群。只需增加池大小,在这种io情况下,一个请求不会使一个cpu内核饱和。如果进程开销降低了性能,可以尝试grequests之类的方法。
也可能发生的情况是,你的网卡或者你插入其中的以太网线已经饱和,但是你的网络实际上可以给你更多的下行链路。在这种情况下,在hadoop集群上运行实际上可以提高速度,但是让hadoop集群不真正使用计算能力并不是一件好事。只需找到一个(或者2个或者3个)连接良好的服务器,然后从那里下载,可能有一些像grequests或者更大的池。