如何让HBase与sbt的依赖管理很好地配合?

时间:2011-06-06 21:46:27

标签: scala hadoop hbase thrift sbt

我正在努力获得一个使用CDH3的Hadoop和HBase的sbt项目。我正在尝试使用project / build / Project.scala文件来声明对HBase和Hadoop的依赖。 (我承认我对sbt,maven和常春藤的把握有点弱。如果我说或做一些愚蠢的话,请原谅我。)

随着Hadoop的依赖,一切都顺其自然。添加HBase依赖性会导致对Thrift 0.2.0的依赖,因为它似乎没有回购,所以它听起来是SO post.

所以,真的,我有两个问题: 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>

2 个答案:

答案 0 :(得分:4)

HBase POM file,Thrift在http://people.apache.org/~rawson/repo的回购中。您可以将它添加到您的项目中,它应该找到Thrift。我认为SBT会想到这一点,但这是SBT,Ivy和Maven的交集,所以谁能真正说出应该发生什么。

如果您确实不需要Thrift,则可以使用内联常春藤XML排除依赖关系,如文档on the SBT wiki所述。

override def ivyXML = 
  <dependencies>
    <exclude module="thrift"/>
  </dependencies>

Re:将jar转储到lib目录中,这将是一个短期收益,长期损失。这当然是更加权宜之计,如果这是你下周要扔掉的一些概念证据,那么肯定只是扔掉罐子而忘了它。但对于任何寿命超过几个月的项目,花时间让依赖管理正确是值得的。

虽然所有这些工具都面临挑战,但其好处是:

  1. 依赖关系分析可以告诉您何时直接依赖关系具有冲突的传递依赖关系。在这些工具之前,这通常会导致奇怪的运行时行为或方法未找到异常。
  2. 升级非常简单。只需更改版本号,更新即可。
  3. 它避免了必须将二进制文件提交到版本控制。当合并分支时,它们可能会出现问题。
  4. 除非您有关于如何在lib目录中对二进制文件进行版本化的明确政策,否则很容易忘记您拥有的版本。

答案 1 :(得分:0)

我在github上有一个关于Hadoop的sbt项目的一个非常简单的例子:https://github.com/deanwampler/scala-hadoop

查看project/build/WordCountProject.scala,我定义了一个名为ClouderaMavenRepo的变量,它定义了Cloudera存储库位置,以及名为hadoopCore的变量,它定义了Hadoop jar的特定信息。

如果您在浏览器中转到Cloudera仓库,您应该可以导航到Hive的相应信息。