Scala 如何将代码和数据集分发到工作节点上?

Scala 如何将代码和数据集分发到工作节点上?,scala,apache-spark,apache-spark-sql,apache-spark-mllib,Scala,Apache Spark,Apache Spark Sql,Apache Spark Mllib,我一直在使用数据集Movielens(2000万条记录),并一直在Spark MLlib中使用 我的环境是VirtualBox上的Ubuntu 14.4。我有一个主节点和两个从节点。我使用了发布的apachehadoop、apachespark、Scala和sbt。代码是用Scala编写的 如何将代码和数据集分发到工作节点上 import java.lang.Math._ import org.apache.spark.ml.recommendation.ALS import org.apa

我一直在使用数据集Movielens(2000万条记录),并一直在Spark MLlib中使用

我的环境是VirtualBox上的Ubuntu 14.4。我有一个主节点和两个从节点。我使用了发布的apachehadoop、apachespark、Scala和sbt。代码是用Scala编写的

如何将代码和数据集分发到工作节点上

import java.lang.Math._

import org.apache.spark.ml.recommendation.ALS
import org.apache.spark.ml.recommendation.ALS.Rating
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}

object trainModel extends App {

  val conf = new SparkConf()
    .setMaster("local[*]")
    .setAppName("trainModel")
  val sc = new SparkContext(conf)

  val rawData = sc.textFile("file:///usr/local/spark/dataset/rating.csv")

  val sqlContext = new SQLContext(sc)
  val df = sqlContext
    .read
    .option("header", "true")
    .format("csv")
    .load("file:///usr/local/spark/dataset/rating.csv")

  val ratings = rawData.map(line => line.split(",").take(3) match {
    case Array(userId, movieId, rating) => 
      Rating(userId.toInt, movieId.toInt, rating.toFloat)
  })
  println(s"Number of Ratings in Movie file ${ratings.count()} \n")

  val ratingsRDD = sc.textFile("file:///usr/local/spark/dataset/rating.csv")
  //split data into test&train
  val splits = ratingsRDD.randomSplit(Array(0.8, 0.2), seed = 12345)
  val trainingRatingsRDD = splits(0).cache()
  val testRatingsRDD = splits(1).cache()
  val numTraining = trainingRatingsRDD.count()
  val numTest = testRatingsRDD.count()
  println(s"Training: $numTraining, test: $numTest.")

  val rank = 10
  val lambdas = 0.01
  val numIterations = 10
  val model = ALS.train(ratings, rank, numIterations)
  //Evaluate the model on training data
  val userProducts = ratings.map { case Rating(userId, movieId, rating) =>
    (userId, movieId)
  }
  val predictions = model.predict(userProducts).map { case
    Rating(userId, movieId, rating) =>
    ((userId, movieId), rating)
  }
  val ratesAndPreds = ratings.map { case Rating(userId, movieId, rating) =>
    ((userId, movieId),
      rating)
  }.join(predictions)
  val meanSquaredError = ratesAndPreds.map { case ((userId, movieId),
  (r1, r2)) =>
    val err = r1 - r2
    err * err
  }.mean
  println("Mean Squared Error= " + meanSquaredError)
  sqrt(meanSquaredError)
  val rmse = math.sqrt(meanSquaredError)
  println(s" RMSE = $rmse.")
}

1-数据集最好放在分布式文件系统中-Hadoop HDFS、S3等

2-代码通过spark submit脚本分发,如下所述

如何分发代码

当您提交spark应用程序时,就会发生这种情况。可以按CPU核心/线程或执行器进行分发。您不必编写代码。这就是为什么人们使用火花,因为它应该(几乎)自动发生

conf.setMaster(“本地[*]”)

也就是说,您使用一个执行器,其线程数与CPU核心数相同。那是本地发行的

最好从代码中删除该行,然后使用
spark submit--master
。阅读官方文件,尤其是

…将数据集导入工作节点? val rawData=sc.textFile(“file:///usr/local/spark/dataset/rating.csv))

这行代码说明了Movielens数据集(
rating.csv
)是如何分布的。它与Spark无关,因为Spark使用文件系统上的任何发行版

换句话说,在块大小为256MB(split)的Hadoop HDFS上,一个大小为块大小两倍的文件分为两部分。这就是HDFS,它使文件具有分布式和容错性

Spark读取2-split文件时,分布式计算(使用RDD描述)将使用2个分区和2个任务


HDFS是一个文件系统/存储,因此选择任意位置并
HDFS-put
dataset。将HDFS视为您可以远程访问的任何文件系统。使用位置作为
sc.textFile
的输入参数,您就完成了。

请,您能详细解释一下吗。core-site.xml文件是fs.defaultFShdfs://0.0.0.0:9000 hadoop.tmp.dir/app/hadoop/tmp您是否使用
hdfs-put
命令上载数据集?请这样做,并将文件上载到您选择的位置。将其用作
sc.textFile
的输入参数,您就完成了。非常感谢您的解释和努力。如果答案对您有效,请接受。谢谢。请问,我可以使用eclipse和scala IDE来运行它吗?