在 Ubuntu 14.04 上以 Yarn-Client 模式在 Zeppelin on Spark 中加载外部依赖项
Loading external dependencies in Zeppelin on Spark in Yarn-Client mode on Ubuntu 14.04
亲爱的社区!在我描述问题之前,这里是对正在使用的软件的简短描述(其中后两个是 运行 在一个由三个节点组成的小型集群中,每个节点都使用 Ubuntu 14.04):
- 飞艇 0.6.1
- Spark 2.0.0 以及 Scala 2.11.8
- Hadoop 2.7.3
情况如下:为了在用Zeppelin note写的Spark Streaming应用程序中使用TwitterUtils class,我需要包含org.apache.spark.streaming.twitter._ 来自 Maven (org.apache.bahir:spark-streaming-twitter_2.11:2.0.0-preview)。到目前为止我学到的是,有几个选项可以使 Zeppelin 中的外部依赖项可用:
- 导出SPARK_SUBMIT_OPTIONS变量conf/zeppelin-env.sh并设置-- jars(在我的例子中 --jars hdfs://admdsmaster:54310/global/jars/spark-streaming-twitter_2.11-2.0.0-preview.jar(路径也测试了指向本地文件系统))。
- 导出SPARK_SUBMIT_OPTIONS并设置--packages(在我的例子中--packages org.apache.bahir:spark-streaming-twitter_2.11:2.0.0-预览).
- 在conf/spark-defaults中设置spark.jars或spark.jars.packages .conf 具有上述值。
- 像这样在 Zeppelin 本身中使用 %dep 解释器:z.load("org.apache.bahir:spark-streaming-twitter_2.11:2.0.0-preview")。不过,这已被弃用。
- Zeppelin注释中使用sc.addJar()手动添加.jar文件
在尝试了以上所有方法——以及几乎任意组合和变体——之后,问题是我仍然无法导入 TwitterUtils class来自 Zeppelin 音符:
Class import failing in Zeppelin note.
从图片中还可以看出sc.listJars()的输出,这表明实际上包含了.jar文件。尽管如此,class 导入失败。
我的第一个想法是问题的发生是因为 Spark 运行 处于 yarn-client 模式,所以我也以 yarn-client 模式启动了 Spark shell 并尝试导入 TwitterUtils class 从那里开始——有效:
Class import working from Spark shell.
为了弄清楚是怎么回事,我搜索了 Zeppelin、Spark 和 YARN 的日志文件,但找不到任何错误消息来指出问题的原因。
长话短说:尽管 jar 文件包含在 Zeppelin 中(由 sc.listJars() 证明)并且尽管 class 导入在 yarn-client 模式下从 spark-shell 开始工作,但我无法在我的 Zeppelin note 中进行导入。
长话短说:非常感谢您对如何解决这个问题的想法!
提前感谢您的时间和精力。
P.S.: 很抱歉我无法将图像直接上传到这个 post -- 它说我至少需要 10 个信誉点,但我不需要因为这是我第一次 post 来这里。
按照@eliasah 的建议从解释器选项卡添加依赖项实际上成功了——非常感谢!
对于那些可能 运行 遇到同样问题的人,我将很快描述解决方案并添加一张如何调用 [=35 的图片=]() 实际上应该看起来像(与原始问题中的图片相比)。
转到 Zeppelin 的解释器选项卡并向下滚动或搜索 spark 解释器,然后点击 edit。在可用设置的最底部有一个 Dependencies 部分。在这里添加你的依赖(通过指定 Maven 坐标,例如,在我的例子中 org.apache.bahir:spark-streaming-twitter_2.11:2.0.0-preview)并保存设置。重新启动解释器后,依赖项应该可用。
在我的案例中,执行上述步骤后,对 sc.listJars() 的调用如下所示:
如果将这张图片与原始问题中的第一张图片进行比较,您会发现该列表现在包含更多条目。不过,我仍然想知道为什么 class 导入在只有包含它的 .jar 文件存在时不起作用。无论如何,感谢@eliasah 解决了问题——再次感谢,你应该得到一块饼干! -- 我希望这个简短的描述也能对其他人有所帮助。
亲爱的社区!在我描述问题之前,这里是对正在使用的软件的简短描述(其中后两个是 运行 在一个由三个节点组成的小型集群中,每个节点都使用 Ubuntu 14.04):
- 飞艇 0.6.1
- Spark 2.0.0 以及 Scala 2.11.8
- Hadoop 2.7.3
情况如下:为了在用Zeppelin note写的Spark Streaming应用程序中使用TwitterUtils class,我需要包含org.apache.spark.streaming.twitter._ 来自 Maven (org.apache.bahir:spark-streaming-twitter_2.11:2.0.0-preview)。到目前为止我学到的是,有几个选项可以使 Zeppelin 中的外部依赖项可用:
- 导出SPARK_SUBMIT_OPTIONS变量conf/zeppelin-env.sh并设置-- jars(在我的例子中 --jars hdfs://admdsmaster:54310/global/jars/spark-streaming-twitter_2.11-2.0.0-preview.jar(路径也测试了指向本地文件系统))。
- 导出SPARK_SUBMIT_OPTIONS并设置--packages(在我的例子中--packages org.apache.bahir:spark-streaming-twitter_2.11:2.0.0-预览).
- 在conf/spark-defaults中设置spark.jars或spark.jars.packages .conf 具有上述值。
- 像这样在 Zeppelin 本身中使用 %dep 解释器:z.load("org.apache.bahir:spark-streaming-twitter_2.11:2.0.0-preview")。不过,这已被弃用。
- Zeppelin注释中使用sc.addJar()手动添加.jar文件
在尝试了以上所有方法——以及几乎任意组合和变体——之后,问题是我仍然无法导入 TwitterUtils class来自 Zeppelin 音符:
Class import failing in Zeppelin note.
从图片中还可以看出sc.listJars()的输出,这表明实际上包含了.jar文件。尽管如此,class 导入失败。
我的第一个想法是问题的发生是因为 Spark 运行 处于 yarn-client 模式,所以我也以 yarn-client 模式启动了 Spark shell 并尝试导入 TwitterUtils class 从那里开始——有效:
Class import working from Spark shell.
为了弄清楚是怎么回事,我搜索了 Zeppelin、Spark 和 YARN 的日志文件,但找不到任何错误消息来指出问题的原因。
长话短说:尽管 jar 文件包含在 Zeppelin 中(由 sc.listJars() 证明)并且尽管 class 导入在 yarn-client 模式下从 spark-shell 开始工作,但我无法在我的 Zeppelin note 中进行导入。
长话短说:非常感谢您对如何解决这个问题的想法!
提前感谢您的时间和精力。
P.S.: 很抱歉我无法将图像直接上传到这个 post -- 它说我至少需要 10 个信誉点,但我不需要因为这是我第一次 post 来这里。
按照@eliasah 的建议从解释器选项卡添加依赖项实际上成功了——非常感谢!
对于那些可能 运行 遇到同样问题的人,我将很快描述解决方案并添加一张如何调用 [=35 的图片=]() 实际上应该看起来像(与原始问题中的图片相比)。
转到 Zeppelin 的解释器选项卡并向下滚动或搜索 spark 解释器,然后点击 edit。在可用设置的最底部有一个 Dependencies 部分。在这里添加你的依赖(通过指定 Maven 坐标,例如,在我的例子中 org.apache.bahir:spark-streaming-twitter_2.11:2.0.0-preview)并保存设置。重新启动解释器后,依赖项应该可用。
在我的案例中,执行上述步骤后,对 sc.listJars() 的调用如下所示:
如果将这张图片与原始问题中的第一张图片进行比较,您会发现该列表现在包含更多条目。不过,我仍然想知道为什么 class 导入在只有包含它的 .jar 文件存在时不起作用。无论如何,感谢@eliasah 解决了问题——再次感谢,你应该得到一块饼干! -- 我希望这个简短的描述也能对其他人有所帮助。