복붙노트

[SCALA] java.lang.NoClassDefFoundError가 : 조직 / 아파치 / 스파크 / 스트리밍 / 트위터 / TwitterUtils $ TwitterPopularTags을 실행하는 동안

SCALA

java.lang.NoClassDefFoundError가 : 조직 / 아파치 / 스파크 / 스트리밍 / 트위터 / TwitterUtils $ TwitterPopularTags을 실행하는 동안

나는 스파크 스트리밍 및 스칼라에서 초보자입니다. 프로젝트 요구 사항을 위해 나는 GitHub의에 존재 TwitterPopularTags의 예제를 실행하려고했다. SBT으로 어셈블리는 나를 위해 작동하지 않는 그리고 내가 건물에 대한 메이븐을 사용하는 것을 시도하고있다 SBT에 익숙하지 않았다. 초기 딸꾹질을 많이 후, 나는 jar 파일을 생성 할 수 있었다. 그러나 그것을 실행하는 동안 나는 다음과 같은 오류를 얻고있다. 사람이 해결에 나를 도와 드릴까요?

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/streaming/twitter/TwitterUtils$
    at TwitterPopularTags$.main(TwitterPopularTags.scala:43)
    at TwitterPopularTags.main(TwitterPopularTags.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:331)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.streaming.twitter.TwitterUtils$
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 9 more

나는 다음과 같은 종속성을 추가 한 스파크 - streaming_2.10 : 1.1.0 스파크 - core_2.10 : 1.1.0 스파크 스트리밍-twitter_2.10을 : 1.1.0

난 불꽃 스트리밍 - 트위터의 1.2.0을 시도했지만 그 또한 나에게 같은 오류를주고 있었다.

사전에 도움을 주셔서 감사합니다.

문안 인사, VPV

해결법

  1. ==============================

    1.귀하의 제안을 제공 주셔서 감사합니다. 난 단지 SBT 어셈블리를 사용하여이 문제를 해결할 수 있었다. 다음은 내가 이런 짓을하는 방법에 관한 세부 사항입니다.

    귀하의 제안을 제공 주셔서 감사합니다. 난 단지 SBT 어셈블리를 사용하여이 문제를 해결할 수 있었다. 다음은 내가 이런 짓을하는 방법에 관한 세부 사항입니다.

    스파크 - 클라우 데라 VM에 이미 존재 스칼라 - 확실하지 이것은 우리가 설치할 수없는 경우, 클라우 데라에있는 경우 SBT -이 또한 설치해야합니다. 나는 내 로컬 컴퓨터에 모두 설치 횟수를했고, VM에 항아리를 옮겼다. 이 설치를 위해 나는 다음과 같은 링크를 사용

    https://gist.github.com/visenger/5496675

    1) 모든 생성되면. 우리는 우리의 프로젝트에 대한 상위 폴더를 만들어야합니다. 나는 트위터라는 폴더를 만들었습니다.

    2) 다음과 같은 구조 트위터 / SRC / 메인 / 스칼라와 다른 폴더를 만들고 이름 TwitterPopularTags.scala이 폴더에 .scala 파일을 만들었습니다. 이것은 우리가 GitHub의에서 가져온 코드에서 약간의 변화가 있습니다. 나는 import 문을 변경했다

    import org.apache.spark.streaming.Seconds
    import org.apache.spark.streaming.StreamingContext
    import org.apache.spark.streaming.StreamingContext._
    import org.apache.spark.SparkContext._
    import org.apache.spark.streaming.twitter._
    import org.apache.spark.SparkConf
    

    3)이 후, 다음과 같은 이름을 가진 부모 폴더에서 다른 폴더를 만들

    트위터 / 프로젝트

    그리고 이름 assembly.sbt을 가진 파일을 만듭니다. 이 어셈블리 플러그인의 경로를 가지고있다. 다음은 파일의 전체 코드 존재입니다.

    resolvers += Resolver.url("sbt-plugin-releases-scalasbt", url("http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/"))
    
    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
    

    위의 두 가지가 생성되면 4), 이름 build.sbt와 프로젝트 (트위터)의 부모 디렉토리에 파일을 만듭니다. 우리는 또한 종속성을 작성하는 데 필요한 .JAR 파일의 이름을 제공해야하는 곳이다. 이 파일의 코드 사이에도 빈 줄이 중요하다는 것을 유의하시기 바랍니다.

    name := "TwitterPopularTags"
    
    version := "1.0"
    
    mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
       {
        case PathList("META-INF", xs @ _*) => MergeStrategy.discard
        case x => MergeStrategy.first
       }
    }
    
    libraryDependencies += "org.apache.spark" %% "spark-core" % "1.1.0" % "provided"
    
    libraryDependencies += "org.apache.spark" %% "spark-streaming" % "1.1.0" % "provided"
    
    libraryDependencies += "org.apache.spark" %% "spark-streaming-twitter" % "1.2.0" 
    
    libraryDependencies += "org.twitter4j" % "twitter4j-stream" % "3.0.3" 
    
    resolvers += "Akka Repository" at "http://repo.akka.io/releases/"
    

    5) 마지막으로 우리는 터미널을 열고 프로젝트 (트위터)의 상위 폴더로 이동합니다. 여기에서 다음 명령을 입력 :

    sbt assembly
    

    이 종속성을 다운로드하고 우리가 필요로하는 jar 파일을 생성합니다.

    6) 우리는 우리의 ID로 작성된 트위터 응용 프로그램을 필요로하는 프로그램을 실행하고 인증 토큰 및 기타 세부 사항을 제공하기 위해. 이 링크는 다음의 존재 만드는 방법에 대한 자세한 단계.

    http://ampcamp.berkeley.edu/3/exercises/realtime-processing-with-spark-streaming.html

    7) 우리가 일단 위의 모든 우리가 작업을 실행하기 위해 VM에서 스파크 제출 명령을 사용할 수 있습니다 다. 예제 명령은

    ./bin/spark-submit \
      --class TwitterPopularTags \
      --master local[4] \
      /path/to/TwitterPopilarTags.jar \
      comsumerkey consumersecret accesstoken accesssecret 
    

    8)이 콘솔 출력 그래서 빈도를 줄이기 위해 더 출력을 모니터링하는 인쇄 코드를 조정하여.

    더 자세한 내용이 필요한 경우 알려 주시기 바랍니다.

    감사 및 감사

    VPV

  2. ==============================

    2.(확실히 1.5.1로하지만 어쩌면 너무 이전 버전에서 작동) 쉬운 솔루션을 찾을 수 :

    (확실히 1.5.1로하지만 어쩌면 너무 이전 버전에서 작동) 쉬운 솔루션을 찾을 수 :

    --packages 매개 변수와 함께 제출 Maven은 같은 좌표 :

    spark-submit --master local[*] \
        --class TwitterStreaming \
        --packages "org.apache.spark:spark-streaming-twitter_2.10:1.5.1" \
        ${PATH_TO_JAR_IN_TARGET}
    

    에 설명

    http://spark.apache.org/docs/latest/programming-guide.html#using-the-shell

  3. ==============================

    3.이 오류는 단순히 (그렇지 않으면 당신은 받는다는 빌드 할 수 없기 때문에) 런타임 TwitterUtils 클래스에서 (또는 스칼라 언어 TwitterUtils 개체) 그러나 컴파일시에이 제시 제시되지 않음을 의미합니다. 당신은 당신이 참으로 만든 jar 파일을 클래스 / 객체가 포함되어 있는지 확인해야합니다. 당신은 단순히 실제로 포함되어있는 것을 볼 수있는 그 jar 파일을 압축을 해제 할 수 있습니다. 대부분의 가능성이 받는다는 빌드 파일은 프로젝트를 빌드 의존성을 사용하지만, 결국 최종 항아리에 포함되지 않습니다.

    이 오류는 단순히 (그렇지 않으면 당신은 받는다는 빌드 할 수 없기 때문에) 런타임 TwitterUtils 클래스에서 (또는 스칼라 언어 TwitterUtils 개체) 그러나 컴파일시에이 제시 제시되지 않음을 의미합니다. 당신은 당신이 참으로 만든 jar 파일을 클래스 / 객체가 포함되어 있는지 확인해야합니다. 당신은 단순히 실제로 포함되어있는 것을 볼 수있는 그 jar 파일을 압축을 해제 할 수 있습니다. 대부분의 가능성이 받는다는 빌드 파일은 프로젝트를 빌드 의존성을 사용하지만, 결국 최종 항아리에 포함되지 않습니다.

  4. ==============================

    4.이런 식으로 해보려고 ...

    이런 식으로 해보려고 ...

    ./bin/spark-submit \
      --class TwitterPopularTags \
      --jars (external_jars like twitter4j,streaming-twitter) \
      --master local[4] \
      /path/to/TwitterPopilarTags.jar \
    

    comsumerkey consumersecret accesstoken accesssecret

  5. ==============================

    5.

        **I have the same problem and I am not able to fix**
    
    
        name := "SentimentAnalyser"
    
        version := "0.1"
    
        scalaVersion := "2.11.11"
    
    
    
        libraryDependencies += "org.apache.spark" % "spark-core_2.11" % "2.2.0"
    
        // https://mvnrepository.com/artifact/org.apache.spark/park-streaming-twitter_2.11
    
        // https://mvnrepository.com/artifact/org.apache.spark/spark-streaming_2.11
        libraryDependencies += "org.apache.spark" % "spark-streaming-twitter_2.11" % "2.0.0"
        libraryDependencies += "org.apache.spark" % "spark-streaming_2.11" % "2.2.0"
    
        package com
    
        import org.apache.spark.SparkConf
        import org.apache.spark.streaming.{Seconds, StreamingContext}
        import org.apache.spark.streaming.twitter.TwitterUtils
    
        object Sentiment {
    
          def main(args: Array[String]): Unit = {
    
            if(args.length<4){
              System.out.print("Enter Consumer Key (API Key) Consumer Secret (API Secret)Access Token Access Token Secret")
              System.exit(1);
            }
    
            val Array(customer_key,customer_secrect,access_token,access_token_secret)=args.take(4)
    
            System.setProperty("twiteer4j.oauth.consumerKey",customer_key)
            System.setProperty("twiteer4j.oauth.customerSecret",customer_secrect)
            System.setProperty("twiteer4j.oauth.accessToken",access_token)
            System.setProperty("twiteer4j.oauth.accessTokenSecret",access_token_secret)
    
            val conf=new SparkConf().setAppName("Sentiment").setMaster("local")
            val scc=new StreamingContext(conf,Seconds(30))
            //Dstream
            val stream=TwitterUtils.createStream(scc,None)
    
            val hashTag=stream.flatMap(status=>{status.getText.split(" ").filter(_.startsWith("#"))})
    
            val topHashTag60=hashTag.map((_,1)).reduceByKeyAndWindow(_+_,Seconds(60))
              .map{case (topic,count)=>(topic,count)}.transform(_.sortByKey(false))
    
            val topHashTag10=hashTag.map((_,1)).reduceByKeyAndWindow(_+_,Seconds(10))
              .map{case (topic,count)=>(topic,count)}.transform(_.sortByKey(false))
    
    
            topHashTag60.foreachRDD(rdd=>{
              val topList=rdd.take(10)
              println("Popular topic in last 60 sec (%s total)".format(rdd.count()))
              topList.foreach{case (count,tag)=>println("%s (%s tweets)".format(tag,count))}
            })
    
            topHashTag10.foreachRDD(rdd=>{
              val topList=rdd.take(10)
              println("Popular topic in last 10 sec (%s total)".format(rdd.count()))
              topList.foreach{case (count,tag)=>println("%s (%s tweets)".format(tag,count))}
            })
    
    
            scc.start()
            scc.awaitTermination()
    
    
    
    
    
    
    
    
          }
    
        }
    
    
    
    
    
    
    I build jar using artifact in IJ ..
    
    
    spark-submit --class com.Sentiment  /root/Desktop/SentimentAnalyser.jar XX XX XX XX
    
    
    ERROR:
    17/10/29 01:22:24 INFO BlockManager: Initialized BlockManager: BlockManagerId(driver, 192.168.46.132, 34179, None)
    17/10/29 01:22:27 WARN StreamingContext: spark.master should be set as local[n], n > 1 in local mode if you have receivers to get data, otherwise Spark jobs will not get resources to process the received data.
    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/streaming/twitter/TwitterUtils$
            at com.Sentiment$.main(Sentiment.scala:26)
            at com.Sentiment.main(Sentiment.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:755)
            at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
            at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
            at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)
            at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
    Caused by: java.lang.ClassNotFoundException: org.apache.spark.streaming.twitter.TwitterUtils$
            at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
            at java.lang.ClassLoader.loadClass(ClassLoader.java
    
  6. ==============================

    6.당신의 항아리에 종속성을 포함하려면 당신은 "지방 항아리"를 구축하기 위해 메이븐을 지시해야합니다. A "지방 항아리"프로젝트에 있지만뿐만 아니라 필요한 모든 종속성뿐만 아니라 class 파일을 (이 SBT 어셈블리가 무엇 인)이 포함 된 항아리입니다. 기본 메이븐 동작은 도서관 같은 프로젝트를 치료하고, 따라서 만 class 파일이있는 단지를 구축하는 것입니다.

    당신의 항아리에 종속성을 포함하려면 당신은 "지방 항아리"를 구축하기 위해 메이븐을 지시해야합니다. A "지방 항아리"프로젝트에 있지만뿐만 아니라 필요한 모든 종속성뿐만 아니라 class 파일을 (이 SBT 어셈블리가 무엇 인)이 포함 된 항아리입니다. 기본 메이븐 동작은 도서관 같은 프로젝트를 치료하고, 따라서 만 class 파일이있는 단지를 구축하는 것입니다.

    여기에 내가 다른 일반적인 스파크 + 같은 스칼라를 사용하는 등 메이븐 행동을 포함했다 당신이 원하는 것을 할 것입니다 간단한 받는다는 치어, 참고하지만, 가장 관련성이 부분은 하단에 있습니다 :

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.jmess.sparkexamples</groupId>
        <artifactId>example</artifactId>
        <version>1.0.0</version>
    
        <properties>
            <!-- Use java 1.8 -->
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <!-- Keep compiled against scala version uniform -->
            <scala.base.version>2.11</scala.base.version>
            <!-- Use most recent version of Scala compatible with stable Spark release -->
            <scala.version>${scala.base.version}.12</scala.version>
            <!-- Facilitates keeping multiple Spark dependencies aligned  -->
            <spark.version>2.4.0</spark.version>
        </properties>
    
        <dependencies>
            <!-- Begin Spark Dependencies -->
            <!-- Provides the base Spark APIs. Required for base functionality -->
            <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-sql_${scala.base.version}</artifactId>
                <version>${spark.version}</version>
                <!-- In most cases this dependency is supplied by Spark -->
                <scope>provided</scope>
            </dependency>
            <!-- Provides the expanded APIs for Streaming with Kafka. Required in addition to spark-sql library -->
            <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql-kafka-0-10 -->
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-sql-kafka-0-10_${scala.base.version}</artifactId>
                <version>${spark.version}</version>
            </dependency>
            <!-- End Spark Dependencies -->
    
            <!-- Popular scala configuration library -->
            <dependency>
                <groupId>com.typesafe</groupId>
                <artifactId>config</artifactId>
                <version>1.3.2</version>
            </dependency>
            <!-- To write to Splunk HTTP endpoint -->
        </dependencies>
    
        <build>
            <!-- Tells scala-maven-plugin where to look -->
            <sourceDirectory>src/main/scala</sourceDirectory>
            <testSourceDirectory>src/test/scala</testSourceDirectory>
    
            <plugins>
                <!-- For building scala projects using maven -->
                <plugin>
                    <groupId>net.alchim31.maven</groupId>
                    <artifactId>scala-maven-plugin</artifactId>
                    <version>4.0.1</version>
                    <!-- Includes the compiled Scala .class files in some maven goals -->
                    <executions>
                        <execution>
                            <goals>
                                <goal>add-source</goal>
                                <goal>compile</goal>
                                <goal>testCompile</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <!-- !!!!!!! BUILD FAT JAR !!!!!!! -->
                <!-- Build a fat jar named example-1.0.0-jar-with-dependencies.jar -->
                <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>3.1.1</version>
                    <configuration>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id> <!-- this is used for inheritance merges -->
                            <phase>package</phase> <!-- bind to the packaging phase -->
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    참고 ** 대신 원사의 불꽃을 통해 작업을 제출하는 경우, 다음의 주석 <범위> 제공 라인

  7. from https://stackoverflow.com/questions/28165032/java-lang-noclassdeffounderror-org-apache-spark-streaming-twitter-twitterutils by cc-by-sa and MIT license