Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将任务分发到gcp中的所有工作节点?我正在使用Pypark_Python_Apache Spark_Google Cloud Platform_Pyspark_Google Cloud Dataproc - Fatal编程技术网

Python 如何将任务分发到gcp中的所有工作节点?我正在使用Pypark

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

我已经在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 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会明智地选择在扩展之前进行扩展退出。您可能会发现其他有用的答案: