0

我正在使用 movielens 数据集将电影信息加载到 spark 程序中,并使用以下代码片段进行打印

import org.apache.spark.{SparkConf, SparkContext}

object MovieApp {

  def main(args: Array[String]) {

    val conf = new SparkConf().setAppName("movie-recommender")
    val sc = new SparkContext(conf)


    val movieFile = "/mnt/DATASETS/ml-1m/movies.dat"

    val movieData = sc.textFile(movieFile)

    val movies = movieData.map(_.split("::") match { case Array(movieid, title, genres) =>
      val genreList = genres.split("|")
      (movieid, title, genreList)
    })

    println("Num movies:" + movies.count())

    movies.foreach { case movielist =>
      println("ID:" + movielist._1 + "Title:" + movielist._2)
    }
  }
}

当我使用命令 spark-submit --master local[4] --class "MovieApp" movie-recommender.jar 运行代码时,我得到了预期的输出

*root@philli ml]# /usr/lib/spark/bin/spark-submit --master local[4] --class "MovieApp" movie-recommender_2.10-1.0.jar

14/12/05 00:17:37 WARN NativeCodeLoader:无法为您的平台加载 native-hadoop 库...在适用的情况下使用内置 java 类

电影数量:3883

ID:2020 标题:危险关系 (1988)

ID:2021 标题:沙丘 (1984)

ID:2022 标题:基督的最后诱惑 (1988)

ID:2023 标题:教父:第三部分,The (1990)

ID:2024 标题:Rapture, The (1991)

ID:2025 标题:洛丽塔 (1997)

ID:2026 标题:令人不安的行为 (1998)

ID:2027 标题:黑手党!(1998)

ID:2028 标题:拯救大兵瑞恩 (1998)

ID:2029 标题:比利的好莱坞银幕之吻 (1997)

... *

但是当我使用命令在hadoop集群上运行相同的

spark-submit --master yarn-client --class "MovieApp" movie-recommender.jar 输出不同如下(没有电影细节???)

*[root@philli ml]# /usr/lib/spark/bin/spark-submit --master yarn-client --class "MovieApp" movie-recommender_2.10-1.0.jar

14/12/05 00:21:05 WARN NativeCodeLoader:无法为您的平台加载 native-hadoop 库...在适用的情况下使用内置 java 类 14/12/05 00:21:07 WARN BlockReaderLocal:短路无法使用本地读取功能,因为无法加载 libhadoop。--args 已弃用。请改用 --arg 。电影数量:3883 [root@philli ml]# *

为什么程序的行为应该在以本地方式运行与在集群上运行之间发生变化......我使用命令为 hadoop 构建了 spark-1.1.1

mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests 清洁包

我使用的集群是HDP2.1

示例movies.dat 文件如下:

1::玩具总动员 (1995)::动画|儿童|喜剧

2::Jumanji (1995)::冒险|儿童|奇幻

3::脾气暴躁的老人 (1995)::喜剧|浪漫

4::等待呼气 (1995)::喜剧|戏剧

5::新娘之父第二部分 (1995)::喜剧

6::Heat (1995)::动作|犯罪|惊悚

7::萨布丽娜 (1995)::喜剧|爱情

8::汤姆和哈克 (1995)::冒险|儿童

9::猝死 (1995)::动作

10::GoldenEye (1995)::动作|冒险|惊悚

4

1 回答 1

1

当您在集群上运行程序时,foreach闭包将在工作人员中执行,因此println 正在发生,但在工作人员stdout而不是驱动程序上。

查看纱线日志,您将找到预期的输出。

于 2014-12-06T13:25:45.520 回答