windows环境下使用Spark读取HBase

本文详细介绍在Windows环境下,如何使用Spark结合IDEA读取HBase数据,包括环境配置、Maven依赖设置及代码实现,最后展示统计表行数及查询结果。

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

windows环境下使用Spark读取HBase

工具:IDEA
环境:jdk1.8,scala2.11
hbase:1.2-cdh5.16.1
spark:1.6-cdh5.16.1
hadoop:2.6.0-cdh5.16.1

以上组件都是用Cloudera Manager离线搭建的,不会的可参考另一篇博客

首先打开IDEA创建个scala项目,不过首先要下载scala插件
在这里插入图片描述
在这里插入图片描述
由于我是已经下载好了的,所以搜索不到,下载安装后重启下IDEA就可以开始创建项目了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:第一次创建scala项目需要create一下,找到你本地安装的scala路径
在这里插入图片描述然后右键点击项目名,添加maven工具
在这里插入图片描述
接下来开始添加maven依赖

<groupId>groupId</groupId>
<artifactId>testHBase</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
    <spark.version>1.6.0</spark.version>
    <scala.version>2.11</scala.version>
    <hbase.version>1.2.0</hbase.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>${hbase.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_${scala.version}</artifactId>
        <version>${spark.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-server</artifactId>
        <version>${hbase.version}</version>
    </dependency>
</dependencies>

HBase里有一张testUwbMessage表,统计表有多少行,取十条数据查看
创建一个scala object,代码如下

package main.java.com.spark2hbase

import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.Result
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.hadoop.hbase.mapreduce.TableInputFormat

object Spark_HBase {
  def main(args: Array[String]): Unit = {

    val sparkConf = new SparkConf()
      .setAppName("test")
      .setMaster("local[2]")

    val sc = new SparkContext(sparkConf)

    val hbaseConf = HBaseConfiguration.create()
    hbaseConf.set("hbase.zookeeper.property.clientPort", "2181")//zookeeper端口
    hbaseConf.set("hbase.zookeeper.quorum","mf04,mf05,mf06")//zookeeper集群,我这里本地配了映射,所以写的主机名,建议直接写ip
    hbaseConf.set(TableInputFormat.INPUT_TABLE,"testUwbMessage")//表名字

    val hbaseRDD= sc.newAPIHadoopRDD(hbaseConf,classOf[TableInputFormat],classOf[ImmutableBytesWritable],classOf[Result])//转换成[key,value]形式的rdd

    val count = hbaseRDD.count()

    println(count)
    
    hbaseRDD.map(_._2)
      .map(a => (
        Bytes.toString(a.getRow),//取出rowkey
        Bytes.toString(a.getValue(Bytes.toBytes("info"), Bytes.toBytes("messageTime"))),//取出当前rowkey列簇为info列名为messagetime的cell
        Bytes.toString(a.getValue(Bytes.toBytes("info"), Bytes.toBytes("labelId")))//取出当前rowkey列簇为info列名为labelId的cell
      )
      )
      .take(10).foreach(println)
    sc.stop
  }
}

点击运行,统计结果是
在这里插入图片描述
ok以上只是简单的row count和查询,我也是刚接触不久,有不对的地方欢迎指出纠正,谢谢!

<think>我们参考用户提供的引用[1]和引用[2]中的代码示例,它们都使用了`sc.newAPIHadoopRDD`方法来读取HBase数据。同时,引用[3]提到了一种转换思路(将HBase数据映射到Hive表,然后直接读取Hive表得到DataFrame),但用户明确要求使用Spark读取HBase的示例代码,因此我们主要展示第一种方式。注意:在Spark读取HBase数据通常需要将HBase的配置(如Zookeeper地址、表名)传递给RDD读取方法。另外,需要指定key和value的转换器。根据引用[1]和[2]的示例,我们可以整合一个基本的读取HBase数据的代码框架。同时,我们需要注意,引用[1]中的代码在valueConv的字符串中有一个逗号写成了点(应该是笔误),我们这里修正一下。步骤:1.创建SparkConf和SparkContext。2.设置HBase配置,包括Zookeeper的地址和要读取的表。3.定义key和value的转换器(使用Spark自带的转换器)。4.使用`newAPIHadoopRDD`方法读取数据,得到RDD。5.对RDD进行操作(如count,collect等)。另外,引用[4]提到了一种使用SparkSQL读取HBase数据的方式,但需要特定的包。这里用户没有提供具体的包,所以我们先使用基本的方法。注意:使用这种方式读取HBase需要确保Spark的类路径中包含HBase的相关jar包。通常,在提交Spark作业时需要指定这些jar包。下面提供示例代码:</think> ### 使用 PySpark 读取 HBase 数据的解决方案 根据站内引用和最佳实践,以下是使用 Python Spark 读取 HBase 数据的完整示例代码,包含三种常用方式: #### 方式1:使用 `newAPIHadoopRDD` 基础读取(适合全表扫描) ```python #!/usr/bin/env python3 from pyspark import SparkConf, SparkContext # 初始化 Spark 环境 conf = SparkConf().setMaster("local").setAppName("HBaseReader") sc = SparkContext(conf=conf) # HBase 配置参数 hbase_conf = { "hbase.zookeeper.quorum": "localhost", # Zookeeper 地址 "hbase.mapreduce.inputtable": "student", # 目标表名 "hbase.scan.cache": "100", # 每次扫描缓存行数 "zookeeper.znode.parent": "/hbase" # HBase 根路径(集群配置) } # 键值转换器 key_conv = "org.apache.spark.examples.pythonconverters.ImmutableBytesWritableToStringConverter" value_conv = "org.apache.spark.examples.pythonconverters.HBaseResultToStringConverter" # 读取 HBase 数据 hbase_rdd = sc.newAPIHadoopRDD( inputFormatClass="org.apache.hadoop.hbase.mapreduce.TableInputFormat", keyClass="org.apache.hadoop.hbase.io.ImmutableBytesWritable", valueClass="org.apache.hadoop.hbase.client.Result", keyConverter=key_conv, valueConverter=value_conv, conf=hbase_conf ) # 数据处理示例 print("总记录数:", hbase_rdd.count()) for row_key, row_data in hbase_rdd.take(3): print(f"RowKey: {row_key}, Data: {row_data}") ``` #### 方式2:通过 Phoenix 高效查询(推荐生产环境) ```python from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("PhoenixReader") \ .config("spark.jars.packages", "org.apache.phoenix:phoenix-spark:5.0.0-HBase-2.0") \ .getOrCreate() # 构建 Phoenix 查询 df = spark.read \ .format("org.apache.phoenix.spark") \ .option("table", "student") \ .option("zkUrl", "localhost:2181:/hbase") \ .load() # 执行 SQL 查询 df.createOrReplaceTempView("students") result = spark.sql("SELECT name, age FROM students WHERE grade > 80") result.show(5) ``` #### 方式3:转换为 DataFrame(需添加数据处理) ```python from pyspark.sql import Row # 转换函数 def parse_hbase_record(row): cols = row[1].split(';') return Row( rowkey=row[0], name=cols[0].split(':')[1], age=int(cols[1].split(':')[1]) ) # 转换 RDD → DataFrame parsed_rdd = hbase_rdd.map(parse_hbase_record) df = spark.createDataFrame(parsed_rdd) df.printSchema() df.show() ``` ### 关键配置说明 1. **依赖配置**: - 必须包含 HBase 和 Phoenix 的 Jar 包 - 提交命令示例: ```shell spark-submit --packages org.apache.hbase:hbase-client:2.4.9,org.apache.phoenix:phoenix-spark:5.0.0-HBase-2.0 your_script.py ``` 2. **配置优化**: ```python # 增加扫描缓存提升性能 hbase_conf["hbase.client.scanner.caching"] = "1000" # 设置批量处理大小 hbase_conf["hbase.htable.threads.max"] = "8" ``` 3. **查询过滤**: ```python # 添加 RowKey 范围过滤 hbase_conf["hbase.mapreduce.scan.row.start"] = "user100" hbase_conf["hbase.mapreduce.scan.row.stop"] = "user200" ``` ### 常见问题解决 1. **ClassNotFound 错误**: 确保包含所有 HBase 相关依赖包[^1][^2] 2. **连接超时**: 检查 `hbase.zookeeper.quorum` 和 `zookeeper.znode.parent` 配置是否正确[^2] 3. **性能优化**: - 避免全表扫描,使用 RowKey 范围查询 - 批量读取设置合适的缓存大小[^1][^2] > 注意:直接读取 HBase 适合批量处理,实时查询推荐 Phoenix 方案[^3][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值