Spark是目前最流行的分布式计算框架,而HBase则是在HDFS之上的列式分布式存储引擎,基于Spark做离线或者实时计算,数据结果保存在HBase中是目前很流行的做法。例如用户画像、单品画像、推荐系统等都可以用HBase作为存储媒介,供客户端使用。

因此Spark如何向HBase中写数据就成为很重要的一个环节了。本文将会介绍三种写入的方式,其中一种还在期待中,暂且官网即可...

代码在spark 2.2.0版本亲测

1. 基于HBase API批量写入

第一种是最简单的使用方式了,就是基于RDD的分区,由于在spark中一个partition总是存储在一个excutor上,因此可以创建一个HBase连接,提交整个partition的内容。

大致的代码是:

rdd.foreachPartition { records =>

val config = HBaseConfiguration.create

config.set("hbase.zookeeper.property.clientPort", "2181")

config.set("hbase.zookeeper.quorum", "a1,a2,a3")

val connection = ConnectionFactory.createConnection(config)

val table = connection.getTable(TableName.valueOf("rec:user_rec"))

// 举个例子而已,真实的代码根据records来

val list = new java.util.ArrayList[Put]

for(i

val put = new Put(Bytes.toBytes(i.toString))

put.addColumn(Bytes.toBytes("t"), Bytes.toBytes("aaaa"), Bytes.toBytes("1111"))

list.add(put)

}

// 批量提交

table.put(list)

// 分区数据写入HBase后关闭连接

table.close()

}

这样每次写的代码很多,显得不够友好,如果能跟dataframe保存parquet、csv之类的就好了。下面就看看怎么实现dataframe直接写入hbase吧!

2. Hortonworks的SHC写入

由于这个插件是hortonworks提供的,maven的中央仓库并没有直接可下载的版本。需要用户下载源码自己编译打包,如果有maven私库,可以上传到自己的maven私库里面。具体的步骤可以参考如下:

2.1 下载源码、编译、上传

去官网github下载即可:https://github.com/hortonworks-spark/shc

可以直接按照下面的readme说明来,也可以跟着我的笔记走。

下载完成后,如果有自己的私库,可以修改shc中的distributionManagement。然后点击旁边的maven插件deploy发布工程,如果只想打成jar包,那就直接install就可以了。

2.2 引入

在pom.xml中引入:

com.hortonworks

shc-core

1.1.2-2.2-s_2.11-SNAPSHOT

2.3

首先创建应用程序,Application.scala

object Application {

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

val spark = SparkSession.builder().master("local").appName("normal").getOrCreate()

spark.sparkContext.setLogLevel("warn")

val data = (0 to 255).map { i => HBaseRecord(i, "extra")}

val df:DataFrame = spark.createDataFrame(data)

df.write

.mode(SaveMode.Overwrite)

.options(Map(HBaseTableCatalog.tableCatalog -> catalog))

.format("org.apache.spark.sql.execution.datasources.hbase")

.save()

}

def catalog = s"""{

|"table":{"namespace":"rec", "name":"user_rec"},

|"rowkey":"key",

|"columns":{

|"col0":{"cf":"rowkey", "col":"key", "type":"string"},

|"col1":{"cf":"t", "col":"col1", "type":"boolean"},

|"col2":{"cf":"t", "col":"col2", "type":"double"},

|"col3":{"cf":"t", "col":"col3", "type":"float"},

|"col4":{"cf":"t", "col":"col4", "type":"int"},

|"col5":{"cf":"t", "col":"col5", "type":"bigint"},

|"col6":{"cf":"t", "col":"col6", "type":"smallint"},

|"col7":{"cf":"t", "col":"col7", "type":"string"},

|"col8":{"cf":"t", "col":"col8", "type":"tinyint"}

|}

|}""".stripMargin

}

case class HBaseRecord(

col0: String,

col1: Boolean,

col2: Double,

col3: Float,

col4: Int,

col5: Long,

col6: Short,

col7: String,

col8: Byte)

object HBaseRecord

{

def apply(i: Int, t: String): HBaseRecord = {

val s = s"""row${"%03d".format(i)}"""

HBaseRecord(s,

i % 2 == 0,

i.toDouble,

i.toFloat,

i,

i.toLong,

i.toShort,

s"String$i: $t",

i.toByte)

}

}

然后再resources目录下,添加hbase-site.xml、hdfs-site.xml、core-site.xml等配置文件。主要是获取Hbase中的一些连接地址。

3. HBase 2.x+即将发布的hbase-spark

如果有浏览官网习惯的同学,一定会发现,HBase官网的版本已经到了3.0.0-SNAPSHOT,并且早就在2.0版本就增加了一个hbase-spark模块,使用的方法跟上面hortonworks一样,只是format的包名不同而已,猜想就是把hortonworks给拷贝过来了。

另外Hbase-spark 2.0.0-alpha4目前已经公开在maven仓库中了。

不过,内部的spark版本是1.6.0,太陈旧了!!!!真心等不起了...

期待hbase-spark官方能快点提供正式版吧。

参考

spark 存入hbase_Spark DataFrame写入HBase的常用方式相关推荐

  1. scala写入mysql_spark rdd转dataframe 写入mysql的实例讲解

    dataframe是在spark1.3.0中推出的新的api,这让spark具备了处理大规模结构化数据的能力,在比原有的RDD转化方式易用的前提下,据说计算性能更还快了两倍.spark在离线批处理或者 ...

  2. 干货:Spark RDD写入HBase 优化

    文章目录 一.HBase部分 1-1.hbase.regionserver.handler.count 1-2.压缩 1-3.分裂 1-4.hbase.regionserver.optionallog ...

  3. Spark使用Java读Hive写入HBase

    Spark使用Java读Hive写入HBase Spark读取Hive数据得方法在下面之前得一篇博客中有提及,在此就不重复提了,如果感兴趣得可以查阅如下连接中得博客 Spark使用Java读Hive得 ...

  4. Spark RDD、DataFrame原理及操作详解

    RDD是什么? RDD (resilientdistributed dataset),指的是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用. RDD内部可以 ...

  5. 数据导入HBase最常用的三种方式及实践分析

    要使用Hadoop,数据合并至关重要,HBase应用甚广.一般而言,需要针对不同情景模式将现有的各种类型的数据库或数据文件中的数据转入至HBase中. 常见方式为:1.使用HBase的API中的Put ...

  6. 01 HBase基本概念和hbase shell常用命令用法

    本文转载自:http://archive.cnblogs.com/a/2178064/ 1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一 ...

  7. HBase基本概念和hbase shell常用命令用法

    1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...

  8. Spark性能优化 -- Spark SQL、DataFrame、Dataset

    本文将详细分析和总结Spark SQL及其DataFrame.Dataset的相关原理和优化过程. Spark SQL简介 Spark SQL是Spark中 具有 大规模关系查询的结构化数据处理 模块 ...

  9. Python连接MySQL数据库(pymysql),DataFrame写入 MySQL(create_engine)- Python代码

    模块安装 使用以下命令安装 PyMySQL: $ pip install PyMySQL 若系统不支持 pip,还可以这样安装: $ git clone https://github.com/PyMy ...

最新文章

  1. Java 中文转拼音
  2. ubuntu重启+sublime快捷键
  3. Win Server 2008中开启Areo特效
  4. VS2017中删项目属性中连接器删除继承的值
  5. QT的QDBusArgument类的使用
  6. HNOI2013 游走
  7. 【Linux】一步一步学Linux——cat/tac命令(38)
  8. 【白皮书】中国高端制造投融资白皮书.pdf(附下载链接)
  9. 约瑟夫环(简单版)c语言解决
  10. 面试题30.最小的k个数
  11. centos7搭建nexus maven私服
  12. 字符串队列c语言,c语言队列问题
  13. Bitvise SSH Server超过登录失败次数锁定IP配置
  14. 产品线 产品宽度 产品的深度 产品的相关度(理解工厂模式)
  15. 4行代码实现微信送祝福,这个新年有点不一样
  16. 一叶知秋:通过Incloud Rail感受浪潮超融合架构
  17. 安卓学习笔记---支付宝支付-交易订单处理失败,请稍后再试。(提示ALI59错误)
  18. react native fect network request failed
  19. 表单验证-通用表单验证大全/通用表单验证函数收集
  20. 20快速开发网站项目的工具和方法

热门文章

  1. go 计算文件sha-256_Kubernetes入门实践--部署运行Go项目
  2. css grid随页面大小_CSS中的间距知识总结,前端开发中各种间距的使用及优缺点
  3. python获取当前脚本所在路径并在此基础上创建新的文件路径
  4. QT每日一练day18:文件IO
  5. 简单的php引导页面设计,PS简单制作唯美朦胧柔美的渐变APP引导页
  6. java string 栈_Java堆和栈的区别(String类)
  7. linux查看电脑硬件信息,Linux下查看电脑硬件配置【转】
  8. linux中命令date,Linux 中date命令的用法
  9. linux libstdc 怎样升级,linux 更新libstdc++.so.6
  10. linux 可道云_如何搭建私有云