【问题标题】:How to use TwitterUtils in Spark shell?如何在 Spark shell 中使用 TwitterUtils?
【发布时间】:2014-09-24 22:42:41
【问题描述】:

我正在尝试在 Spark Shell 中使用 twitterUtils(默认情况下它们不可用)。

我已将以下内容添加到spark-env.sh

SPARK_CLASSPATH="/disk.b/spark-master-2014-07-28/external/twitter/target/spark-streaming-twitter_2.10-1.1.0-SNAPSHOT.jar"

我现在可以执行了

import org.apache.spark.streaming.twitter._
import org.apache.spark.streaming.StreamingContext._

shell 中没有错误,如果不将 jar 添加到类路径中,这是不可能的(“错误:对象 twitter 不是包 org.apache.spark.streaming 的成员”)。 但是,在 Spark shell 中执行此操作时会出现错误:

scala> val ssc = new StreamingContext(sc, Seconds(1))
ssc: org.apache.spark.streaming.StreamingContext =
org.apache.spark.streaming.StreamingContext@6e78177b

scala> val tweets = TwitterUtils.createStream(ssc, "twitter.txt")
error: bad symbolic reference. A signature in TwitterUtils.class refers to
term twitter4j in package <root> which is not available.
It may be completely missing from the current classpath, or the version on the classpath might be incompatible with the version used when compiling
TwitterUtils.class.

我错过了什么?我必须导入另一个 jar 吗?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    是的,除了您已经拥有的 spark-streaming-twitter 之外,您还需要 Twitter4J JAR。具体来说,the Spark devs suggest using Twitter4J version 3.0.3

    下载正确的 JAR 后,您需要通过 --jars 标志将它们传递给 shell。我想你也可以像你一样通过SPARK_CLASSPATH 做到这一点。

    这是我在 Spark EC2 集群上的做法:

    #!/bin/bash
    cd /root/spark/lib
    mkdir twitter4j
    
    # Get the Spark Streaming JAR.
    curl -O "http://search.maven.org/remotecontent?filepath=org/apache/spark/spark-streaming-twitter_2.10/1.0.0/spark-streaming-twitter_2.10-1.0.0.jar"
    
    # Get the Twitter4J JARs. Check out http://twitter4j.org/archive/ for other versions.
    TWITTER4J_SOURCE=twitter4j-3.0.3.zip
    curl -O "http://twitter4j.org/archive/$TWITTER4J_SOURCE"
    unzip -j ./$TWITTER4J_SOURCE "lib/*.jar" -d twitter4j/
    rm $TWITTER4J_SOURCE
    
    cd
    # Point the shell to these JARs and go!
    TWITTER4J_JARS=`ls -m /root/spark/lib/twitter4j/*.jar | tr -d '\n'`
    /root/spark/bin/spark-shell --jars /root/spark/lib/spark-streaming-twitter_2.10-1.0.0.jar,$TWITTER4J_JARS
    

    【讨论】:

    • 这个配方不适用于我使用 spark 1.6。我从这个 curl 操作中下载了每个 jar,当我尝试启动 spark-shell 时,我得到了这个:pastebin.com/CKQqXMDz
    • @aironman - 自从我写下这个答案以来,Spark 发生了很大变化。如果您 1) 能够在没有这些 Twitter 库的情况下成功运行 Spark,并且 2) 无法进一步简化您的问题,我建议您提出一个新问题。您发布的跟踪没有给我任何关于问题所在的线索。
    【解决方案2】:

    除了手动添加依赖项之外,您还可以做的另一件事是创建一个虚拟 sbt 项目,添加 sbt-assembly 插件,列出您的依赖项坐标在构建.sbt 中,然后运行sbt assembly,然后将SPARK_CLASSPATH 指向生成的胖罐。这样 sbt 就可以完成下载和绑定 jar 的繁重工作,而不是你自己。

    【讨论】:

      【解决方案3】:

      在spark-home下创建一个目录如:

      ~/spark-2.0.0-bin-hadoop2.7/ext-jars/

      对于所有外部jar文件并将所有jar文件放在该目录中

      在 spark-defaults.conf 中添加以下行

      spark.driver.extraClassPath ~/spark-2.0.0-bin-hadoop2.7/ext-jars/* spark.executor.extraClassPath ~/spark-2.0.0-bin-hadoop2.7/ext-jars/*

      【讨论】:

        猜你喜欢
        • 2016-07-15
        • 1970-01-01
        • 2015-02-01
        • 2018-01-27
        • 2019-07-13
        • 1970-01-01
        • 2015-11-12
        • 2015-03-25
        相关资源
        最近更新 更多