scala实现hbase批量写入

本文详细介绍如何在CentOS7.6环境下,使用Scala与Maven配置Spark项目,通过读取HDFS上的文本数据,利用Spark RDD进行处理,并将结果批量写入HBase数据库的具体步骤。文中覆盖了从环境搭建、依赖引入到代码实现的全过程。

一、编程环境:

1、JDK1.8

2、scala2.11.7

3、hadoop3.0.0、hbase2.1.0、spark2.4.0

操作系统:centos7.6,编译器使用idea2019

二、实现步骤:

1、添加hbase的jar包

因为我这里使用使用的是cdh发行版本,hbase的jar包位置为:/opt/cloudera/parcels/CDH/lib/hbase/lib/

将该目录下的jar文件拷贝至特定目录,如下:

#mkdir /data/lib/hbase

#cp /opt/cloudera/parcels/CDH/lib/hbase/lib/* /data/lib/hbase

2、使用idea创建scala项目,maven添加如下依赖

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <hadoop.version>3.0.0</hadoop.version>
  </properties>

  <dependencyManagement>
    <dependencies>
      <!-- Camel BOM -->
      <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-parent</artifactId>
        <version>2.24.1</version>
        <scope>import</scope>
        <type>pom</type>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>

    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-core</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-scala</artifactId>
    </dependency>

    <!-- scala -->
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>2.11.7</version>
    </dependency>
    <dependency>
      <groupId>org.scala-lang.modules</groupId>
      <artifactId>scala-xml_2.11</artifactId>
      <version>1.0.6</version>
    </dependency>

    <!-- logging -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-slf4j-impl</artifactId>
      <scope>runtime</scope>
    </dependency>

    <!-- testing -->
    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-test</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.6.6</version>
    </dependency>

    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_2.11</artifactId>
      <version>2.2.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-streaming_2.11</artifactId>
      <version>2.2.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_2.11</artifactId>
      <version>2.2.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>${hadoop.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-core</artifactId>
      <version>1.2.1</version>
    </dependency>

<!--    <dependency>-->
<!--      <groupId>org.apache.hbase</groupId>-->
<!--      <artifactId>hbase-client</artifactId>-->
<!--      <version>2.1.0</version>-->
<!--    </dependency>-->

<!--    <dependency>-->
<!--      <groupId>org.apache.hbase</groupId>-->
<!--      <artifactId>hbase-server</artifactId>-->
<!--      <version>2.1.0</version>-->
<!--    </dependency>-->

<!--    <dependency>-->
<!--      <groupId>org.apache.hbase</groupId>-->
<!--      <artifactId>hbase-common</artifactId>-->
<!--      <version>2.1.0</version>-->
<!--    </dependency>-->

<!--    <dependency>-->
<!--      <groupId>org.apache.hbase</groupId>-->
<!--      <artifactId>hbase</artifactId>-->
<!--      <version>2.1.0</version>-->
<!--      <type>pom</type>-->
<!--    </dependency>-->

<!--    <dependency>-->
<!--      <groupId>org.apache.hbase</groupId>-->
<!--      <artifactId>hbase-mapreduce</artifactId>-->
<!--      <version>2.1.0</version>-->
<!--    </dependency>-->

    <dependency>
      <groupId>org.glassfish</groupId>
      <artifactId>javax.el</artifactId>
      <version>3.0.1-b08</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>${hadoop.version}</version>
      <exclusions>
        <exclusion>
          <artifactId>jackson-databind</artifactId>
          <groupId>com.fasterxml.jackson.core</groupId>
        </exclusion>
      </exclusions>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>${hadoop.version}</version>
      <exclusions>
        <exclusion>
          <artifactId>jackson-databind</artifactId>
          <groupId>com.fasterxml.jackson.core</groupId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>org.gdal</groupId>
      <artifactId>gdal</artifactId>
      <version>2.4.0</version>
    </dependency>


  </dependencies>

注意:这里引入的hadoop版本尽量和系统中安装的版本一致,以免出现代码冲突的情况。

3、idea添加hbase的jar包

点击idea的file-Project Structure设置,将步骤1中创建的jar包引入,如下:

4、添加maven的打包工具,这一步非必要,如果使用idea自带的打包工具无法正常打包,可以使用该方式。

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.5.5</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>**this is your mainclass**</mainClass>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>

        <executions>
          <execution>
            <id>make-assemble</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

5、编写代码

import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.Put
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapred.TableOutputFormat
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 writeTxtToHbase()={
    val spark = SparkSession.builder().appName("SparkHBaseRDD").getOrCreate()

    val sc = spark.sparkContext

    //表名称
    val tablename= "tb:table3"

    val hbaseConf = HBaseConfiguration.create()
    hbaseConf.set(TableOutputFormat.OUTPUT_TABLE, tablename)

    val jobConf = new JobConf(hbaseConf)
    jobConf.setOutputFormat(classOf[TableOutputFormat])

    //hdfs文件
    val txtpath="/ZF/2018001.txt"
    val txtRdd=sc.textFile(txtpath)
    txtRdd.map(_.split(",")).map(arr=>{
      val put = new Put(Bytes.toBytes(arr(0)))
      put.addColumn(Bytes.toBytes("static"),Bytes.toBytes("col1"),Bytes.toBytes(arr(1)))
      put.addColumn(Bytes.toBytes("static"),Bytes.toBytes("col2"),Bytes.toBytes(arr(2)))
      put.addColumn(Bytes.toBytes("static"),Bytes.toBytes("col3"),Bytes.toBytes(arr(3)))
      put.addColumn(Bytes.toBytes("static"),Bytes.toBytes("col4"),Bytes.toBytes(arr(4)))
      put.addColumn(Bytes.toBytes("static"),Bytes.toBytes("col5"),Bytes.toBytes(arr(5)))
      put.addColumn(Bytes.toBytes("static"),Bytes.toBytes("col6"),Bytes.toBytes(arr(6)))
      put.addColumn(Bytes.toBytes("static"),Bytes.toBytes("col7"),Bytes.toBytes(arr(7)))
      (new ImmutableBytesWritable, put)
    }).saveAsHadoopDataset(jobConf)
  }

}

使用spark-submit提交,我这里测试的是10000000条记录,7列数据,三台主机,共耗时4分钟左右。

<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作业、SparkScala/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、付费专栏及课程。

余额充值