借hbase-rdd二次开发谈如何在Spark Core之上扩建自己的模块
时间:2025-11-05 13:18:12 出处:系统运维阅读(143)
我是借h建自己学院讲师张敏,在学院 “4.20 IT充电节”(4月19~20日) 到来之际,谈何和大家分享一下Spark Core之上扩建自己的上扩模块的经验。正文来啦~~~

hbase-rdd是模块一个构建在SparkContext基础之上的用于对Hbase进行增删改查的第三方开源模块,目前***版本为0.7.1。借h建自己目前该rdd在操作hbase时,谈何默认调用隐式方法。上扩
implicitdef stringToBytes(s: String): Array[Byte] = { Bytes.toBytes(s) }将RDD的模块key转换成字节b,然后调用Hbase的借h建自己put(b)方法保存rowkey,之后将RDD的谈何每一行存入hbase。
在轨迹图绘制项目数据计算中,上扩我们考虑到hbase的模块rowkey的设计——尽量减少rowkey存储的开销。虽然hbase-rdd最终的借h建自己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隐式方法,而是直接生成字节数据。
protected def convert(id: String, values: Map[String, Map[String, A]], put: PutAdder[A]) = { val strs = id.split(",") val imei = strs val dateTime = strs {1} val b1 = MD5Utils.computeMD5Hash(imei.getBytes()) val b2 = Bytes.toBytes(dateTime.toLong) val key = b1.++(b2) val p = new Put(key)//改造 var empty = true for { (family, content) <- values (key, value) <- content } { empty = false if (StrUtils.isNotEmpty(family) &&StrUtils.isNotEmpty(key)) { put(p, family, key, value) } } if (empty) None else Some(new ImmutableBytesWritable, p) }这样就实现了使用自己的方式构建rowkey,当然基于此思想我们可以使用任意的方式构建rowkey。
在使用hbase-rdd插件的过程中,我在思考,默认的RDD上是没有toHbase方法的香港云服务器,那为什么引入hbase-rdd包之后,RDD之上就有toHbase方法了?经过查看源码,发现hbase-rdd包中提供了两个隐式方法:
implicitdef toHBaseRDDSimple[A](rdd: RDD[(String, Map[String, A])])(implicit writer: Writes[A]): HBaseWriteRDDSimple[A] =new HBaseWriteRDDSimple(rdd, pa[A]) 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
traitHaha{ implicitdef gaga[A](rdd: RDD[String]): Hehe= newHehe(rdd) }第二步:新建Hehe类
final class Hehe(rdd:RDD[String]) { def wow(tableName:String,family:String): Unit ={ println("---------------------------------------------") println("tableName:"+tableName+" - family:"+family) println("size:"+rdd.count()) rdd.collect().foreach(data=>println(data)) println("---------------------------------------------") } }第三步:新建包对象
package object test extends Haha第四步:新建test类
object Test{ def main(args: Array[String]) { valsparkConf = new SparkConf().setAppName("Test") valsc = new SparkContext(sparkConf) sc.makeRDD(Seq("one","two","three","four")).wow("taskDataPre","T") } }项目结构图:

运行效果图:

希望对大家以后的开发有帮助,同时借鉴本案例,在Spark Core之上构建自己的小模块。
学院 4.20 IT充电节
(19-20号两天,100门视频课程免单抢,更有视频课程会员享6折,非会员享7折,套餐折上8折,免费信息发布网微职位立减2000元钜惠)
活动链接:http://edu.51cto.com/activity/lists/id-47.html?wenzhang
相关视频教程:
【大数据 Spark2.x 流数据处理】精通Spark流数据处理(持续完毕)
猜你喜欢
- 探索兰州新区长飞的发展现状与未来(新区建设进展快速,创新引领发展)
- 在本子上升级到了12.10。但是在update的时候遇到如下错误:正在读取软件包列表... 有错误!复制代码代码如下:原因是12.04和12.10的deb源list发生冲突,解决办法是删除该目录下的所有文件:复制代码代码如下:然后执行update命令来重新生成:复制代码代码如下:apt-get update
- 解决电脑启动蓝屏硬盘模式错误的有效方法(排除硬盘模式错误,让电脑安稳启动)
- 小心谨慎或灾难体验会让每一个系统管理都认识到频繁的系统备份的重要性。你可以通过编写管用的旧式 shell 脚本,或使用一个(或几个)适合这项工作的备份工具来完成备份任务。因此,当你要实施一个备份解决方案时,你了解的备份工具越多,你做出的决策就会越明智。在该文中,我们将为你介绍 backupninja ,这是一个轻量且易于配置的系统备份工具。在诸如 rdiff-backup, duplicity, mysqlhotcopy 和 mysqldump 等程序的帮助下, Backupninja 可以提供常用的备份功能,如执行远程的、安全的和增量式的文件系统备份,加密备份以及 MySQL/MariaDB 数据库备份。你可以选择性地开启使用 Email 状态报告功能,也可以对一般的硬件和系统的信息进行备份。 backupninja 的一个关键功能是它拥有一个内建的基于控制台的向导程序(被称为 ninjahelper),而后者允许你为不同的备份情景轻松地创建配置文件。假如非要说的话,backupninja 的缺点是:为了充分使用其所有的功能,它要求安装一些其他“助手”程序。尽管 backupninja 有针对基于 Red Hat(红帽)的发行版本的 RPM 安装包,但 backupninja 针对 Debian 及其衍生发行版本的依赖进行了优化。所以不建议在基于 Red Hat 的系统上尝试 backupninja 。在这篇教程中,我们将介绍如何在基于 Debian 的发行版本上安装 backupninja 。安装 Backupninja以 root 账户来运行下面的命令:复制代码代码如下: # aptitude install backupninja 在安装的过程中,有几个文件和目录将被创建: /usr/sbin/backupninja 是个 bash shell 的主脚本; /etc/cron.d/backupninja, 默认情况下,设置 cron 任务来每隔一个小时运行上面的主脚本; /etc/logrotate.d/backupninja 截断由 backupninja 程序产生的日志; /etc/backup.d/ 是备份操作的配置文件驻留的目录; /etc/backupninja.conf 是包含一般选项的主配置文件。这个文件带有良好的注释且详细解释了每个选项的含义; /usr/share/backupninja 是那些 backupninja 所使用的脚本所处的目录。这些脚本文件负责执行实际的工作。在这个目录中,你还可以找到 .helper 文件,它们可以被用来配置和设定 ninjahelper 的菜单; /usr/share/doc/backupninja/examples 含有操作配置文件(即通过 ninjahelper 产生的文件)的模板。首次运行 Ninjahelper当我们尝试启动 ninjahelper 时,我们可以看到可能需要一个内部依赖程序。假如系统进行了提示,请输入 “yes” 并敲下回车键来安装 dialog(一个用于从 shell 脚本中显示友好对话框的工具)。当你在键入 yes 后再敲回车键时,backupninja 将会安装 dialog,一旦安装完成,将呈现出下面的截屏:案例 1: 备份硬件和系统信息在启动了 ninjahelper 之后,我们将创建一个新的备份操作:假如必要的助手程序没有被安装,下面的截屏将会呈现在我们眼前。假如这些软件包已经在你的系统上安装了,请跳过这一步。接下来的一步需要你选取相关条目来作为此次备份任务的一部分。前四个条目已经默认被选上了,但你可以通过在条目上按空格键来撤消选择。一旦你完成了上面的步骤,按 OK 选项来继续。接着你将能够选择是愿意使用默认的配置文件(/etc/backup.d/10.sys)来完成这次备份操作,还是创建一个新的配置文件。若为后者,一个含有与默认配置文件内容相同的文件将会在相同的目录下被创建,但它被命名为 11.sys,后续的备份操作将会创建类似的文件(注:只不过命名的序号不同)。需要说明的是一旦这个新的配置文件被创建,你便可以使用你喜爱的文本编辑器来编辑该文件。案例 2: 一个远程目录的增量式 Rsync 拉取备份正如你最有可能知道的那样, rsync 被广泛地用于通过网络同步文件或文件夹。在接下来的例子中,我们将讨论一个使用硬链接来为一个远程目录做增量式拉取备份的方法,它被用来保存历史数据以及在我们本地的文件服务器中恢复这些历史数据。这个方法将帮助我们节省空间并增强位于服务器端的安全性。步骤 1:编写一个带有如下内容的自定义脚本,放在 /etc/backup.d,并将它的权限设置为 600 。需要说明的是,除了一般的配置文件,这个目录可能还包含当 backupninja 执行时你想运行的一些脚本文件,它们可以发挥出位于主配置文件中的变量的优势。复制代码代码如下:# REMOTE USER user=root # REMOTE HOST host=dev1 # REMOTE DIRECTORY remotedir=/home/gacanepa/ # LOCAL DIRECTORY localdir=/home/gacanepa/backup.0 # LOCAL DIRECTORY WHERE PREVIOUS BACKUP WAS STORED localdirold=/home/gacanepa/backup.1 mv $localdir $localdirold # RSYNC rsync -av --delete --recursive --link-dest=$localdirold $user@$host:$remotedir $localdir在上面的配置中, rsync 的 ‘--link-dest’ 选项的作用是为位于 $localdir-old 目录中那些没有改变的文件(包含所有属性) 硬链接到目标目录($localdir)。步骤 2:在 backupninja 第一次运行之前,上层目录(这个例子中指的是 /home/gacanepa) 是空的。第一次我们执行下面的命令:复制代码代码如下:# backupninja -nbackup.0 目录就被创建了,并在接下来的过程中,它的名称将会被更改为 backup.1。当我们第二次运行 backupninja 时, backup.0 将会被重新创建,而 backup.1 保持不动。步骤 3: 确保 backup.1 里面的文件硬链接到 backup.0 里的文件,我们可以通过比较文件的 inode(i 节点)数和目录的大小来达到此目的。总结Backupninja 不仅是一个经典的备份工具,它也是一个易于配置的实用程序。你可以通过编写你自己的控制脚本,用放在 /etc.backup.d 中的不同的配置文件来运行 backupninja 。甚至你还可以为 ninjahelper 编写助手程序,并将其包括在 ninjahelper 的主界面上。例如,假如你在 /usr/share/backupninja目录中创建了一个名为 xmodulo 的控制脚本,它将自动运行那些位于 /etc/backup.d 目录中以 .xmodulo 为后缀的每个文件。假如你决定添加你的 xmodulo 控制脚本到 ninjahelper 中, 你可以编写相应的助手程序,即 xmodulo.helper 。另外,假如你想 让 backupninja 运行其它的脚本,只需把它添加到 /etc/backup.d 目录中就可以了。
- 简单易学的U盘装机大师使用教程(轻松掌握U盘装机技巧,提升电脑维护效率)
- 还是手贱,在修改了网络配置和更新后,开机,机子木有无线网卡了,有线网卡也非常诡异,必须要restart network才能连出去。在打开系统的网络连接面板时,出现系统的网络服务与此版本的网络管理器不兼容的错误。利用万能的Google,找到了解决办法。方法比较匪夷所思,我反正木有理解,但是就这么成了。。。方法就是4步走,看下面的引用:复制代码代码如下:First open Terminal and log in as root.# su After that go the correct folder.# cd /etc/NetworkManager/system-connections/Now take a look at the content of this folder. If you had a VPN connection e.g. there must be a file with the name of that connection. # ls -laNow you can remove that file or you can move it to another folder (so you can set it back if this solution does not work for your problem). To move the file to your personal folder use the following command:# mv /home// #username是你的用户名 Now the only thing left is starting the Network Manager:# NetworkManager当~~~你的网络管理界面里出现了久违的无线网卡~LOLPS:可能会出现未配置的情况,请reboot一下
- 但是有一种情况就比较揪心,就是当分区出现问题而不能识别的时候,这时在Win下要专业的工具才能格式化,而在Ubuntu下可以借助命令模式强行格式化。 首先执行sudo fdisk -l查看你的u盘的序号,通常是/dev/sdb之类的,U盘分区通常是/dev/sdb1 对于u盘我们一般格式化为FAT格式或者FAT32格式,不过在linux下这些会都显示为FAT格式。我们只需要执行命令: sudo mkfs.vfat -F 32 /dev/sdb1即可将u盘格式化为fat32格式。 假如你要把指定磁盘格式化为NTFS格式那么你需要sudo apt-get install ntfsprogs来安装ntfs读写工具,然后执行sudo mkfs.ntfs /dev/sda1,此过程会很慢。对于要格式化为linux ext格式的分区就更容易了: sudo mkfs.ext4 /dev/sda1 # 格式化为ext4分区 sudo mkfs.ext3 /dev/sda1 # 格式化为ext3分区 sudo mkfs.ext2 /dev/sda1 #格式化为ext2分区 PS:对于要格式化的分区必须要先用umount卸载掉才能格式化哦。
- 今天为了测试自己写的一个小应用,拿出了早已沦为备用机的Defy来做调试,结果发现ubuntu无法识别,找了一下,解决方案如下:获取usb设备信息通过usb连接上我们的手机,然后打开终端,输入lsusb,出现这样的界面:找到我们的设备,比如我这台Defy就是图中所示的部分。记下22b8:428c,等下会用到。切换root权限:sudo -s创建规则文件gedit /etc/udev/rules.d/feelyou-android-devices.rules添加规则信息在gedit中,给feelyou-android-devices.rules写入内容:SUBSYSTEM==usb,SYSFS{Google Inc.}==22b8,MODE=428c这里面的22b8和428c就是之前lsusb获得的信息。应用规则文件chmod a+rx /etc/udev/rules.d/feelyou-android-devices.rules/etc/init.d/udev restart重启adb切换到Android sdk目录下面的platform-tools文件夹,执行:sudo ./adb kill-serversudo ./adb devices成功之后会看到在Eclipse中已经可以正常识别了
- 纽曼冰箱(高性能、节能环保的冷藏利器)