spark]使用spark进行hbase数据分析

【题外话】

感觉自己很沮丧。我自己认为,我的内心很纯净。

 

废话说了那么多,我想总结一下最近我学习spark的经验。

 

最近使用spark做了一个数据分析的项目。

项目采用的基础环境是:spark 1.6.0 hbase 0.98.17 hadoop2.5.2

项目的构建工具是:maven

项目采用的语言是 :java

 

这个项目分两个方面:

1.架构方面

2.实现方面

 

这也是我第一次正式的接触设计分布式存储和分布式计算的项目。

本次简单介绍一下分布式存储的简单知识:hbase的数据存储 spark并发计算框架

先假设存在N台机器,然后假设存在N1个虚拟的逻辑上的存放数据的槽,N和N1没有什么关系。
在处理数据前,先把N1个虚拟的槽和N个机器建立好对应关系。
在处理数据时,把数据按照某一种规则存入一个虚拟的槽内,这时,就能知道数据存入那一台机器。
 
[spark]使用spark进行hbase数据分析
 
1.首先预分配region,让每个region负责存储一部分数据,预创建 N
region个,以(负无穷,001),{001,002),...{N,正无穷)这样创建
2.拿到具体数据后,先对数据进行hash,生成hashcode,然后使用hashcode%(N 1),得到的数据肯定会落在上述的某一个区间,然后将数据存入
[spark]使用spark进行hbase数据分析


在上述基础上,我主要简介一下spark如果利用hbase的存储数据的特点来进行计算。

假设我们计算的时候需要目标表A,该表在hbase中有3个region。 
[spark]使用spark进行hbase数据分析

[spark]使用spark进行hbase数据分析
在假设该表的region1的startKey endKey为:负无穷,001
    假设该表的region2的startKey
endKey为:001     , 002
    假设该表的region3的startKey
endKey为:002 ,正无穷
 
再次假设,该表存储了10条数据:(partition:time:deviceid,这是rowkey的组成格式)
rowKey 000:2016031700:0012
rowKey 000:2016031700:0013
rowKey 000:2016031800:0013
 
rowKey 001:2016031700:0015
rowKey 001:2016031720:0016
rowKey 001:2016031800:0022
 
rowKey 002:2016031200:0015
rowKey 002:2016031800:0033
rowKey 002:2016031900:0022
rowKey 002:2016031900:0033
 
那么以前缀为000的数据会放在region1,也就是前面的那三条,以前缀001的数据会放在region2,也就是中间的那三条,以前缀为002的数据会放在region3,也就是最后的四条。
 
此时,在上述的假设的基础上,我们要计算2016031700时间对应的deviceid分别出现了多少次。计算方法如下:
 
1.拿到table
A对应的region的startkey和endkey对应的值,也就是上述的region1,region2,region3对应的startKey
endKey对应的值:ListKey
2.遍历ListKey,拿出KeyPair(first:startKey,second:endKey),假设第一次循环拿到region1的keyPair,也就是{负无穷,001),这时生成startKey
000:2016031700,生成endKey:001,即KeyPair(first:000:2016031700,second:001),放入SplitList
3.依次遍历ListKey后,生成SplitList
4.spark使用上述的SplitList进行assign
task.
 
我这里主要进行spark的task的生产策略的简单描述和rdd
partition的简单描述。
先普及二个知识:
 1.spark的并行度
spark中,task是运行在worker进程中的,一个worker占用一个或者多个core。worker的实例又可以设置多个。故一个集群的task最大并行度为:SPARK_WORKER_INSTANCES*SPARK_WORKER_CORES有过storm开发经验的同学,可能对这点很熟悉(worker--executor--task),storm里面对cpu
core的这点不知道是否支持的良好
希望对storm精通的同学能帮忙深度剖析一下这个storm
task并发的知识。
2.sparkRdd的partition的个数和spark的并行度的关系:spark
rdd的partition的个数和spark的task总数的关系是对应的。
 
上面介绍了数据的存储,现在派上用场了。我们针对上面的数据的存储模型,进行相应的数据计算。由于我是前天晚上才开始接触spark的,所有现在概念还不是特别熟悉,可能很多地方都存在错误的描述。如果能及时发现,请帮忙指正,多谢啊。
 
我们采用java编程。(spark的源码是scala编写的)
 
     
     
 
JavaPairRDD hBaseRDD = sparkContext.newAPIHadoopRDD(hbaseConf,SDKTableInputFormat.class, ImmutableBytesWritable.class, Result.class);
 生成一个RDD。这里面有一个类:TableInputFormat。他是TableInputFormater的派生类。追踪到最低层的话就是重写hadoop的InputFormat和RecordRead这两个。有兴趣的同学可以去看看这个。我这里提供一个demo的网址:http://blog.csdn.net/zhongyifly/article/details/25156145。这个rdd的partition的个数其实就是其内部生成的tableSplitList的链表的长度。也就决定了partition的数量。这个partition的数据跟上面两篇邮件中的partition的数量是一致的。
 

这时,我们就可以拿到数据进行分析了。  

posted @ 2016-07-01 10:25  XGogo  阅读(7311)  评论(0编辑  收藏  举报