【问题标题】:Spark: Read HBase in secured clusterSpark:在安全集群中读取 HBase
【发布时间】:2016-10-10 14:44:55
【问题描述】:

我有一个简单的任务:我想读取 Kerberos 安全集群中的 HBase 数据。 到目前为止,我尝试了 2 种方法:

  • sc.newAPIHadoopRDD():这里不知道kerberos认证怎么处理
  • 从 HBase API 创建 HBase 连接:这里我真的不知道如何将结果转换为 RDD

此外,似乎还有一些 HBase-Spark 连接器。但不知何故,我并没有真正设法找到它们作为 Maven 工件和/或它们需要结果的固定结构(但我只需要 HBase Result 对象,因为我的数据中的列不固定)。

您有任何示例或教程或....? 感谢您的帮助和提示。

提前致谢!

【问题讨论】:

  • 检查我的答案。希望能提供一些见解。

标签: apache-spark hbase kerberos


【解决方案1】:

我假设你使用的是 spark + scala +Hbase

import org.apache.spark._
import org.apache.spark.rdd.NewHadoopRDD
import org.apache.hadoop.hbase.{HBaseConfiguration, HTableDescriptor}
import org.apache.hadoop.hbase.client.HBaseAdmin
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HColumnDescriptor
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.HTable;


object SparkWithMyTable {
  def main(args: Array[String]) {
    //Initiate spark context with spark master URL. You can modify the URL per your environment. 
    val sc = new SparkContext("spark://ip:port", "MyTableTest")

    val tableName = "myTable" 

val conf = HBaseConfiguration.create()
conf.set("hbase.zookeeper.quorum", "list of cluster ip's")
conf.set("hbase.zookeeper"+ ".property.clientPort","2181");
conf.set("hbase.master", "masterIP:60000");
conf.set("hadoop.security.authentication", "kerberos");
conf.set("hbase.security.authentication", "kerberos");



UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab("user@---", keyTabPath);

    // Add local HBase conf
   // conf.addResource(new Path("file://hbase/hbase-0.94.17/conf/hbase-site.xml"))
    conf.set(TableInputFormat.INPUT_TABLE, tableName)

    // create my table with column family
    val admin = new HBaseAdmin(conf)
    if(!admin.isTableAvailable(tableName)) {
      print("Creating MyTable")
      val tableDesc = new HTableDescriptor(tableName)
      tableDesc.addFamily(new HColumnDescriptor("cf1".getBytes()));
      admin.createTable(tableDesc)
    }else{
      print("Table already exists!!")
      val columnDesc = new HColumnDescriptor("cf1");
      admin.disableTable(Bytes.toBytes(tableName));
      admin.addColumn(tableName, columnDesc);
      admin.enableTable(Bytes.toBytes(tableName));
    }

    //first put data into table
    val myTable = new HTable(conf, tableName);
    for (i <- 0 to 5) {
      var p = new Put();
      p = new Put(new String("row" + i).getBytes());
      p.add("cf1".getBytes(), "column-1".getBytes(), new String(
                        "value " + i).getBytes());
      myTable.put(p);
    }
    myTable.flushCommits();
    
    //how to 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)
  }
}

Maven 工件

<dependency>
  <groupId>it.nerdammer.bigdata</groupId>
  <artifactId>spark-hbase-connector_2.10</artifactId>
  <version>1.0.3</version> // Version can be changed as per your Spark version, I am using Spark 1.6.x
</dependency>

也可以看看

【讨论】:

  • 您好,感谢您的提示。创建上面提到的 RDD 不起作用。它仍然存在身份验证问题 - UserGroupInformation.loginUserFromKeytab("user@---", keyTabPath);似乎只在主节点上执行,而不是在工作节点上执行。
  • 抱歉 - 我不小心打到了“添加评论”。我的问题仍未解决 - 请参阅我最初的评论。
  • 您好,您使用的是纱线集群模式吗?
  • 那么这可以帮助你。 community.hortonworks.com/questions/46500/…
  • 我尝试了 yarn-client 和 yarn-cluster。 Hortonworks 论坛的链接也没有真正的帮助,因为它使用的是原生 HBase API 而不是 sc.newAPIHadoopRDD...
猜你喜欢
  • 2018-08-30
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
相关资源
最近更新 更多