scala - 使用 Oozie 将 Spark 转为 Hbase

标签 scala hadoop apache-spark hbase oozie

我试图从 Spark 在 Hbase 中创建一个表并插入数据,从中读取数据。

当我从命令行运行 spark 作业时它工作正常。但是,每次我尝试使用 oozie 运行它时,它都会抛出不同类型的异常。

这是我的 spark hbase 代码

    val sc = new SparkContext("local", "Hbase spark")

    val tableName = "Morbidity_Dummy2"

    val conf = HBaseConfiguration.create()
    // Add local HBase conf
    conf.addResource(new Path("file:///opt/cloudera/....../hbase-site.xml"))
    conf.set(TableInputFormat.INPUT_TABLE, tableName)

//     create m7 table with column family
    val admin = new HBaseAdmin(conf)
    if(!admin.isTableAvailable(tableName)) {
      print("Creating GHbase Table")
      val tableDesc = new HTableDescriptor(tableName)
      tableDesc.addFamily(new HColumnDescriptor("cf1"
                                    .getBytes()))
      admin.createTable(tableDesc)

    }else{
      print("Table already exists!!")
    }

    //put data into table
    val myTable = new HTable(conf, tableName)
    for (i <- 414540 to 414545) {

      var p = new Put(Bytes.toBytes(""+i))
      p.add("cf1".getBytes(), "morbidity_score".getBytes(), Bytes.toBytes(""+(i*5)))
      p.add("cf1".getBytes(), "effective_date".getBytes(), Bytes.toBytes("2016-07-01"))
      p.add("cf1".getBytes(), "cmi_id".getBytes(), Bytes.toBytes(""+i))

      myTable.put(p)
    }

    myTable.flushCommits()
//  create rdd
    val hBaseRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat], 
      classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],
      classOf[org.apache.hadoop.hbase.client.Result])

    //get the row count
    val count = hBaseRDD.count()
    print("HBase RDD count:"+count)
    System.exit(0)

这是我得到的异常

Exception1:    org.apache.hadoop.hbase.ZooKeeperConnectionException: org.apache.hadoop.hbase.ZooKeeperConnectionException: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase
Exception2:    java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/exceptions/TimeoutIOException
Exception3:    java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseIOException

我还在 lib 文件夹中包含了 hbase-0.90.2.jarhbase-client-1.2.1.jar 以及 spark jar。我不明白为什么它在命令行下运行而不是在 oozie 上运行。

最佳答案

Exception2: java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/exceptions/TimeoutIOException

Exception3: java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseIOException

您需要添加 hbase-common jar。 (试用版1.1.2)

你能确定你有这些 jar 吗。

hbase-procedure-1.1.2.jar
hbase-server-1.1.2.jar
hbase-common-1.1.2.jar
hbase-client-1.1.2.jar
hbase-protocol-1.1.2.jar

这是一个反复试验的过程。您需要找到类的相应 jar 并添加到类路径中。

关于scala - 使用 Oozie 将 Spark 转为 Hbase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37840473/

相关文章:

hadoop - 如何将 Netezza 连接到 CDH 3 集群?

java - 如何在 Pig 中加载特定范围的输入文件

json - 使用Spark(Java)将JSON插入Hadoop

apache-spark - Spark : unpersist rdd before remove it from List

scala - 选择当前语法 `import foo.bar.{Baz => _}` 以从导入中排除某些内容的原因是什么?

scala - 为什么我不能将案例类的构造函数用作在 map() 内部使用的函数

hadoop - 绕过hadoop中Mapreduce作业的洗牌阶段?

scala - Idea 13 和 Gradle 在 Scala 方面尝试使用 scala-compiler 时找不到 scala-library

scala - 如何使用 sttp 将响应读取为 Observable[String]

python - 减少和计数的结果在 pyspark 中不同