运行 外部 EC2 上的 Zeppelin 连接到 Amazon EMR

Running Zeppelin on an external EC2 to connect to an Amazon EMR

我想分享我在 EC2 上设置 zeppelin 服务器并将其连接到 EMR 以利用其计算能力的经验。

Zeppelin 0.7.3 与 spark 2.3.0 不兼容,但当您通过向导选项设置 EMR 时,您可以同时使用它们。在这里,我想下载并安装 zeppelin 0.7.3 以及 spark 2.2.1,以便能够将其连接到 EMR 5.11.0。

此 link 中记录了主要步骤: Running an External Zeppelin Instance using S3 Backed Notebooks with Spark on Amazon EMR

然而,本教程适用于旧版本的 zeppelin 和 spark,它工作正常,但当涉及到新版本的 spark 和 zeppelin 时,事情就有点棘手了。我尝试对 zeppelin 0.7.3 和 spark 2.2.1 执行相同的步骤,但是当我在 zeppelin 控制台中尝试 sc.version 时,我曾经遇到以下错误:

java.lang.NullPointerException
at org.apache.zeppelin.spark.Utils.invokeMethod(Utils.java:38)
at org.apache.zeppelin.spark.Utils.invokeMethod(Utils.java:33)
at org.apache.zeppelin.spark.SparkInterpreter.createSparkContext_2(SparkInterpreter.java:398)
at org.apache.zeppelin.spark.SparkInterpreter.createSparkContext(SparkInterpreter.java:387)
at org.apache.zeppelin.spark.SparkInterpreter.getSparkContext(SparkInterpreter.java:146)
at org.apache.zeppelin.spark.SparkInterpreter.open(SparkInterpreter.java:843)
at org.apache.zeppelin.interpreter.LazyOpenInterpreter.open(LazyOpenInterpreter.java:70)
at org.apache.zeppelin.interpreter.remote.RemoteInterpreterServer$InterpretJob.jobRun(RemoteInterpreterServer.java:491)
at org.apache.zeppelin.scheduler.Job.run(Job.java:175)
at org.apache.zeppelin.scheduler.FIFOScheduler.run(FIFOScheduler.java:139)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access1(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

我花了几天时间才找到解决办法。解决方法是在zeppelin-env.sh文件中添加如下几行:

export SPARK_HOME=/home/ec2-user/spark
export HADOOP_CONF_DIR=/home/ec2-user/hadoopconf
export MASTER=yarn
export HADOOP_USER_NAME=hdfs

特别是最后一行定义了zeppelin在EMR上访问hadoop的用户

这与 zeppelin 0.8.0 和 spark 2.3.0 的情况相同。

我希望这对某人有用! :)