代码之家  ›  专栏  ›  技术社区  ›  Necro

你如何在sbt中将spark和kafka联系起来?

  •  3
  • Necro  · 技术社区  · 11 年前

    我需要使用spark中kafka项目的符号(使用DefaultDecoder而不是StringDecoder)。由于这些符号都在kafka中,我需要在我的sbt项目中链接kafka和spark。这里是一个简化的sbt文件,它隔离了我的确切问题:

    name := """spark-kafka"""                                                                                           
    
    version := "1.0"                                                                                                         
    
    scalaVersion := "2.10.4"                                                                                                 
    
    lazy val root = (project in file("."))                                                                                   
    
    libraryDependencies ++= Seq(                                                                                             
      "org.apache.kafka"           % "kafka_2.10"           % "0.8.2.0",                                                     
      "com.typesafe.scala-logging" %% "scala-logging-slf4j" % "2.1.2",                                                       
      "org.apache.spark"              %% "spark-core"       % "1.2.1" % "provided"                                           
    )   
    

    如果我尝试使用sbt编译来构建它,我会收到以下错误:

    > compile
    [info] Updating {file:/home/rick/go/src/defend7/sparksprint/tools/consumer/}root...
    [info] Resolving org.fusesource.jansi#jansi;1.4 ...
    [error] impossible to get artifacts when data has not been loaded. IvyNode = org.slf4j#slf4j-api;1.6.1
    [trace] Stack trace suppressed: run last *:update for the full output.
    [error] (*:update) java.lang.IllegalStateException: impossible to get artifacts when data has not been loaded. IvyNode = org.slf4j#slf4j-api;1.6.1
    [error] Total time: 8 s, completed Feb 21, 2015 1:37:05 PM
    

    这是我在不太孤立的较大sbt项目中遇到的相同错误,所以我认为这个较小的sbt文件孤立了我所面临的问题。

    我试图理解sbt在“数据未加载时不可能获得工件”中所说的“数据”,并尝试了一些常见的补救措施(例如在libraryDependencies中明确包含slf4j api 1.6.1),但这迄今为止我一无所获。

    我真的很困,如果能得到任何帮助,我会非常感激。谢谢

    1 回复  |  直到 11 年前
        1
  •  2
  •   Wildfire    11 年前

    这看起来像是常春藤深处的冲突解决问题。可以通过手动排除 slf4j 依赖于Kafka,并显式添加对最新版本的依赖:

    libraryDependencies ++= Seq(                                                                                             
      "org.apache.kafka"           % "kafka_2.10"           % "0.8.2.0" excludeAll(
        ExclusionRule(organization = "org.slf4j")
      ),                                                     
      "com.typesafe.scala-logging" %% "scala-logging-slf4j" % "2.1.2",      
      "org.slf4j"                  % "slf4j-api"            % "1.7.10", 
      "org.apache.spark"           %% "spark-core"          % "1.2.1" % "provided"                                           
    )   
    
    推荐文章