这篇文章主要介绍了Jupyter notebook运行Spark+Scala教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

 

今天在intellij调试spark的时候感觉每次有新的一段代码,都要重新跑一遍,如果用spark-shell,感觉也不是特别方便,如果能像python那样,使用jupyter notebook进行编程就很方便了,同时也适合代码展示,网上查了一下,试了一下,碰到了很多坑,有些是旧的版本,还有些是版本不同导致错误,这里就记录下来安装的过程。

1.运行环境

硬件:Mac

事先装好:Jupyter notebook,spark2.1.0,scala 2.11.8 (这个版本很重要,关系到后面的安装)

2.安装

2.1.scala kernel

从github下载

git clone https://github.com/jupyter-scala/jupyter-scala.git

进入下载的jupyter-scala目录下,运行

bash jupyter-scala

然后查看

jupyter kernelspec list

Jupyter notebook运行Spark+Scala教程_Jupyter notebook

表示scala已经嵌入到jupyter notebook

2.2.spark kernel

这个也比较好装,但是要注意版本问题,我们用的是toree来装的,首先要安装toree

网上的教程通常直接

pip install toree

但是这个下载的是0.1.0版本,该版本的话问题是,后面装spark kernel后,在jupyter运行spark的时候,默认选的是scala2.10.4版本,会有以下的错误

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

[I 03:15:16.677 NotebookApp] Kernel started: 94a63354-d294-4de7-a12c-2e05905e0c45

Starting Spark Kernel with SPARK_HOME=/usr/local/spark

16/11/20 03:15:18 [INFO] o.a.t.Main$$anon$1 - Kernel version: 0.1.0.dev8-incubating-SNAPSHOT

16/11/20 03:15:18 [INFO] o.a.t.Main$$anon$1 - Scala version: Some(2.10.4)

16/11/20 03:15:18 [INFO] o.a.t.Main$$anon$1 - ZeroMQ (JeroMQ) version: 3.2.2

16/11/20 03:15:18 [INFO] o.a.t.Main$$anon$1 - Initializing internal actor system

Exception in thread "main" java.lang.NoSuchMethodError: scala.collection.immutable.HashSet$.empty()Lscala/collection/immutable/HashSet;

    at akka.actor.ActorCell$.336)

    at akka.actor.ActorCell$.

    at akka.actor.RootActorPath.$div(ActorPath.scala:185)

    at akka.actor.LocalActorRefProvider.465)

    at akka.actor.LocalActorRefProvider.453)

    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

    at akka.actor.ReflectiveDynamicAccess$$anonfun$createInstanceFor$2.apply(DynamicAccess.scala:78)

    at scala.util.Try$.apply(Try.scala:192)

    at akka.actor.ReflectiveDynamicAccess.createInstanceFor(DynamicAccess.scala:73)

    at akka.actor.ReflectiveDynamicAccess$$anonfun$createInstanceFor$3.apply(DynamicAccess.scala:84)

    at akka.actor.ReflectiveDynamicAccess$$anonfun$createInstanceFor$3.apply(DynamicAccess.scala:84)

    at scala.util.Success.flatMap(Try.scala:231)

    at akka.actor.ReflectiveDynamicAccess.createInstanceFor(DynamicAccess.scala:84)

    at akka.actor.ActorSystemImpl.liftedTree1$1(ActorSystem.scala:585)

    at akka.actor.ActorSystemImpl.578)

    at akka.actor.ActorSystem$.apply(ActorSystem.scala:142)

    at akka.actor.ActorSystem$.apply(ActorSystem.scala:109)

    at org.apache.toree.boot.layer.StandardBareInitialization$class.createActorSystem(BareInitialization.scala:71)

    at org.apache.toree.Main$$anon$1.createActorSystem(Main.scala:35)

    at org.apache.toree.boot.layer.StandardBareInitialization$class.initializeBare(BareInitialization.scala:60)

    at org.apache.toree.Main$$anon$1.initializeBare(Main.scala:35)

    at org.apache.toree.boot.KernelBootstrap.initialize(KernelBootstrap.scala:72)

    at org.apache.toree.Main$delayedInit$body.apply(Main.scala:40)

    at scala.Function0$class.apply$mcV$sp(Function0.scala:34)

    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)

    at scala.App$$anonfun$main$1.apply(App.scala:76)

    at scala.App$$anonfun$main$1.apply(App.scala:76)

    at scala.collection.immutable.List.foreach(List.scala:381)

    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)

    at scala.App$class.main(App.scala:76)

    at org.apache.toree.Main$.main(Main.scala:24)

    at org.apache.toree.Main.main(Main.scala)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    at java.lang.reflect.Method.invoke(Method.java:498)

    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:736)

    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:185)

    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:210)

    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:124)

    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

[W 03:15:26.738 NotebookApp] Timeout waiting for kernel_info reply from 94a63354-d294-4de7-a12c-2e05905e0c45

这个错误太可怕了,就是版本不对,因为spark2.1.0对应的是scala2.11版本的

所以要用下面的方式下载0.2.0版本

pip install https://dist.apache.org/repos/dist/dev/incubator/toree/0.2.0/snapshots/dev1/toree-pip/toree-0.2.0.dev1.tar.gz

后面就可以安装spark kernel了

jupyter toree install --interpreters=Scala --spark_home=/usr/local/Cellar/apache-spark/2.1.0/libexec --user --kernel_name=apache_toree --interpreters=PySpark,SparkR,Scala,SQL

其中spark_home指的是你的spark的安装目录,记住这个安装目录必须到spark中有python之前,比如我的spark中的python(spark中的python文件夹,不是我们自己装的那个)在 /usr/local/Cellar/apache-spark/2.1.0/libexec

查看结果

jupyter kernelspec list

Jupyter notebook运行Spark+Scala教程_Spark+Scala_02

安装成功

3.打开jupyter notebook查看效果

Jupyter notebook运行Spark+Scala教程_Spark+Scala_03

有这么多选项,可以快乐的用jupyter notebook进行spark了