欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 任务3: Spark RDD读写HBase数据

程序员文章站 2022-06-24 23:13:50
任务3: Spark RDD读写HBase数据配置参照林子雨老师的博客文章目录任务3: Spark RDD读写HBase数据一、实训背景二、实训环境三、实训步骤步骤1: 安装HBase步骤2: 配置HBase数据存储于hadoop步骤3: 制作HBase样本数据步骤4: Spark RDD读取HBase数据一、实训背景HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利...

任务3: Spark RDD读写HBase数据

配置参照林子雨老师的博客

一、实训背景

HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。

HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。

二、实训环境

  • 两台1核2G的主机
  • 主机系统为centos6.5
  • 都已安装jdk1.8,并在~/.bashrc配置了环境变量
  • 都已配置好ssh免密码登陆
  • 都已搭建好spark standalone集群平台
  • 都已搭建好hadoop集群环境

三、实训步骤

步骤1: 安装HBase

  1. 从清华大小镜像站点下载HBbase
root@server1 ~# wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/1.4.13/hbase-1.4.13-bin.tar.gz

2、解压程序包,并放在/usr/local目录下

root@server1 ~# tar xzvf hbase-1.4.13-bin.tar.gz -C /usr/local

3、配置环境变量,在~/.bashrc中将hbase下的bin目录添加到path中。

export PATH=$PATH:/usr/local/hbase/bin

注意,要运行source ~/.bashrc命令使之生效。

4、查看Hbase的版本

root@server1 ~# hbase version

步骤2: 配置HBase数据存储于hadoop

  1. 在hbase-env.sh配置JAVA_HOME环境变量

    [root@server1 conf]# vi hbase-env.sh
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el6_10.x86_64
    
  2. 配置hbase-site.xml文件

    [root@server1 conf]# vi hbase-site.xml
    <configuration>
    <property>
            <name>hbase.rootdir</name>
        <!-- hbase存放数据目录 -->
            <value>hdfs://server1:9000/hbase</value>
            <!-- 端口要和Hadoop的fs.defaultFS端口一致-->
    </property>
    <property>
            <name>hbase.cluster.distributed</name>
        <!-- 是否分布式部署 -->
            <value>true</value>
    </property>
    <property>
            <name>hbase.zookeeper.quorum</name>
            <!-- zookooper 服务启动的节点,只能为奇数个 -->
            <value>server1,server2</value>
    </property>
    <property>
            <!--zookooper配置、日志等的存储位置,必须为以存在 -->
            <name>hbase.zookeeper.property.dataDir</name>
            <value>/data/hbase/zookeeper</value>
    </property>
    <property>
            <!--hbase web 端口 -->
            <name>hbase.master.info.port</name>
            <value>16610</value>
    </property>
    </configuration>
    
  3. 配置regionservers

    [root@server1 conf]# vi regionservers 
    server1
    server2
    
  4. 拷贝Hbase到server2

    root@server1 local# scp -r hbase-2.2.4/ server2:/usr/local
    
  5. 启动HBase集群

    start-hbase.sh
    
  6. 打开http://server1:16610查看启动的情况
    荐
                                                        任务3: Spark RDD读写HBase数据
    可以看到HBase启动成功了。

步骤3: 制作HBase样本数据

  1. 启动HBase客户端

    [root@server1 hbase-2.2.4]# hbase shell
    
  2. 创建student表,列簇为info

    hbase(main):006:0> create 'student','info'
    0 row(s) in 1.3820 seconds
    
    => Hbase::Table - student
    
  3. 可以查看到表已经创建

    hbase(main):007:0> list
    TABLE                                                                                                                                               
    student                                                                                                                                             
    1 row(s) in 0.0080 seconds
    
    => ["student"]
    
  4. 插入两条记录包含用户名、年纪、性别

    hbase(main):008:0> put 'student','1','info:name','jie'
    0 row(s) in 0.1670 seconds
    
    hbase(main):009:0> put 'student','1','info:gender','M'
    0 row(s) in 0.0160 seconds
    
    hbase(main):010:0> put 'student','1','info:age','22'
    0 row(s) in 0.0100 seconds
    
    hbase(main):011:0> put 'student','2','info:name','sin'
    0 row(s) in 0.0060 seconds
    
    hbase(main):012:0> put 'student','2','info:gender','F'
    0 row(s) in 0.0080 seconds
    
    hbase(main):013:0> put 'student','2','info:age','20'
    0 row(s) in 0.0090 seconds
    
    

    查看表添加信息

    hbase(main):015:0> scan 'student'
    ROW                                    COLUMN+CELL                                                                                                  
     1                                     column=info:age, timestamp=1594658385946, value=22                                                           
     1                                     column=info:gender, timestamp=1594658377621, value=M                                                         
     1                                     column=info:name, timestamp=1594658360224, value=jie                                                         
     2                                     column=info:age, timestamp=1594658537082, value=20                                                           
     2                                     column=info:gender, timestamp=1594658413265, value=F                                                         
     2                                     column=info:name, timestamp=1594658396448, value=sin                                                         
    2 row(s) in 0.0560 seconds
    

步骤4: Spark RDD读取HBase数据

  1. 在开始编程操作HBase数据库之前,需要对做一些准备工作。

    请新建一个终端,执行下面命令,把HBase的lib目录下的一些jar文件拷贝到Spark中,这些都是编程时需要引入的jar包,需要拷贝的jar文件包括:所有hbase开头的jar文件、guava-12.0.1.jar、htrace-core-3.1.0-incubating.jar和protobuf-java-2.5.0.jar,可以打开一个终端按照以下命令来操作:

    # 在server1、server2添加
    cd /usr/local/spark/jars
    mkdir hbase
    cd hbase
    cp /usr/local/hbase/lib/hbase*.jar ./
    cp /usr/local/hbase/lib/guava-12.0.1.jar ./  
    # **此处为bug1,此文件需与share/hadoop/common/lib内guava.jar版本一致,将版本低的删除,选版本高的**
    cp /usr/local/hbase/lib/htrace-core-3.1.0-incubating.jar ./
    cp /usr/local/hbase/lib/protobuf-java-2.5.0.jar ./
    

    只有这样,后面编译和运行过程才不会出错。

  2. /usr/local/spark/mycode/hbase(自行创建相应文件夹)下,编写读取代码RDDtest.scala如下

    import org.apache.hadoop.conf.Configuration
    import org.apache.hadoop.hbase._
    import org.apache.hadoop.hbase.client._
    import org.apache.hadoop.hbase.mapreduce.TableInputFormat
    import org.apache.hadoop.hbase.util.Bytes
    import org.apache.spark.SparkContext
    import org.apache.spark.SparkContext._
    import org.apache.spark.SparkConf
    
    object SparkOperateHBase {
    def main(args: Array[String]) {
    
        val conf = HBaseConfiguration.create()
        val sc = new SparkContext(new SparkConf())
        //设置查询的表名
        conf.set(TableInputFormat.INPUT_TABLE, "student")
        val stuRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat],
      classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],
      classOf[org.apache.hadoop.hbase.client.Result])
        val count = stuRDD.count()
        println("Students RDD Count:" + count)
        stuRDD.cache()
    
        //遍历输出
        stuRDD.foreach({ case (_,result) =>
            val key = Bytes.toString(result.getRow)
            val name = Bytes.toString(result.getValue("info".getBytes,"name".getBytes))
            val gender = Bytes.toString(result.getValue("info".getBytes,"gender".getBytes))
            val age = Bytes.toString(result.getValue("info".getBytes,"age".getBytes))
            println("Row key:"+key+" Name:"+name+" Gender:"+gender+" Age:"+age)
        })
    }
    }
    
  3. /usr/local/spark/mycode/hbase目录下编写parkhbase.sbt,使用sbt打包,

    name := "RDDtest"
    version := "1.3.10"
    scalaVersion := "2.11.12"
    libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.5"
    libraryDependencies += "org.apache.hbase" % "hbase-client" % "1.4.13"
    libraryDependencies += "org.apache.hbase" % "hbase-common" % "1.4.13"
    libraryDependencies += "org.apache.hbase" % "hbase-server" % "1.4.13"
    

    打包命令如下:

    [root@server1 ~]cd /usr/local/spark/mycode/hbase
    [root@server1 hbase]# sbt package
    [info] Updated file /usr/local/spark/mycode/hbase/project/build.properties: set sbt.version to 1.3.10
    [info] Loading project definition from /usr/local/spark/mycode/hbase/project
    [info] Loading settings for project hbase from sparkhbase.sbt ...
    [info] Set current project to RDDtest (in build file:/usr/local/spark/mycode/hbase/)
    [warn] There may be incompatibilities among your library dependencies; run 'evicted' to see detailed eviction warnings.
    [info] Compiling 1 Scala source to /usr/local/spark/mycode/hbase/target/scala-2.11/classes ...
    [success] Total time: 34 s, completed 2020-7-14 0:50:01
    [info] Loading project definition from /usr/local/spark/mycode/hbase/project
    [info] Loading settings for project hbase from sparkhbase.sbt ...
    [info] Set current project to RDDtest (in build file:/usr/local/spark/mycode/hbase/)
    [success] Total time: 14 s, completed 2020-7-14 0:50:41
    

    打包成功后,生成的jar包的位置为/usr/local/spark/mycode/hbase/target/scala-2.11/rddtest_2.11-1.3.10.jar

    最后,通过 spark-submit 运行程序。我们就可以将生成的 jar 包通过 spark-submit 提交到 Spark 中运行了,命令如下:

    /usr/local/spark/bin/spark-submit --driver-class-path /usr/local/spark/jars/hbase/*:/usr/local/hbase/conf --class "SparkOperateHBase" /usr/local/spark/mycode/hbase/target/scala-2.11/rddtest_2.11-1.3.10.jar
    

此处为bug2,运行spark-submit报错提示java.lang.NoClassDefFoundError: com/yammer/metrics/core/Gauge时,说明我们在1添加少了metrics-core-*.jar ,进入 /usr/local/spark/jars/hbase/ 添加即可

重新运行spark-submit命令

  1. 在终端可以看到结果为:
Students RDD Count:2
Row key:1 Name:jie Gender:M Age:22
Row key:2 Name:sin Gender:F Age:20

本文地址:https://blog.csdn.net/kichum123/article/details/107327537