Hadoop_Scala操作Hbase

Hadoop_Scala操作Hbase

package com.lius.hadoop.hbase

import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.TableName
import org.apache.hadoop.hbase.client.Connection
import org.apache.hadoop.hbase.client.ConnectionFactory
import org.apache.hadoop.hbase.HTableDescriptor
import org.apache.hadoop.hbase.HTableDescriptor
import org.apache.hadoop.hbase.HColumnDescriptor
import com.sun.org.apache.xalan.internal.xsltc.compiler.ValueOf
import org.apache.hadoop.hbase.client.Put
import org.apache.hadoop.hbase.client.Delete
import com.sun.org.apache.xalan.internal.xsltc.compiler.ValueOf
import org.apache.hadoop.hbase.client.Scan
import org.apache.hadoop.hbase.client.Result
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.hbase.CellUtil
import org.apache.hadoop.hbase.client.Get

/**
 * Scala操作Hbase
 */
object scalaHbase {
  
  
  def main(args:Array[String]):Unit={
    
    //创建一个配置
    val conf = HBaseConfiguration.create
    conf.set("hbase.zookeeper.quorum", "hadoop1,hadoop2")
    conf.set("hbase.zookeeper.property.clientPort", "2181")
    
    //Connection的创建是重量级的工作,线程安全,是操作HBase的入口
    val connection = ConnectionFactory.createConnection(conf);
    
    //创建表
//    createTable(connection,"testDB");
    //插入记录
//    insertData(connection,"testDB","userName","xiaoming","001","123");
//    insertData(connection,"testDB","userName","marry","001","123");
//    insertData(connection,"testDB","userName","xiaoming","002","456");
//    insertData(connection,"testDB","userName","marry","002","456");
    //删除记录
//    deleteRecord(connection,"testDB","userName","xiaoming","001")
    //扫描整个表
//    scanRecord(connection,"testDB","userName","marry");
//    getAResult(connection,"testDB","userName","marry","002");
    //删除表
    deleteTable(connection,"testDB")
    connection.close
  }

  /**
   * 删除表
   */
  def deleteTable(connection:Connection,tableName:String):Unit={
    val admin = connection.getAdmin
    val tabName = TableName.valueOf(tableName)
    if(admin.tableExists(tabName)){//删除表
      admin.disableTable(tabName)
      admin.deleteTable(tabName)
    }
  }
  
  /**
   * 查询单条数据
   */
  def getAResult(connection:Connection,tableName:String,family:String,columnValue:String,key:String):Unit={
    val tabName = TableName.valueOf(tableName)
    val tab = connection.getTable(tabName)
    val get = new Get(key.getBytes)
    val result = tab.get(get)
    val value = Bytes.toString(result.getValue(family.getBytes, columnValue.getBytes))
    System.out.println(String.format("value:%s", value))
    tab.close
  }
  
  /**
   * 扫描整个表
   */
  def scanRecord(connection:Connection,tableName:String,family:String,columnName:String):Unit={
    val tabName = TableName.valueOf(tableName)
    val tab = connection.getTable(tabName)
    val scan = new Scan()
    scan.addColumn(family.getBytes, columnName.getBytes)
    val rs = tab.getScanner(scan)
    rs.forEach(r =>{
          val cells = r.listCells()
          cells.forEach(cell => {
            System.out.println(String.format("row:%s family:%s quarify:%s value:%s",
            Bytes.toString(CellUtil.cloneRow(cell)),
            Bytes.toString(CellUtil.cloneFamily(cell)),
            Bytes.toString(CellUtil.cloneQualifier(cell)),
            Bytes.toString(CellUtil.cloneValue(cell))))
    })
    })
     tab.close
  }
 
  /**
   * 删除记录
   */
  def deleteRecord(connection:Connection,tableName:String,family:String,columnName:String,key:String):Unit={
    val tabName = TableName.valueOf(tableName)
    val tab = connection.getTable(tabName)
    val delete = new Delete(key.getBytes);
    delete.addColumn(family.getBytes,columnName.getBytes);
    tab.delete(delete)
  }
  
  
  /**
   * 插入记录
   */
  def insertData(connection:Connection,tableName:String,family:String,columnName:String,key:String,value:String):Unit={
    val tabName = TableName.valueOf(tableName);
    val tab = connection.getTable(tabName);
    val put = new Put(key.getBytes);
    put.addColumn(family.getBytes, columnName.getBytes, value.getBytes)
    tab.put(put)//提交
  }
  /**
   * 创建表
   */
  def createTable(connection:Connection,tableName:String):Unit={
    val admin = connection.getAdmin
    val tabName = TableName.valueOf(tableName);
    if(!admin.tableExists(tabName)){
      val tableDescripter =  new HTableDescriptor(tabName);
      tableDescripter.addFamily(new HColumnDescriptor("userName"));
      tableDescripter.addFamily(new HColumnDescriptor("password"));
      admin.createTable(tableDescripter);
    }
  }


  
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Scala 中使用 HBase 和 Kerberos 进行身份验证需要进行以下步骤: 1. 配置 Kerberos:首先,确保 HBase 集群已经启用了 Kerberos 身份验证。您需要获取正确的 Kerberos Principal(主体)和 Keytab(密钥表)文件。 2. 添加 HBase 和 Kerberos依赖:在 Scala项目的构建文件(例如 build.sbt)中添加必要的依赖项。例如,您可以添加以下依赖项: ```scalalibraryDependencies += "org.apache.hbase" % "hbase-client" % "版本号" libraryDependencies += "org.apache.hadoop" % "hadoop-auth" % "版本号" ``` 请确保将版本号替换为您正在使用的 HBase 和 Hadoop 版本。 3. 创建 HBase 配置:在 Scala代码中,您需要创建一个 HBase 配置对象,并设置相应的属性,以使用 Kerberos 进行身份验证。例如: ```scalaimport org.apache.hadoop.conf.Configurationimport org.apache.hadoop.security.UserGroupInformationval conf = HBaseConfiguration.create() conf.set("hbase.zookeeper.quorum", "zkQuorum") conf.set("hbase.zookeeper.property.clientPort", "zkPort") conf.set("zookeeper.znode.parent", "/hbase") conf.set("hadoop.security.authentication", "kerberos") // 设置 Kerberos Principal 和 Keytab 文件路径val krbPrincipal = "your_kerberos_principal" val krbKeytab = "path_to_your_keytab_file" System.setProperty("java.security.krb5.conf", "/etc/krb5.conf") UserGroupInformation.setConfiguration(conf) UserGroupInformation.loginUserFromKeytab(krbPrincipal, krbKeytab) ``` 请确保将 "zkQuorum" 和 "zkPort" 替换为您的 ZooKeeper 地址和端口。 4. 使用 HBase 进行操作:现在,您可以使用 Scala 和 HBase 客户端库进行各种操作,例如读取和写入数据。根据您的需求,使用适当的 HBase API 进行操作。 请注意,这只是一个简单的示例,您可能需要针对您的特定环境和需求进行更多的配置和调整。 希望这可以帮助您在 Scala 中使用 HBase 和 Kerberos 进行身份验证!如果您有任何进一步的问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值