借hbase-rdd二次开发谈如何在Spark Core之上扩建自己的模块

开发 架构 Spark
我是51CTO学院讲师张敏,在51CTO学院 “4.20 IT充电节”(4月19~20日) 到来之际,和大家分享一下Spark Core之上扩建自己的模块的经验。

我是51CTO学院讲师张敏,在51CTO学院 “4.20 IT充电节”(4月19~20日) 到来之际,和大家分享一下Spark Core之上扩建自己的模块的经验。正文来啦~~~

[[188540]]

hbase-rdd是一个构建在SparkContext基础之上的用于对Hbase进行增删改查的第三方开源模块,目前***版本为0.7.1。目前该rdd在操作hbase时,默认调用隐式方法。

 

  1. implicitdef stringToBytes(s: String): Array[Byte] = {  
  2. Bytes.toBytes(s)  

将RDD的key转换成字节b,然后调用Hbase的put(b)方法保存rowkey,之后将RDD的每一行存入hbase。

在轨迹图绘制项目数据计算中,我们考虑到hbase的rowkey的设计——尽量减少rowkey存储的开销。虽然hbase-rdd最终的rowkey默认都是采用字节数组,但这个地方我们希望按自己的方式组装rowkey。使用MD5(imei)+dateTime组成的字节数组作为rowkey。因此默认的hbase-rdd提供的方法是不满足我们存储需求的,需要对源代码进行修改。在toHbase方法中,有一个convert方法,该方法将对RDD中的每一行数据进行转化,使用RDD中的key生成Put(Bytes.toBytes(key))对象,该对象为之后存储Hbase提供rowkey。

在convert函数中,对其实现进行了改造,hbase-rdd默认使用stringToBytes隐式函数将RDD的String类型的key转换成字节数组,这里我们需要改造,不使stringToBytes隐式方法,而是直接生成字节数据。

 

  1. protected def convert(id: String, values: Map[String, Map[String, A]], put: PutAdder[A]) = {  
  2. val strs = id.split("," 
  3. val imei = strs {0}  
  4. val dateTime = strs {1}  
  5. val b1 = MD5Utils.computeMD5Hash(imei.getBytes())  
  6. val b2 = Bytes.toBytes(dateTime.toLong)  
  7. val key = b1.++(b2)  
  8. val p = new Put(key)//改造  
  9. var empty = true  
  10. for {  
  11. (family, content) <- values  
  12. (key, value) <- content  
  13. } {  
  14. empty = false  
  15. if (StrUtils.isNotEmpty(family) &&StrUtils.isNotEmpty(key)) {  
  16. put(p, family, key, value)  
  17.  
  18.  
  19. if (empty) None else Some(new ImmutableBytesWritable, p)  

这样就实现了使用自己的方式构建rowkey,当然基于此思想我们可以使用任意的方式构建rowkey。

在使用hbase-rdd插件的过程中,我在思考,默认的RDD上是没有toHbase方法的,那为什么引入hbase-rdd包之后,RDD之上就有toHbase方法了?经过查看源码,发现hbase-rdd包中提供了两个隐式方法:

  1. implicitdef toHBaseRDDSimple[A](rdd: RDD[(String, Map[String, A])])(implicit writer: Writes[A]): HBaseWriteRDDSimple[A] =new HBaseWriteRDDSimple(rdd, pa[A]) 
  2. implicit def toHBaseRDDSimpleTS[A](rdd: RDD[(String, Map[String, (A, Long)])])(implicit writer: Writes[A]): HBaseWriteRDDSimple[(A, Long)] =new HBaseWriteRDDSimple(rdd, pa[A]) 

这两个方法在发现RDD上没有toHbase方法时会自动尝试调用,从隐式定义中尝试找到解决方案,尝试之后发现有定义toHBaseRDDSimple隐式方法,于是调用该隐式方法新建HBaseWriteRDDSimple类,返回hBaseWriteRDDSimple,而在hBaseWriteRDDSimple对象中是有toHbase方法的,因此在引入hbase-rdd之后,可以发现原本没有toHbase方法的RDD上有toHbase方法了。这一切都要归功于Scala强大的隐式转换功能。

那明白了原理,是否我们可以基于RDD写自己的模块,说干就干!

***步:新建Trait

 

  1. traitHaha{ 
  2. implicitdef gaga[A](rdd: RDD[String]): Hehe= 
  3. newHehe(rdd) 

第二步:新建Hehe类

 

  1. final  class Hehe(rdd:RDD[String]) { 
  2. def wow(tableName:String,family:String): Unit ={ 
  3. println("---------------------------------------------"
  4. println("tableName:"+tableName+" - family:"+family) 
  5. println("size:"+rdd.count()) 
  6. rdd.collect().foreach(data=>println(data)) 
  7. println("---------------------------------------------"
  8.    } 

第三步:新建包对象

  1. package object test extends Haha 

第四步:新建test类

 

  1. object Test{ 
  2. def main(args: Array[String]) { 
  3. valsparkConf = new SparkConf().setAppName("Test"
  4. valsc = new SparkContext(sparkConf) 
  5. sc.makeRDD(Seq("one","two","three","four")).wow("taskDataPre","T"
  6.   } 

项目结构图:

借hbase-rdd二次开发谈如何在Spark Core之上扩建自己的模块

运行效果图:

借hbase-rdd二次开发谈如何在Spark Core之上扩建自己的模块

希望对大家以后的开发有帮助,同时借鉴本案例,在Spark Core之上构建自己的小模块。

51CTO学院 4.20 IT充电节

(19-20号两天,100门视频课程免单抢,更有视频课程会员享6折,非会员享7折,套餐折上8折,微职位立减2000元钜惠)

活动链接:http://edu.51cto.com/activity/lists/id-47.html?wenzhang

相关视频教程:

【大数据 Spark2.x 流数据处理】精通Spark流数据处理(持续完毕)

责任编辑:未丽燕 来源: 51CTO学院
相关推荐

2022-03-11 22:52:29

调试版本编译器

2011-08-23 14:14:02

Oracle EBS二

2016-12-20 14:35:52

监控报警系统经验

2012-05-11 14:31:50

2021-09-03 13:54:45

双重勒索勒索软件攻击

2016-10-24 09:52:45

SparkRDD容错

2016-10-24 23:04:56

SparkRDD数据

2020-10-29 15:13:55

数字科技金融行业互联网

2015-09-11 13:34:14

云计算云趋势

2012-07-17 10:53:25

航天信息ERP

2011-08-05 12:36:01

2017-03-24 21:26:26

代码架构Java

2021-07-07 23:25:18

RedisFlinkSQL

2021-10-19 14:22:14

鸿蒙HarmonyOS应用

2024-02-23 08:13:25

Excalidraw白板工具开源

2012-06-12 16:45:57

PHP

2016-10-09 23:47:04

2021-09-15 15:50:46

hashmap算法软件开发

2021-09-15 11:38:36

Hashmap二次算法列表

2022-10-17 08:03:47

封装vue组件
点赞
收藏

51CTO技术栈公众号