使用K-Means的Apache SparkML死慢,拥有550万个jdbc记录

时间:2016-03-29 09:31:13

标签: java sql-server-2008 jdbc apache-spark apache-spark-mllib

tomcat服务器基于Web的应用程序中的本地模式中使用 apache spark 1.6 ,并且该计算机具有 64GB的RAM 16个核心

Tomcat被分配​​了20GB的内存。初始化spark上下文时, spark驱动程序和执行程序都被分配了15GB的内存。

虽然数据库( MS SQL Server 2008 R2 )表包含550万条记录和200列。

问题:

  • 当执行k-means算法时,它停留在jdbc操作 (可能从数据库表读取数据 - aprox。检索25分钟)。
  • K意味着自己在约7分钟内完成工作。
  • 然后再次卡住(可能会将结果写回新表中的数据库 - 永远不会返回两小时直到手动杀死该作业)。

问题#需要建议将性能提高到可接受的时间,我们预计整个工作完成或可能在10分钟左右?任何指导都将不胜感激。

执行spark mlib k-means的代码段

DataFrame dataFrame = sparkContextSQL.read().format("jdbc").options(options).load();
JavaRDD<Row> javaRDD = dataFrame.toJavaRDD();
JavaRDD<Vector> javaRddVector = javaRDD.map(new NumericFieldsToVector());
javaRddVector.cache();

// model configurations
int numberOfClusters = 5;
int numberOfIterations = 20;

KMeansModel kmeansModel = KMeans.train(javaRddVector.rdd(), numberOfClusters, numberOfIterations);
JavaRDD<Row> rowsWithClusterPrediction = javaRDD.map(new FieldsWithClusterNumber(kmeansModel));

javaRddVector.unpersist();

// ========== create new-schema
List<StructField> newFields = new ArrayList<>(Arrays.asList(dataFrame.schema().fields()));
newFields.add(DataTypes.createStructField("cluster_number", DataTypes.StringType, true));
StructType newSchema = DataTypes.createStructType(newFields);
DataFrame newDataFrame = sparkContextSQL.createDataFrame(rowsWithClusterPrediction, newSchema);

// Save newDataFrame into Database Table
String tableName = "kmeans" + UUID.randomUUID().toString().replaceAll("-", "");
newDataFrame.write().jdbc(fullUrl, tableName, new Properties());

0 个答案:

没有答案