Spark从 Hbase 读写文件

本文介绍了如何使用Spark通过Hadoop输入格式访问HBase,详细讲解了导入相关依赖、从HBase读取数据以及将数据写入HBase的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于 org.apache.hadoop.hbase.mapreduce.TableInputFormat 类的实现,Spark 可以通过Hadoop输入格式访问 HBase。

这个输入格式会返回键值对数据,其中键的类型为org. apache.hadoop.hbase.io.ImmutableBytesWritable,而值的类型为org.apache.hadoop.hbase.client.Result。

1. 导入依赖

<dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>1.3.1</version>
        </dependency>

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

    </dependencies>

2. Spark从HBase读取数据

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.Result
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
import org.apache.hadoop.hbase.util.Bytes
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * @author fczheng 
  *
  */
object Spark35_RDD_HBase {
    def main(args: Array[String]): Unit = {
        
        // TODO 1.创建Spark配置对象
        val conf: SparkConf = new SparkConf().setAppName("Spark_HBase").setMaster("local[*]")
        
        // TODO 2.创建Spark环境连接对象
        val sc: SparkContext = new SparkContext(conf)
        
        val hbaseConf: Configuration = HBaseConfiguration.create()
        hbaseConf.set("hbase.zookeeper.quorum", "hadoop102,hadoop103,hadoop104")
        hbaseConf.set(TableInputFormat.INPUT_TABLE,"student")
        
        //TODO 3.从HBase中读取数据
        val hbaseRDD: RDD[(ImmutableBytesWritable, Result)] = sc.newAPIHadoopRDD(
            hbaseConf,
            classOf[TableInputFormat],
            classOf[ImmutableBytesWritable],
            classOf[Result]
        )
    
        val rdd2: RDD[String] = hbaseRDD.map {
            case (_, result) => Bytes.toString(result.getRow)
        }
        rdd2.collect().foreach(println)
        
        // TODO 4. 释放连接
        sc.stop()
       
    }
}

3. Spark向HBase写入数据

import org.apache.hadoop.conf.Configuration
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.mapreduce.TableOutputFormat
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.mapreduce.Job
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * @author fczheng 
  *
  */
object Spark36_RDD_HBase1 {
    def main(args: Array[String]): Unit = {
        // TODO 1.创建Spark配置对象
        val conf: SparkConf = new SparkConf().setAppName("Spark_HBase").setMaster("local[*]")
        
        // TODO 2.创建Spark环境连接对象
        val sc: SparkContext = new SparkContext(conf)
        
        val hbaseConf: Configuration = HBaseConfiguration.create()
        hbaseConf.set("hbase.zookeeper.quorum","hadoop102,hadoop103,hadoop104")
        hbaseConf.set(TableOutputFormat.OUTPUT_TABLE,"student")
        
        // TODO 3.通过job来设置输出的格式的类
        
        val job: Job = Job.getInstance(hbaseConf)
        
        job.setOutputFormatClass(classOf[TableOutputFormat[ImmutableBytesWritable]])
        job.setOutputKeyClass(classOf[ImmutableBytesWritable])
        job.setOutputValueClass(classOf[Put])
        
        // TODO 4.向HBase插入数据
        //Put
        val dataRDD: RDD[(String, String, Int)] = sc.parallelize(List(("1003","male",22),("1004","female",88),("1005","female",66)))
        
        //data => put
        val hbaseRDD: RDD[(ImmutableBytesWritable, Put)] = dataRDD.map(x => {
            val put: Put = new Put(Bytes.toBytes(x._1))
        
            put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("sex"), Bytes.toBytes(x._2))
            put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age"), Bytes.toBytes(x._3))
        
            (new ImmutableBytesWritable(), put)
        })
        
        hbaseRDD.saveAsNewAPIHadoopDataset(job.getConfiguration)
        
        //TODO 5.释放连接
        sc.stop()
    }
}

 

可以使用 SparkHBase Connector 来连接 HBase 并进行数据读写操作。以下是一个示例代码: ```scala import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase.client.{Connection, ConnectionFactory, Put} import org.apache.hadoop.hbase.spark.HBaseContext import org.apache.spark.SparkConf import org.apache.spark.sql.SparkSession val sparkConf = new SparkConf().setAppName("Spark-HBase Connector Example") val spark = SparkSession.builder().config(sparkConf).getOrCreate() val hbaseConf = HBaseConfiguration.create() hbaseConf.set("hbase.zookeeper.quorum", "localhost") hbaseConf.set("hbase.zookeeper.property.clientPort", "2181") val hbaseContext = new HBaseContext(spark.sparkContext, hbaseConf) val tableName = "test_table" val columnFamily = "cf" val rowKey = "row1" val column = "col1" val value = "value1" val rdd = spark.sparkContext.parallelize(Seq((rowKey, column, value))) val putRdd = rdd.map { case (row, col, value) => val put = new Put(row.getBytes()) put.addColumn(columnFamily.getBytes(), col.getBytes(), value.getBytes()) (new org.apache.hadoop.hbase.client.TableIdentifier(tableName), put) } hbaseContext.bulkPut(putRdd) ``` 这段代码演示了如何使用 SparkHBase Connector 将数据写入 HBase。首先,我们需要创建一个 HBaseContext 对象,然后使用 bulkPut 方法将数据写入 HBase。在这个例子中,我们将一行数据写入了名为 test_table 的表中,行键为 row1,列族为 cf,列为 col1,值为 value1。 注意:在实际使用中,需要根据实际情况修改 HBase 的配置和表名、列族、列等信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值