Spark写入数据到Hbase(上)

spark将数据写入hbase以及从hbase读取数据 本文将介绍 1、spark如何利用saveAsHadoopDataset和saveAsNewAPIHadoopDataset将RDD写入hbase 2、spark从hbase中读取数据并转化为RDD 操作方式为在eclipse本地运行spark连接到远程的hbase。 java版本:1.7.0 scala版本:2.10.4 zookeeper版本:3.4.5(禁用了hbase自带zoo 阅读详情

这是个踩坑的过程,上篇的虽然跑通了,但是其实版本配置有问题,记得看下篇😀
环境配置:
Scala:2.12.1
Spark:2.4.4
Hbase:2.2.3


前言:
前面有篇文章我使用了pyspark,弄得我很累,感觉python开发确实没那么好,看了些网上的文章和问了下朋友决定还是学学使用scala。(可以看看这个,我觉得挺有道理的.)
环境:
因为我也是第一次搞scala,如果你们也是的话,可以参考一下:
windows上 IntelliJ IDEA安装scala环境 详细 初学.
IDEA 开发 scala.

代码:

这里我参考了这个:http://dblab.xmu.edu.cn/blog/1316-2/.

只要代码测试成功了我再往下写,可是因为环境版本不一样,我改了一些地方的。

我们先建表和插入一些数据进去:(复制黏贴到hbase shell里面就一次过全部执行了,我是不是很贴心)

create 'student','info'
put 'student','1','info:name','Xueqian'
put 'student','1','info:gender','F'
put 'student','1','info:age','23'
put 'student','2','info:name','Weiliang'
put 'student','2','info:gender','M'
put 'student','2','info:age','24'

Pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.shct</groupId>
    <artifactId>sparkhbasetest</artifactId>
    <version>1.0-SNAPSHOT</version>


    <properties>
        <jdk.version>1.8</jdk.version>
        <scala.version>2.12.1</scala.version>
        <spark.version>2.4.4</spark.version>
        <hadoop.version>3.1.2</hadoop.version>
        <hbase.version>2.2.3</hbase.version>
    </properties>
    <dependencies>
        <!--scala-->
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
        </dependency>

        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-reflect</artifactId>
            <version>${scala.version}</version>
        </dependency>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-compiler</artifactId>
            <version>${scala.version}</version>
        </dependency>

        <!--spark-core-->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>

        <!--hadoop-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>${hadoop.version}</version>
        </dependency>

        <!--hbase-->
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>${hbase.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>${hbase.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase</artifactId>
            <version>${hbase.version}</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-mapreduce</artifactId>
            <version>${hbase.version}</version>
        </dependency>

    </dependencies>

    <build>
        <sourceDirectory>src/main/scala</sourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.scala-tools</groupId>
                <artifactId>maven-scala-plugin</artifactId>
                <version>2.15.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <createDependencyReducedPom>false</createDependencyReducedPom>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.test.SparkCount</mainClass>
                                </transformer>
                            </transformers>

                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

读取:

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.hbase._
import org.apache.hadoop.hbase.client._
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.util.Bytes
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.hadoop.hbase.mapreduce.TableInputFormat

object sparkHbaseRead {
  def main(args:Array[String]): Unit ={
    val conf=HBaseConfiguration.create()
    val sc = new SparkContext(new SparkConf())
    //设置查询的表名
//    conf.set("hbase.mapreduce.inputtable", "Studet")
    conf.set(TableInputFormat.INPUT_TABLE,"student")
    conf.set("zookeeper.znode.parent","/hbase-unsecure")
    conf.set("hbase.zookeeper.property.clientPort", "2181")
    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)
    })
  }
}

这里修改的地方是,加入了zookeeper.znode.parent的配置,如果不配置的话有可能会出现以下错误:

java.util.concurrent.ExecutionException: org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /hbase/hbaseid
Caused by: java.io.IOException: org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /hbase

zookeeper.znode.parent是你的Hbase里的配置文件hbase-site.xml的配置,如果你的这个配置文件没有写这一项的话,则不需要写


写入:

import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.mapreduce.TableOutputFormat
import org.apache.spark._
import org.apache.hadoop.mapreduce.Job
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.client.Result
import org.apache.hadoop.hbase.client.Put
import org.apache.hadoop.hbase.util.Bytes



object spaekHbaseWrite {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setAppName("SparkWriteHBase").setMaster("local")
    val sc = new SparkContext(sparkConf)
    val tablename = "student"
    // hbase 的连接设置
    val hconf = sc.hadoopConfiguration
    hconf.set("hbase.zookeeper.property.clientPort","2181")
    hconf.set("zookeeper.znode.parent","/hbase-unsecure")
    hconf.set("hbase.zookeeper.quorum","192.168.0.111")
    hconf.set(TableOutputFormat.OUTPUT_TABLE,tablename)

    
    val job = Job.getInstance(hconf)
    job.setOutputKeyClass(classOf[ImmutableBytesWritable])
    job.setOutputValueClass(classOf[Result])
    job.setOutputFormatClass(classOf[TableOutputFormat[ImmutableBytesWritable]])

    val indataRDD = sc.makeRDD(Array("7,小明,M,10","8,小红,F,12")) //构建两行记录

    val rdd = indataRDD.map(_.split(',')).map{arr=>{

    val put = new Put(Bytes.toBytes(arr(0))) //行健的值
//    put.add(Bytes.toBytes("info"),Bytes.toBytes("name"), Bytes.toBytes(arr(1)))  //info:name列的值
//    put.add(Bytes.toBytes("info"),Bytes.toBytes("gender"),Bytes.toBytes(arr(2)))  //info:gender列的值
//    put.add(Bytes.toBytes("info"),Bytes.toBytes("age"),Bytes.toBytes(arr(3)))  //info:age列的值
    put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("name"), Bytes.toBytes(arr(1).toString)) //info:name列的值
    put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("gender"),Bytes.toBytes(arr(2)))  //info:gender列的值
    put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("age"),Bytes.toBytes(arr(3)))  //info:age列的值
      (new ImmutableBytesWritable, put)
    }}
    rdd.saveAsNewAPIHadoopDataset(job.getConfiguration)
    sc.stop()
  }
}

写入这里主要修改的还是在配置那里想办法加入了zookeeper.znode.parent,并且我发现put.add会报错,因为hbase在2.x.x之后,hbase-client的Put.add接口变了,从Put.add变成了 Put.addColumn。

Spark连接Hbase并写入数据的两种方法 前面和大家聊过Spark和Hive的集成,以及如何连接MySQL,今天主要就说下Spark连接Hbase,这可能要复杂一点,首先Hbase是列式存储的,结构可能和前面所说的数据库不一样,这样就必须要转换,而且导的依赖包也不一样,不是在maven仓库中所下的。下面就和大家说下。 导入依赖包 接下来spark集成hbase,把hbase中lib下的以下jar包拷贝到spark中的jars文件夹下面: 导入后重新启动Spark就可以了。 有时会报zookeeper的错误,这时可以把zookeeper-3.4.6 阅读详情

相关推荐

使用spark将数据写入Hbase

--------------组装xml并捕获异常------------------- package wondersgroup_0628.com import java.io.{IOException, PrintWriter, StringReader, StringWriter} import java.util.Base64 import com.wonders.TXmltmp im...

YouMe的博客 3100

spark如何导入数据到hbase数据库

spark访问hbase数据库 在实际生产过程中,因为数据的复杂性,我们通常将处理好的数据缓存到hbase中。 本篇文章目的在于在学习过程中做笔记,以备后面的巩固复习。 代码如下 package com.aura.bigdata.dmp.util import org.apache.hadoop.conf.Configuration import org.apache.hadoop.hbase....

qq_42750329的博客 1457

别再只盯着GPS了!手把手教你用Python仿真UWB定位,30厘米精度是怎么算出来的?

本文详细解析了UWB(超宽带)室内定位技术的原理与实现,通过Python代码演示如何从三边测量法到实现30厘米精度的定位。文章涵盖了UWB的核心数学模型、Python仿真环境搭建、误差分析及优化策略,为开发者提供了实用的技术指南和应用场景。

weixin_26873711的博客 252

Spark DataFrame写入HBase的常用方式

Spark是目前最流行的分布式计算框架,而HBase则是在HDFS之上的列式分布式存储引擎,基于Spark做离线或者实时计算,数据结果保存在HBase中是目前很流行的做法。例如用户画像、单品画像、推荐系统等都可以用HBase作为存储媒介,供客户端使用。 因此Spark如何向HBase中写数据就成为很重要的一个环节了。本文将会介绍三种写入的方式,其中一种还在期待中,暂且官网即可... 代码在sp...

weixin_34302798的博客 593

【深度学习基础】Temporal Fusion Transformer

从下向上看:全连接(Dense) → ELU(指数线性激活函数(比relu好点,有利于模型收敛)) → 全连接(Dense) → 门控线性单元(Gate)(Gated Linear Units (GLUs)) → Layernorm。:一方面,它可以进行静态上下文变量和动态变量的融合,另一方面,通过门控进行了特征选择操作,门控体现在GLU(门控线性单元)中,用了sigmoid控制信息的通过程度,具有良好的适应性,能够自动选择有效信息,自适应地调整网络复杂性。输入:主输入,可选的上下文向量c。

weixin_41838721的博客 1227

Spark的DataFrame、RDD写入到HBase的方法(Scala)

一、使用DataFrame.saveAsHadoopDataset(conn)方法。 特点:适合做批量的写入。优点为批量写入方便快捷。缺点对于数据量大的DF写入速度太慢。 val conn = new JobConf(HBaseConfigurationcreate())//设置HBase连接 conn.set(,) conn.set(,)//设置Host和Port conn.set(TableO...

恩特尔派 3255

Eclipse在Mac上报错JNI_CreateJavaVM?可能是你的JDK架构搞错了(附Adoptium JDK下载指南)

本文深入解析了Mac(尤其是Apple Silicon芯片)上Eclipse启动时出现“JNI_CreateJavaVM”错误的根本原因,即JDK架构(aarch64与x86_64)不匹配。文章提供了详细的诊断步骤,并推荐通过下载并配置Eclipse Adoptium提供的aarch64版本JDK来彻底解决问题,同时附上清晰的配置指南。

weixin_29065659的博客 321

Spark 读写Hbase

启动 zookeeper----》hadoop----》hbase 创建hbase表student create 'student' ,'info' 添加数据 put 'student' ,'1' ,'info:name','James' put 'student' ,'1' ,'info:age','23' put 'student' ,'1' ,'info:gender','F' put 'student' ,'2' ,'info:name','Smith' put 'studen

4290

Android-音频配置文件详解

前言:   Android P 引入了一种新的音频政策配置文件格式 (XML),用于描述音频拓扑。新的 XML 文件支持定义输出输入流配置文件、可用于播放和捕获的设备以及音频属性的数量和类型。但是每个项目的代码里面都有很多音频配置文件,具体使用的是哪个文件呢?本文将详细讲述。 1. 查看运行时具体使用的xml adb shell dumpsys media.audio_policy | grep -iE "Config source:" 结果如下: Config source: /vendor

cheriyou_的博客 3946

Codex 100个真实案例 - 用AI生成建筑平面图SVG(室内设计师的新武器)

本案例用 Codex 生成一套完整的 Python 脚本,自动绘制 SVG 格式的建筑平面图。我们会设计一个90平两室一厅的户型——客厅、主卧、次卧、厨房、卫生间一应俱全,还会自动摆放家具(沙发、床、餐桌、橱柜)、标注尺寸和面积、绘制水电路走向、生成多种配色方案。最终输出的 SVG 文件可以直接用浏览器打开展示,也可以转成 PNG 交给客户。室内设计师看了都说好!

yueyeguzhuo的专栏 763

Spark往HBase读写数据(Scala语言)

概述 这是原始版本的,不是用phoenix的 准备HBase数据 此时 HBase的ns1下的t1是有数据的 hbase(main):005:0> scan 'ns1:t1' ROW COLUMN+CELL 1001 column=cf1:age, timestamp=1605086867452, value=27 1001 column=cf1:name, timestamp=1605

张俊杰 的博客 1720

基于Simulink的电力电子系统电磁兼容性(EMC)仿真

在电力电子系统中,由于高频开关器件的存在,会产生大量的电磁干扰(EMI),这对系统的稳定性和可靠性提出了挑战。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证电力电子系统的电磁兼容性。本教程将详细介绍如何使用 Simulink 进行电力电子系统的电磁兼容性仿真。通过本教程,我们详细介绍了如何使用 Simulink 进行电力电子系统的电磁兼容性仿真。为了模拟电力电子系统中的电磁干扰(EMI),我们需要添加噪声源模块。为了更好地分析系统的电磁兼容性特性,可以在模型中添加频谱分析工具。

amy_mhd的博客 1126

spark 数据写入到 hbase

1)spark把数据写入到hbase需要用到:PairRddFunctions的saveAsHadoopDataset方法,这里用到了 implicit conversion,需要我们引入 import org.apache.spark.SparkContext._ 2)spark写入hbase,实质是借用了org.apache.hadoop.hbase.mapreduce.TableInpu...

potter 2813

Android Keymaster- 设备集成笔记 嵌入式

本文介绍了 Android Keymaster 的原理、使用方法和示例源代码。Android Keymaster 是一个重要的安全组件,为开发者提供了加密和解密功能,用于保护设备上存储的敏感数据。Android Keymaster 是 Android 系统的一个安全组件,用于保护设备上存储的敏感数据。Keymaster 使用基于硬件的密钥存储,同时提供了一组 API,让开发者可以在应用程序中使用这些加密功能。在嵌入式设备中,Android Keymaster 是一个重要的组件,用于提供加密和解密功能。

LrFortran的博客 671

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

spark保存数据到hbase_spark 数据写入到 hbase

1)spark把数据写入到hbase需要用到:PairRddFunctions的saveAsHadoopDataset方法,这里用到了implicit conversion,需要我们引入import org.apache.spark.SparkContext._2)spark写入hbase,实质是借用了org.apache.hadoop.hbase.mapreduce.TableInputFor...

weixin_39576018的博客 640

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

spark 存入hbase_spark将数据写入hbase以及从hbase读取数据

本文将介绍1、spark如何利用saveAsHadoopDataset和saveAsNewAPIHadoopDataset将RDD写入hbase2、spark从hbase中读取数据并转化为RDD操作方式为在eclipse本地运行spark连接到远程的hbase。java版本:1.7.0scala版本:2.10.4zookeeper版本:3.4.5(禁用了hbase自带zookeeper,选择自己部...

weixin_29974217的博客 1073

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

spark保存数据到hbase_使用spark将数据写入Hbase

--------------组装xml并捕获异常-------------------package wondersgroup_0628.comimport java.io.{IOException, PrintWriter, StringReader, StringWriter}import java.util.Base64import com.wonders.TXmltmpimport org...

weixin_39906130的博客 457

spark读取kafka数据写入hbase

package com.prince.demo.test import java.util.UUID import com.typesafe.config.{Config, ConfigFactory} import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase.client.Put impo...

最怕你一生碌碌无为 还安慰自己平凡可贵 3843

Spark读取Hive数据写入Hbase

使用spark方式写入 在使用Spark时经常需要把数据落入HBase中,如果使用普通的Java API,写入会速度很慢。还好Spark提供了Bulk写入方式的接口。那么Bulk写入与普通写入相比有什么优势呢? BulkLoad不会写WAL,也不会产生flush以及split。 如果我们大量调用PUT接口插入数据,可能会导致大量的GC操作。除了影响性能之外,严重时甚至可能会对HBase节点的...

Baron_ND的博客 2184

spark-整合Phoenix将数据写入Hbase

文章目录一 环境准备1.1 pom文件1.2 config配置:1.3 properties解析工具类1.4 HbaseUtil工具类1.5 kafkaUtil根据指定的topic返回对应的Dstream1.6 jedisUtils从连接池中获取Jedis连接实例1.7 样例类二 Spark直接将数据写入Hbase三 Spark整合Phoenix将数据写入hbase四遇到的问题问题1 :Phoen...

Master_chaoAndQi的博客 3081

Spark写入数据到hbase,本地idea运行

废话不多说,上代码: package day02.com.toHbase 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.

东城庞太师 660
上一篇: PySpark写入数据到Hbase的辛酸经历
下一篇: Spark写入数据到Hbase(下)解决scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps
铲子挖数据
博客等级 码龄8年 24粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值