开发者社区> 祝威廉> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Spark 如何写入HBase/Redis/MySQL/Kafka

简介: 这篇文章是给Spark初学者写的,老手就不要看了。文章谈及如何和HBase/Redis/MySQL/Kafka等进行交互的方法,主要是为了让大家明白其内部机制。
+关注继续查看

一些概念

一个partition 对应一个task,一个task 必定存在于一个Executor,一个Executor 对应一个JVM.
  • Partition 是一个可迭代数据集合
  • Task 本质是作用于Partition的线程

问题

Task 里如何使用Kafka Producer 将数据发送到Kafaka呢。 其他譬如HBase/Redis/MySQL 也是如此。

解决方案

直观的解决方案自然是能够在Executor(JVM)里有个Prodcuer Pool(或者共享单个Producer实例),但是我们的代码都是现在Driver端执行,然后将一些函数序列化到Executor端执行,这里就有序列化问题,正常如Pool,Connection都是无法序列化的。
一个简单的解决办法是定义个Object 类,
譬如
object SimpleHBaseClient {
  private val DEFAULT_ZOOKEEPER_QUORUM = "127.0.0.1:2181"

  private lazy val (table, conn) = createConnection

  def bulk(items:Iterator) = {
      items.foreach(conn.put(_))
      conn.flush....
  } 
 ......
}
然后保证这个类在map,foreachRDD等函数下使用,譬如:
dstream.foreachRDD{ rdd =>
    rdd.foreachPartition{iter=>
        SimpleHBaseClient.bulk(iter)  
    }
}
为什么要保证放到foreachRDD /map 等这些函数里呢?Spark的机制是先将用户的程序作为一个单机运行(运行者是Driver),Driver通过序列化机制,将对应算子规定的函数发送到Executor进行执行。这里,foreachRDD/map 等函数都是会发送到Executor执行的,Driver端并不会执行。里面引用的object 类 会作为一个stub 被序列化过去,object内部属性的的初始化其实是在Executor端完成的,所以可以避过序列化的问题。
Pool也是类似的做法。然而我们并不建议使用pool,因为Spark 本身已经是分布式的,举个例子可能有100个executor,如果每个executor再搞10个connection的pool,则会有100*10 个链接,Kafka也受不了。一个Executor 维持一个connection就好。
关于Executor挂掉丢数据的问题,其实就看你什么时候flush,这是一个性能的权衡。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
redis与mysql数据库数据双写不一致如何解决?
redis与mysql数据库数据双写不一致如何解决?
0 0
基于springboot+mysql+redis+bootstrap的精美个人技术博客网站
基于springboot+mysql+redis+bootstrap的精美个人技术博客网站
0 0
基于Redis+Zookeeper+MySQL实现高并发秒杀系统(一)
基于Redis+Zookeeper+MySQL实现高并发秒杀系统
0 0
Docker安装Mysql,Redis,ElasticSearch
Docker安装Mysql,Redis,ElasticSearch
0 0
快速使用Docker部署MySQL、Redis、Nginx
快速使用Docker部署MySQL、Redis、Nginx
0 0
面试官:谈谈Redis缓存和MySQL数据一致性问题
对于Web来说,用户量和访问量增一定程度上推动项目技术和架构的更迭和进步。可能会有以下的一些状况:
0 0
Windows10环境下制作SpringBoot项目的Docker镜像以及与宿主机上MySQL、Redis进行桥接通信
Windows10环境下制作SpringBoot项目的Docker镜像以及与宿主机上MySQL、Redis进行桥接通信
0 0
彻底搞懂Redis和Mysql如何保证数据一致性
彻底搞懂Redis和Mysql如何保证数据一致性
0 0
在家使用阿里ECS部署mysql和redis
在家使用阿里ECS部署mysql和redis
0 0
如何保障 MySQL 和 Redis 的数据一致性?
之前也看了很多相关的文章,但是感觉讲的都不好,很多文章都会去讲各种策略,比如(旁路缓存)策略、(读穿 / 写穿)策略和(写回)策略等,感觉意义真的不大,然后有的文章也只讲了部分情况,也没有告诉最优解。
0 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
让 MySQL 原生分布式触手可及
立即下载
好的 MySQL 兼容可以做到什么程度
立即下载
云数据库RDS MySQL从入门到高阶
立即下载