Apache Spark 是加州大学伯克利分校的 AMPLabs 开发的开源分布式轻量级通用计算框架。

由于 Spark 基于内存设计,使得它拥有比 Hadoop 更高的性能(极端情况下可以达到 100x),并且对多语言(Scala、Java、Python)提供支持。

其一栈式设计特点使得我们的学习和维护成本大大地减少,而且其提供了很好的容错解决方案

业务场景

我们每天都有来自全国各地的天然气购气数据,并根据用户的充气,退气,核销等实时计算分析的是用户订单数数据,由于数据量比较大,单台机器处理已经达到了瓶颈;综合业务场景分析,我们选用 Spark Streaming + Kafka+Flume+Hbase+kudu 来处理这些日志;又因为业务系统不统一,先通过Spark Streaming对数据进行清洗后再回写kafka集群,因为会有其他业务也需要kafka的数据;通过通过不同的程序对kafka数据进行消费,用户记录以多版本方式记录到hbase;需要经常统计的指标业务数据写入kudu

业务代码:

  创建DStream

val sparkConf = new SparkConf().setAppName("OrderSpark")

val sc = new SparkContext(sparkConf)

val ssc = new StreamingContext(sc, Seconds(10))

val kafkaParams = Map[String, String]("metadata.broker.list" -> brokerAddress,"group.id" -> groupId)

val messages = KafkaUtils.createDirectStream[String, String, StringDecoder,StringDecoder](ssc, kafkaParams, Set(topic))

返回的messages 是一个 DStream,它是对 RDD 的封装,其上的很多操作都类似于 RDD;

createDirectStream 函数是 Spark 1.3.0 开始引入的,其内部实现是调用 Kafka 的低层次 API,Spark 本身维护 Kafka 偏移量等信息,所以可以保证数据零丢失

但是机器一旦宕机或者重启时,可能会存在重复消费;因此我们可以通过自己对offset进行checkpoint

  获取kafkaoffset

   val kafkaStream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics)
    var offsetRanges = Array[OffsetRange]()
    kafkaStream.transform{ rdd =>
      offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
      rdd
    }.foreachRDD(rdd=>{
      for(o <- offsetRanges) {
        println(s"@@@@@@ topic  ${o.topic}  partition ${o.partition}  fromoffset ${o.fromOffset}  untiloffset ${o.untilOffset} #######")
      }    }

为了能够在 Spark Streaming 程序挂掉后又能从断点处恢复,我们每个批次进行向zookeeper进行 Checkpoint;

这里我们没有采用spark自带的checkpoint,是因为一旦程序修改,之前序列化的checkpoint数据会冲突报错,

当然checkpoint到文件也会随之越大。(读者可以自己搜索spark 文件checkpoint的弊端)

  启动实时程序

    ssc.start()
    ssc.awaitTermination()

  因业务所需需要向kafka回写数据

  

rdd.foreachPartition(partition=>{
        val props = new Properties()
        props.put("bootstrap.servers",Constans.brokers)
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
        val producer = new KafkaProducer[String,String](props)
        partition.foreach(r=>{
          val record = new ProducerRecord[String, String](Constans.topic_kc, new Random().nextInt(3), "", msg)
      producer.send(record,new Callback() {        override def onCompletion(recordMetadata: RecordMetadata, e: Exception): Unit = {          if (null != e) {            println("发送消息失败=>"+msg)          }        }      })
  }) producer.close() })

监控

系统部署上线之后,我们无法保证系统 7x24 小时都正常运行,即使是在运行着,我们也无法保证 Job 不堆积、是否及时处理 Kafka 中的数据;而且 Spark Streaming 系统本身就不很稳定。所以我们需要实时地监控系统,包括监控Kafka 集群、Spark Streaming 程序。我们所有的监控都是CDH自带监控管理和Ganglia以及nagios,一旦检测到异常,系统会自己先重试是否可以自己恢复,如果不行,就会给我们发送报警邮件和打电话。

 

通过Spark Streaming处理交易数据的更多相关文章

  1. Spark Streaming揭秘 Day16 数据清理机制

    Spark Streaming揭秘 Day16 数据清理机制 今天主要来讲下Spark的数据清理机制,我们都知道,Spark是运行在jvm上的,虽然jvm本身就有对象的自动回收工作,但是,如果自己不进 ...

  2. Spark Streaming接收Kafka数据存储到Hbase

    Spark Streaming接收Kafka数据存储到Hbase fly spark hbase kafka 主要参考了这篇文章https://yq.aliyun.com/articles/60712 ...

  3. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十二)Spark Streaming接收流数据及使用窗口函数

    官网文档:<http://spark.apache.org/docs/latest/streaming-programming-guide.html#a-quick-example> Sp ...

  4. 160728、Spark Streaming kafka 实现数据零丢失的几种方式

    定义 问题开始之前先解释下流处理中的一些概念: At most once - 每条数据最多被处理一次(0次或1次) At least once - 每条数据最少被处理一次 (1次或更多) Exactl ...

  5. demo1 spark streaming 接收 kafka 数据java代码WordCount示例

    1. 首先启动zookeeper windows上的安装见zk 02之 Windows安装和使用zookeeper 启动后见: 2. 启动kafka windows的安装kafka见Windows上搭 ...

  6. spark streaming读取kakfka数据手动维护offset

    在spark streaming读取kafka的数据中,spark streaming提供了两个接口读取kafka中的数据,分别是KafkaUtils.createDstream,KafkaUtils ...

  7. 使用 Kafka + Spark Streaming + Cassandra 构建数据实时处理引擎

    Apache Kafka 是一个可扩展,高性能,低延迟的平台,允许我们像消息系统一样读取和写入数据.我们可以很容易地在 Java 中使用 Kafka. Spark Streaming 是 Apache ...

  8. Spark Streaming处理Flume数据练习

    把Flume Source(netcat类型),从终端上不断给Flume Source发送消息,Flume把消息汇集到Sink(avro类型),由Sink把消息推送给Spark Streaming并处 ...

  9. Spark Streaming实时写入数据到HBase

    一.概述 在实时应用之中,难免会遇到往NoSql数据如HBase中写入数据的情景.题主在工作中遇到如下情景,需要实时查询某个设备ID对应的账号ID数量.踩过的坑也挺多,举其中之一,如一开始选择使用NE ...

随机推荐

  1. 移动端 使用 vConsole调试

    前言 用vue 写移动端代码,有个报名页面 就在iOS 9下出现问题,vue的循环渲染都正常,一开始的数据也能取到.证明不是vue的兼容性问题 但是在用户点击按钮发现不能点击进入跳转 工具 推荐使用  ...

  2. JMeter 功能挖掘之 WEB 文件导出

    前言 自从写从0构建自动化测试平台(一)之技术选型开始,在工作中Get新技能就非常想郑重的记录下来,方便自己查阅:相信很多人都有这种感触:平时问题解决后,没有及时记录,下次遇到类似问题,需要花同等的成 ...

  3. anaconda历史版本下载

    anaconda历史版本安装: anaconda所有版本链接:https://repo.continuum.io/archive/ 清华大学开源软件镜像站:https://mirrors.tuna.t ...

  4. ps -aux显示信息COMMAND不全

    ps -aux结果: ps -auxwww结果:

  5. JPA学习(五、JPA_二级缓存)

    框架学习之JPA(五) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...

  6. LOJ #539. 「LibreOJ NOIP Round #1」旅游路线 倍增floyd + 思维

    考试的时候是这么想的: 求出每一个点花掉 $i$ 的花费向其他点尽可能走的最长距离,然后二分这个花费,找到第一个大于 $d$ 的就输出$.$然而,我这个记忆化搜索 $TLE$ 的很惨$.$这里讲一下正 ...

  7. UVa 572 Oil Deposits (Floodfill && DFS)

    题意 :输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块.如果两个字符“@”所在的格子相邻(横竖以及对角方向),就是说它们属于同一个八连块. 分析 :可以考虑种子填充深搜的方法.两重for循 ...

  8. JMS学习十(ActiveMQ支持的传输协议)

    ActiveMQ提供了一种连接机制,这种连接机制使用传输连接器(TransportConnector)实现客户端与代理(client - to - broker)之间的通信. 网络连接器(networ ...

  9. [design pattern](4) SImple Factory

    前言 本博客主要介绍简单工厂模式(Simple Factory),简单工厂模式是创建型模式的一员,也是我们平时coding用到的比较多的一个模式了. 思考题 首先,让我们思考以下的需求: 博主,突然很 ...

  10. 【Python】学习笔记十四:循环进阶

    range() 在Python中,for循环后的in跟随一个序列的话,循环每次使用的序列元素,而不是序列的下标. 我们继续开发range的功能,以实现下标对循环的控制: s = 'abcdefghj' ...