scala通过BulkLoad实现hbase的批量入库

部署环境参考其他章节。

完整代码如下:

import java.util.UUID

import org.apache.hadoop.fs.Path
import org.apache.hadoop.hbase.{HBaseConfiguration, KeyValue, TableName}
import org.apache.hadoop.hbase.client.{ConnectionFactory, Put}
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapred.TableOutputFormat
import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2
import org.apache.hadoop.hbase.tool.LoadIncrementalHFiles
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.mapred.JobConf
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
import org.apache.spark.streaming.{Seconds, StreamingContext}


object HbaseOpe {
  def bulkLoadToHbase()={
    val spark = SparkSession.builder().appName("HbaseBulkLoad").getOrCreate()
    val sc = spark.sparkContext

    val tbname= "yykj_pro:rm2018"

    val ckey: Map[String, Int]=Map("humidity"->1,"prcp"->2,"sunlit"->3,"tavg"->4,"tmax"->5,"tmin"->6,"wind"->7)

    for(i <-35 to 365){
      val tm=f"2018$i%3d".replaceAll(" ", "0")
      val txtpath="/user/datas/%s.txt".format(tm)
      val txtRdd=sc.textFile(txtpath)

      //具体文本格式为:
      //1870,0,0,0,0,0,0,0
      //1871,0,0,0,0,0,0,0
      //1872,0,0,0,0,0,0,0
      //1873,0,0,0,0,0,0,0
      //1874,0,0,0,0,0,0,0
      //8067,0,0,0,0,0,0,0
      //8068,0,0,0,0,0,0,0
      //8069,0,0,0,0,0,0,0
      //8070,0,0,0,0,0,0,0
      //8071,0,0,0,0,0,0,0
      //使用bulkLoad多次尝试多列写入失败,所以这里只能通过循环将多列数据写入
      //注意这里有个sortBy排序,使用bulkLoad写入主键必须按顺序排列,否则会出现
      //Added a key not lexically larger than previous错误。
      val sortRdd=txtRdd.map(_.split(",")).sortBy(arr=>arr(0))

      for(c <- ckey){
        val outRdd=sortRdd.map(arr=>{
          val rowKey = Bytes.toBytes(arr(0))
          val immutableRowKey = new ImmutableBytesWritable(rowKey)

          val kv = new KeyValue(
            rowKey,
            Bytes.toBytes("dynamic"),
            Bytes.toBytes(c._1),
            tm.toLong,
            Bytes.toBytes(c._2.toString)
          )
          (immutableRowKey, kv)
        })

        val hbaseConf = HBaseConfiguration.create()
        hbaseConf.set("hbase.mapreduce.hfileoutputformat.table.name", tbname)

        val tableName = TableName.valueOf(tbname)
        val conn = ConnectionFactory.createConnection(hbaseConf)
        val table = conn.getTable(tableName)
        val regionLocator = conn.getRegionLocator(tableName)


        val hFileOutput = s"/tmp/hbase/"+UUID.randomUUID().toString

        outRdd.saveAsNewAPIHadoopFile(hFileOutput,
          classOf[ImmutableBytesWritable],
          classOf[KeyValue],
          classOf[HFileOutputFormat2],
          hbaseConf
        )

        //写入hbase
        val bulkLoader = new LoadIncrementalHFiles(hbaseConf)
        bulkLoader.doBulkLoad(new Path(hFileOutput), conn.getAdmin, table, regionLocator)
      }


    }
  }
}

 

<think>好的,我现在需要解决用户的问题:HBase批量删除不使用Java的方法或工具。首先,用户明确排除了Java,所以我得考虑其他途径。 首先想到的是HBase自带的Shell工具,这是最直接的。HBase Shell支持批量删除,比如用deleteall命令,或者结合scan和delete。例如,用户可以编写一个Shell脚本,使用scan来获取需要删除的行键,然后逐个删除。不过,如果数据量很大,这种方式可能效率不高,但确实可行。 然后,MapReduce也是一个选项。HBase提供了Delete操作在MapReduce中的支持,可以通过HBase的TableMapReduceUtil来设置作业。用户需要编写Mapper来读取数据并生成Delete对象,然后使用TableOutputFormat输出。不过,MapReduce通常需要一定的Java基础,但用户可能希望避免编写Java代码,所以可能需要寻找现有的工具或示例脚本。 接下来是Spark,尤其是使用Scala或Python(PySpark)。用户可以用Spark读取HBase数据,过滤出需要删除的行,然后生成Delete对象,通过HBase的Bulk Load工具来执行批量删除。虽然Spark通常涉及编程,但如果有现成的脚本或工具,用户可能不需要自己从头编写。 另外,HBase REST API或Thrift API也是可能的途径。通过HTTP请求或Thrift接口发送删除命令,可以用任何支持HTTP请求的语言(如Python、Ruby)来编写脚本,实现批量删除。不过,需要确保API服务已启用,并且处理身份验证等问题。 还有第三方工具,比如Apache Phoenix,它提供了SQL接口,用户可以通过执行DELETE语句来批量删除数据。如果用户熟悉SQL,这可能是一个方便的方法,但需要先安装和配置Phoenix。 需要注意的是,批量删除操作可能影响性能,尤其是在处理大量数据时,需要谨慎操作,避免对生产环境造成压力。另外,确保删除前有数据备份,防止误删重要数据。 总结下来,主要的非Java方法包括HBase Shell脚本、MapReduce作业、Spark(Scala/Python)、REST/Thrift API以及Apache Phoenix。用户可以根据自身的技术栈和熟悉程度选择合适的方法。比如,如果熟悉Shell,可以直接用HBase Shell;如果已有Spark环境,可能用PySpark更高效。同时,第三方工具如Phoenix提供了SQL方式,适合喜欢用SQL的用户。</think>### HBase批量删除的非Java方法或工具 以下是几种不使用Java实现HBase批量删除的方法及工具: --- #### 1. **使用HBase Shell脚本** HBase Shell支持通过命令行直接执行批量删除操作,适用于简单的过滤条件。 - **单行删除**: ```bash deleteall '表名', '行键' ``` - **批量删除(结合Scan)**: 使用`scan`筛选行键,再通过管道传递给`delete`命令: ```bash echo "scan '表名', {FILTER => \"RowFilter(=, 'regexstring:行键前缀.*')\"}" | hbase shell | awk '{print $1}' | grep -v '^$' > rows.txt while read row; do echo "deleteall '表名', '$row'" | hbase shell; done < rows.txt ``` 此方法适合小规模数据,但效率较低[^2]。 --- #### 2. **MapReduce作业** HBase内置的MapReduce工具可通过非Java语言(如Python+Hadoop Streaming)实现批量删除,但需依赖Hadoop环境。 - **步骤**: 1. 编写Mapper脚本(Python)读取待删除的行键。 2. 使用`hadoop jar`提交作业: ```bash hadoop jar $HBASE_HOME/lib/hbase-server.jar export '表名' -D hbase.mapreduce.scan.row.start=起始行键 -D hbase.mapreduce.scan.row.stop=结束行键 | python mapper.py ``` 需结合`Delete`操作生成HFile后加载到HBase[^4]。 --- #### 3. **Spark + Scala/Python** 通过Spark的`spark-hbase`连接器(如Hortonworks SHC或HBase-Spark),用Scala或Python实现批量删除。 - **PySpark示例**: ```python from pyspark.sql import SparkSession from pyspark.sql.types import StringType spark = SparkSession.builder.config("spark.serializer", "KryoSerializer").getOrCreate() hbase_options = { "hbase.table": "表名", "hbase.columns.mapping": "行键列名 STRING :key", "hbase.zookeeper.quorum": "zk节点" } # 读取待删除的行键 df = spark.read.format("csv").load("路径/rows.csv") # 生成Delete操作并导出为HFile df.write.format("org.apache.hadoop.hbase.spark").options(**hbase_options).option("hbase.action", "delete").save() ``` 需配合`LoadIncrementalHFiles`工具导入HFile[^4]。 --- #### 4. **HBase REST API** 通过HBase的REST服务(需开启`hbase-rest`)发送HTTP请求批量删除。 - **示例(使用curl)**: ```bash # 删除单行 curl -X DELETE http://<HBase-REST-URL>/表名/行键 # 批量删除(需传递JSON格式的多个行键) curl -H "Content-Type: application/json" -X POST -d '{"Row": [{"key": "行键1"}, {"key": "行键2"}]}' http://<HBase-REST-URL>/表名/scanner ``` 需处理鉴权与性能问题[^2]。 --- #### 5. **Apache Phoenix(SQL接口)** 通过Phoenix的SQL语法执行批量删除,适合熟悉SQL的用户。 - **示例**: ```sql DELETE FROM "表名" WHERE 列名 LIKE '条件%'; ``` 需提前创建Phoenix表与HBase表的映射[^3]。 --- ### 注意事项 - **性能影响**:批量删除可能触发Region分裂或Compaction,建议在低峰期操作。 - **备份**:使用`hbase snapshot`备份数据后再删除。 - **权限**:确保操作账号有`WRITE`权限。 --- 相关问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值