Fork me on GitHub

Spark笔记9-HBase数据库基础

Hbase

术语

  • 表:HBase采用表来组织数据,表由行和列组成。列被划分成多个列族

  • 列族:HBase的基本访问控制单元

  • 行:HBase由若干个行组成,每个行由行键row key进行标识

  • 列限定符:列族的数据通过列限定符来进行定位

  • 时间戳:每个单元格保存着同一份数据的多个版本,这些版本通过时间戳来进行索引

  • 单元格:在表中,通过行、列族和列限定符确定一个单元格cell。单元格中存储的数据没有数据类型,被视为字节数组byte[]。每个值都是通过单元格进行保存的。

    KIX04P.png

    通过四维数据:行键+列族+列限定符+时间戳,才能限定一个数据

文件读写

  1. 本地文件读写

    1
    2
    3
    textFile = textFile("file:///usr/local/spark/word.txt")
    textFile.saveAsFile("file:///usr/local/spark/writevback") # 写进入文件中,一定是写入某个目录中,而不是具体的某个里面
    textFile = sc.textFile("file:///usr/local/spark/writevback") # 加载目录中的所有文件
  2. 分布式文件系统HDFS的读写

KI7z34.png

启动Hbase数据

Hbase是谷歌开源的big table;一个表中包很多的行和列。HBase的底层是保存在HDFS之上的。

KIHmgH.png

1
2
3
4
5
6
7
8
# 启动Hadoop
cd /usr/local/hadoop
./sbin/start-all.sh

# 启动HBase
cd /usr/local/hbase
./bin/start-hbase.sh
./bin/hbase shell # 启动hbase shell

创建表student

1
2
3
4
hbase> disable 'student'
hbase> drop 'student' # 删除表

habse> create 'student', 'info' # 创建表和列限定符

插入数据

关键字是put,每次插入一个单元格的数据

1
2
3
4
# 插入数据,每个单元格中插入一个数据
hbase> put 'student', '1','info:name','xueqian'
hbase> put 'student', '1','info:gender','F'
hbase> put 'student', '1','info:age','22'

KIxr36.png

配置spark

需要新建一个hbase目录,用来存放所有的jar

KIzwqg.png

还有格jar包

KIzyin.png

1
2
3
4
5
6
7
cd /usr/local/spark/conf
vim spark-env.sh
# 最后一行添加内容
export
SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop
classpath):$(/usr/local/hbase/bin/hbase
classpath):/usr/local/spark/jars/hbase/*

读取数据

HBase内部数据的格式转成string类型

1
2
3
4
5
6
7
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("readHBase")
sc = SparkContext(conf=conf)
host = "localhost"
table = "student"
conf = {"hbase.zookeeper.quorum": host,
"hbase.mapreduce.inputtable":table}

KoPtu6.png

写入数据

string类型转成HBase内部的可读取形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
rom pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("readHBase")
sc = SparkContext(conf=conf)
host = "localhost"
table = "student"

keyConv = ...
valueConv = ...
conf = ...
rawData = ['3,info,name,xiaoming', # 待插入的每个单元格的数据
'3,info,age,26',
'3,info,gender,M',
'4,info,name,zhangsan',
'4,info,age,20',
'4,info,gender,M']

sc.parallelize(rawData).map(lambda x:(x[0],x.split(","))).saveAsNewAPIHadoopDataset(conf=conf, keyConverter=keyxConv, valueConverter=valueConv)

查看数据

切换到HBase shell的交互式环境中,通过 scan ‘student’ 进行查看

本文标题:Spark笔记9-HBase数据库基础

发布时间:2019年10月31日 - 17:10

原始链接:http://www.renpeter.cn/2019/10/31/Spark%E7%AC%94%E8%AE%B09-HBase%E6%95%B0%E6%8D%AE%E5%BA%93%E5%9F%BA%E7%A1%80.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea