Python 如何将任务分发到gcp中的所有工作节点?我正在使用Pypark
我已经在gcpdataproc中创建了一个集群,其中包含1个主节点(clus-m)和两个工作节点(clus-w-0,clus-w-1)。 现在使用pyspark rdd,我想分发一个任务,以便所有节点都参与其中。 下面是我的代码片段Python 如何将任务分发到gcp中的所有工作节点?我正在使用Pypark,python,apache-spark,google-cloud-platform,pyspark,google-cloud-dataproc,Python,Apache Spark,Google Cloud Platform,Pyspark,Google Cloud Dataproc,我已经在gcpdataproc中创建了一个集群,其中包含1个主节点(clus-m)和两个工作节点(clus-w-0,clus-w-1)。 现在使用pyspark rdd,我想分发一个任务,以便所有节点都参与其中。 下面是我的代码片段 def pair_dist(row): dissimlarity = 0 Z = row[0].split(',') X = row[1].split(',') for j in range(len(Z)): if
def pair_dist(row):
dissimlarity = 0
Z = row[0].split(',')
X = row[1].split(',')
for j in range(len(Z)):
if Z[j] != X[j]:
dissimlarity += 1
return str(dissimlarity) + **os.uname()[1]**
sc = SparkContext.getOrCreate()
rdd = sc.textFile( "input.csv" )
rdd = sc.parallelize(rdd.take(5))
rdd = rdd.cartesian(rdd)
dist = rdd.map(lambda x: pair_dist(x)).collect()
dist = np.array(dist).reshape((5,5))
print(dist)
sc.stop()
为了检查它是否正确发生,我将主机名与结果放在一起。
但是我总是在结果中得到主机名clus-m,而不是工作节点的主机名
输出:
[0clus-m 2clus-m。。。。。。
1clus-m 0clus-m……]5x5
请建议我到底需要做什么?要分发工作,必须对输入数据集进行切分。由于您使用的是
sc.textFile(“input.csv”)
您将有一个单独的映射器读取该文件
例如,如果输入数据集通过转换大量增加,则可以RDD.repartition
使后续操作更好地并行化
您最好将输入拆分为多个文件
以下几点与您的问题相关:
Spark的所有基于文件的输入方法,包括textFile,都支持
在目录、压缩文件和通配符上运行。对于
例如,您可以使用textFile(“/my/directory”),
textFile(“/my/directory/.txt”)和textFile(“/my/directory/.gz”)
textFile方法还为
控制文件的分区数。默认情况下,Spark
为文件的每个块创建一个分区(块为128MB
默认情况下在HDFS中),但您也可以请求更高数量的
通过传递更大的值进行分区。请注意,您不能拥有更少的
分区比块大
谢谢你提供的信息。我做了分区,想再次检查主机名。但是得到了同样的结果。下面是代码片段<代码>定义主机名(行):返回os.uname()[1]data=pd.read_csv(“input.csv”,header=None)data=numpy.array(data)rdd=sc.parallelize(data)rdd=rdd.redpartition(3)打印(rdd.getNumPartitions())rdd=rdd.cartesian(rdd)打印(rdd.count())dist=rdd.map(lambda x:hostname(x)).collect()dist=np.array(dist).重塑((120120))打印(dist)基本上我想检查map()的集合应该显示所有vm的主机名,或者我需要先手动配置hadoop?就像在/etc/host文件中提到不同的从属节点、ip一样?Dataproc应该是现成的,不需要配置任何东西。请记住,在节点之间分发数据会增加延迟,因此Spark/Thread会明智地选择在扩展之前进行扩展退出。您可能会发现其他有用的答案: