当前位置: 移动技术网 > IT编程>数据库>Mysql > 荐 任务3: Spark RDD读写HBase数据

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

2020年07月14日  | 移动技术网IT编程  | 我要评论

任务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查看启动的情况
    在这里插入图片描述
    可以看到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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网