如何在Spark流Scala中对HBase进行单元测试

时间:2016-09-15 16:26:14

标签: scala unit-testing apache-spark hbase spark-streaming

我正在尝试单元测试doSomethingRdd,这需要在rdd转换中从HBase读取一些参考数据。

def doSomethingRdd(in: DStream[String]): DStream[String] = {
    in.map(i => {
        val cell = HbaseUtil.getCell("myTable", "myRowKey", "myFamily", "myColumn") 
        i + cell.getOrElse("")
    })
}

Object HBaseUtil {
    def getCell(tableName: String, rowKey: String, columnFamily: String, column: String): Option[String] = {
    val HBaseConn = ConnectionPool.getConnection()
    //the rest of the code will use HBaseConn 
    //to get a HBase cell and convert to a string
    }
}

我读了这篇Cloudera article,但我对他们推荐的方法有些疑问。

我尝试的第一件事是使用ScalaMock来模拟HBaseUtil.getUtil方法,以便绕过HBase连接。我还做了一些解决方法,以模拟此article建议的对象单例。我更新了我的代码,如下所示。但是,doSomethingRdd失败了,因为模拟的hbaseUtil不是序列化,Paul Butcher在他的reply

中也解释了
def doSomethingRdd(in: DStream[String], hbaseUtil: HBaseUtilBody:HBaseUtil): DStream[String] = {
    in.map(i => {
        val cell = HbaseUtil.getCell("myTable", "myRowKey", "myFamily", "myColumn") 
        i + cell.getOrElse("")
    })
}

trait HBaseUtilBody {
    def getCell(tableName: String, rowKey: String, columnFamily: String, column: String): Option[String] = {
    val HBaseConn = ConnectionPool.getConnection()
    //the rest of the code will use HBaseConn 
    //to get a HBase cell and convert to a string
    }
}

object HBaseUtil extends HBaseUtilBody

我认为在RDD转换中从HBase获取数据将是一种非常常见的模式。但我不知道如何在不连接真正的HBase实例的情况下对其进行单元测试。

1 个答案:

答案 0 :(得分:0)

在2020年,使用HBase 2.x,我们使用hbase-testing-util。只需将其添加到您的SBT构建文件中

// https://mvnrepository.com/artifact/org.apache.hbase/hbase-testing-util

libraryDependencies + =“ org.apache.hbase”%“ hbase-testing-util”%“ 2.2.3”%测试

然后建立这样的连接

import org.apache.hadoop.hbase.HBaseTestingUtility

val utility = new HBaseTestingUtiliy
utility.startMiniCluster() // defaults to 1 master, 1 region server and 1 data node
val connection = utility.getConnection()

启动MiniCluster实际上会启动

  • MiniDFSCluster
  • MiniZKCluster和
  • MiniHBaseCluster

如果您需要添加一些特定的配置(例如安全设置),则可以将hbase-site.xml添加到资源中。

有关更多信息,请参阅HBase Reference Guide中的使用HBase Mini-Cluster进行集成测试。