【发布时间】:2016-03-04 03:26:20
【问题描述】:
EDIT#2:这可能与内存有关。日志显示堆外。
是的,肯定与内存有关。 基本上 docker logs 报告所有 来自java的堆外溢出,但jupyter网络笔记本不会将其传递给用户。相反,用户会遇到内核故障和偶尔出现的奇怪行为,例如代码编译不正确。
Spark 1.6,尤其是docker run -d .... jupyter/all-spark-notebook
想要统计大约 100 万笔交易的文件中的帐户。
这很简单,它可以在没有火花的情况下完成,但我在尝试使用 spark scala 时遇到了一个奇怪的错误。
输入数据是 RDD[etherTrans] 类型,其中 etherTrans 是包含单个交易的自定义类型:时间戳、来自和至帐户以及以以太币交易的价值。
data:RDD[etherTrans] 看起来不错:
下一个函数可以解析并以这种方式编写,因为之前的尝试抱怨Array[String] 或List[String] 和TraversableOnce[?] 之间的类型不匹配:
def arrow(e:etherTrans):TraversableOnce[String] = Array(e.afrom,e.ato)
但随后将此函数与 flatMap 一起使用以获取所有帐户的 RDD[String] 失败。
val accts:RDD[String] = data.flatMap(arrow) 名称:编译错误 消息::38:错误:类型不匹配; 找到:etherTrans(在 $iwC 类中)(在 $iwC 类中)(在 $iwC 类中)(在 $iwC 类中)=> TraversableOnce [String] 必需:etherTrans(在 $iwC 类中)(在 $iwC 类中)(在 $iwC 类中)(在 $iwC 类中)=> TraversableOnce[String] val accts:RDD[String] = data.flatMap(arrow) ^ 堆栈跟踪:确保您向右滚动以查看它抱怨TraversableOnce[String]
不匹配TraversableOnce[String]
这一定是一个相当普遍的问题,因为在Generate List of Pairs 中出现了更明显的类型不匹配,虽然没有足够的上下文,但在I have a Scala List, how can I get a TraversableOnce? 中提出了建议。
这里发生了什么?
编辑:上面报告的问题没有出现,并且代码在较旧的 spark-shell 中运行良好,Spark 1.3.1 在 docker 容器中独立运行。在使用 jupyter/all-spark-notebook docker 容器的 spark 1.6 scala jupyter 环境中运行时会产生错误。
@zero323 还说这个玩具示例:
val rdd = sc.parallelize(Seq((1L, "foo", "bar", 1))).map{ case (ts, fr, to, et) => new etherTrans(ts, fr, to, et) } rdd.flatMap(箭头).collect在终端 spark-shell 1.6.0/spark 2.10.5 和 Scala 2.11.7 和 Spark 1.5.2 中为他工作。
【问题讨论】:
-
对我来说很好用。你测试过这个外部笔记本吗?
-
不,我没有。让我看看docker容器里有没有spark shell...
-
@zero323 在 docker 容器中有一个 spark shell,但我在读取文本数据时遇到了一些奇怪的内存问题。你如何测试这个?您是在 spark-shell 中还是使用编译器测试编译问题?如果您正在运行它,您是对我转储的数据调用 sc.parallelize 还是其他什么?当然,您不必运行它来测试编译。
-
就在火花壳中。像这样:
val rdd = sc.parallelize(Seq((1L, "foo", "bar", 1))).map{ case (ts, fr, to, et) => new etherTrans(ts, fr, to, et)} rdd.flatMap(arrow).collect -
我不认为编译器会抱怨,但让我检查一下。我怀疑在某些时候类定义可以重新编译,但箭头不能。
标签: scala apache-spark