我有一个Spark集群设置,其中包含一个节点和一个执行程序,以及8个执行程序核心。我正在尝试使用地图功能并行执行“ requests.get”功能。这是伪代码:
sc = SparkContext()
url_list = ["a.com", "b.com", "c.com", .....]
def request(url):
page = requests.get(url)
return page.content
result = sc.parallelize(url_list).map(request).collect()
由于我在配置中设置了8个内核,因此我希望http请求同时在执行程序上发生。但是,它正在按顺序请求。我知道它并不是针对这样的用户案例设计的。但是任何人都可以帮助我了解为什么它不能基于核心号并行运行。另外,如何获得我想要的是在spark执行程序上或在不同执行程序上并行运行请求的
。答案 0 :(得分:0)
尝试sc.parallelize(url_list, 8)
。
不指定切片数,您可能仅在RDD中获得一个分区,因此map
API可能仅启动一个任务来处理该分区,因此request()
将被依次调用该分区的每一行。
您可以检查一下有多少个分区:
rdd = sc.parallelize(url_list) # or with the ,8)
print rdd.getNumPartitions()
rdd.map(...