我按照这篇文章并行运行KMeans。我在EMR上使用了Python 2.7和Spark 2.0.2。
How to run multiple jobs in one Sparkcontext from separate threads in PySpark?
正如帖子所引述的那样,从不同流程提交的工作不应相互影响。
在给定的Spark应用程序(SparkContext实例)中,如果从单独的线程提交多个并行作业,则它们可以同时运行。通过“作业”,在本节中,我们指的是Spark操作(例如,保存,收集)以及需要运行以评估该操作的任何任务。 Spark的调度程序是完全线程安全的,并支持此用例,以支持提供多个请求的应用程序(例如,查询多个用户)。“ http://spark.apache.org/docs/latest/job-scheduling.html
但是,结果模型的簇数K与传入的不同。
代码:
import { MyClass } from 'myaddon';
const obj = new MyClass('data');
结果:(输入K与KMeans实际使用的对比)
from pyspark.ml.clustering import KMeans
from sklearn.datasets.samples_generator import make_blobs
from pyspark.ml.linalg import Vectors
import random
random.seed(1)
group_size = 30
n_groups = 20
n_samples= n_groups * group_size
n_features=2
n_centers=4
xs, ys = make_blobs(n_samples=n_samples, n_features=n_features, centers=n_centers, cluster_std=1.0, center_box=(-10.0, 10.0), shuffle=True, random_state=None)
x_groups = []
for i in range(n_groups):
x_groups.append(xs[i*group_size: (i+1)*group_size])
def do_kmean(xs):
data = []
for x in xs:
data.append((Vectors.dense(x.tolist()),) )
df = spark.createDataFrame(data, ["features"])
num_clusters = random.randint(5,10)
kmeans = KMeans(k=num_clusters, maxIter=1, seed=1, featuresCol="features", predictionCol="prediction")
model = kmeans.fit(df)
return [num_clusters, kmeans.getK()]
from multiprocessing.pool import ThreadPool
tpool = ThreadPool(processes=8)
result = tpool.map(do_kmean, x_groups)
似乎Spark不是线程/进程安全并且访问其他进程的K副本。任何Spark配置都会导致此问题或者这是Spark错误吗?
答案 0 :(得分:1)
这确实是Spark 2.0.2和2.1.0的错误。我能够使用以上两个版本在我的本地计算机上复制该错误。修复了Spark 2.1.1的错误。