问题描述
|
我正在尝试进行一个使用CDH3的Hadoop和HBase的sbt项目。我正在尝试使用project / build / Project.scala文件声明对HBase和Hadoop的依赖关系。 (我承认我对sbt,maven和ivy的掌握有些薄弱。如果我要说或做些愚蠢的事情,请原谅我。)
一切都与Hadoop依赖关系紧密相连。添加HBase依赖关系会导致对Thrift 0.2.0的依赖关系,对于此关系似乎没有回购协议,或者从SO帖子中听起来很像。
所以,实际上,我有两个问题:
1.老实说,我不想依赖Thrift,因为我不想使用HBase的Thrift接口。有没有办法告诉sbt跳过它?
2.是否有更好的方法进行设置?我应该只将HBase jar转储到lib目录中并继续吗?
更新这是完成我想要的工作的sbt 0.10 build.sbt文件:
scalaVersion := \"2.9.0-1\"
resolvers += \"ClouderaRepo\" at \"https://repository.cloudera.com/content/repositories/releases\"
libraryDependencies ++= Seq(
\"org.apache.hadoop\" % \"hadoop-core\" % \"0.20.2-cdh3u0\",\"org.apache.hbase\" % \"hbase\" % \"0.90.1-cdh3u0\"
)
ivyXML :=
<dependencies>
<exclude module=\"thrift\"/>
</dependencies>
解决方法
查看HBase POM文件,Thrift位于回购协议中,网址为http://people.apache.org/~rawson/repo。您可以将其添加到您的项目中,并且它应该找到Thrift。我以为SBT会解决这个问题,但这是SBT,Ivy和Maven的交集,因此谁能真正说出真正应该发生的事情。
如果您确实不需要Thrift,则可以使用内联Ivy XML排除依赖项,如SBT Wiki上所述。
override def ivyXML =
<dependencies>
<exclude module=\"thrift\"/>
</dependencies>
回复:将罐子转储到lib目录中,这将是短期收益,长期损失。这当然是更方便的做法,如果这是某种概念上的证明,那么您下周将要扔掉它,请确保将它放进罐子中,然后将其忘记。但是,对于任何寿命超过几个月的项目,都值得花一些时间来正确进行依赖项管理。
尽管所有这些工具都面临挑战,但好处是:
依赖性分析可以告诉您何时直接依赖性具有冲突的传递性依赖性。在使用这些工具之前,这通常会导致怪异的运行时行为或未找到方法的异常。
升级非常简单。只需更改版本号,更新,就可以完成。
它避免了将二进制文件提交到版本控制。合并分支时,它们可能会出现问题。
除非您对在lib目录中对二进制文件进行版本控制有明确的策略,否则很容易忘记所拥有的版本。
, 我在github上有一个带Hadoop的sbt项目的非常简单的示例:https://github.com/deanwampler/scala-hadoop。
查看project/build/WordCountProject.scala
,在其中定义了一个名为ClouderaMavenRepo
的变量(该变量定义了Cloudera存储库位置)和一个名为hadoopCore
的变量,该变量定义了Hadoop jar的特定信息。
如果在浏览器中转到Cloudera存储库,则应该能够导航到Hive的相应信息。