Spark------------------------spark核心SparkStreaming与 kafka、redis的结合

1.Apache spark核心编程

集批处理(离线处理)、交互式处理和流式处理,为一体一栈式大数据解决方案

  • Core
    数据式结构:分布式集合RDD
    SparkContext
    批处理(batch processing),处理数据 T + 1
    注意:
    每次数据的数据都是一个固定的数据集,而不是变化

  • SQL
    DataFrame/DataSet = RDD + schema
    SparkSession
    老版本:SQLContext/HiveContext
    交互式处理(interactive processing)
    注意:
    每次数据的数据都是一个固定的数据集,而不是变化

  • MLlib
    一些算法使用Spark给你实现了,提供了对应API给你用

  • Streaming

    流式数据处理(stream processing)
    要处理的数据就像流水一样,源源不断的产生数据,需要实时进行处理
    对SparkCore的高级API的封装,将流式的数据切分为小的批次batch(按照时间间隔)的数据,然后使用SparkCore进行处理
    DStream集合,List
    StreamingContext:上下文对象,从实时流式数据源中接收数据
    底层还是SparkContext

    在大数据技术框架中,对于流式数据的实时数据分析处理方案:
    一条一条的处理
    来一条数据就处理一条数据
    典型框架:Storm
    特点:
    实时性很高,亚秒级别,延迟性很低
    阿里巴巴
    将Storm改成成适合Java开发JStorm,将JStorm开源,
    2017开始放弃JStorm,改用Blink
    Storm ->JStorm
    2017:
    Flink ->Blink

    一批次一批次数据的处理
    按照时间间隔将数据划分,时间比较短,比如1s
    框架:sparkStreaming
    近实时流式数据处理框架,延迟性也很低,2.2.0以后开始,1ms以内

2.NC工具安装

  • 介绍
    Spark------------------------spark核心SparkStreaming与 kafka、redis的结合_第1张图片

  • 安装
    Spark------------------------spark核心SparkStreaming与 kafka、redis的结合_第2张图片

  • 测试
    监听:nc -v bigdata-hpsk01.huadian.com 9999(后启动)
    发送:nc -lk 9999 (先启动此窗口)

3.文档详细介绍

http://spark.apache.org/docs/2.2.0/streaming-programming-guide.html#a-quick-example

4.实时词频统计

每次统计每一批次数据中单词出现的频率

  • 数据源
    tcp socket:监控某台机器某个端口,读取数据
    使用Linux系统自动NC工具
  • 数据展示
    将数据处理之后的结果直接打印到控制台
    println
  • 演示
    开启第一个终端
    nc -lk 9999
    开启第二个终端
    使用Spark框架给我们提供的wordcount案例,也是一个spark程序
    bin/run-example streaming.NetworkWordCount bigdata-hpsk01.huadian.com 9999

5.sparkStreaming处理数据流程

  • (1)数据源
    从哪里读取数据,进程数据的处理
    Kafka(多数)
    Flume(少数):Flume可以实时采集数据,然后给Spark
    TCP socket(开发测试)

  • (2)数据处理
    DStream#transfotmation
    调用转换函数,将一个DStream转成另外一个DStream
    针对不同的业务使用不同函数
    企业使用最多2种统计类型函数
    -实时累加统计
    比如 双十一,销售订单额,订单数统计
    DStream.updateStateByKey
    -实时统计某时段内数据
    比如:趋势分析,滴滴打车,最近10分钟路况,未来30分钟路况
    11:20~11:50 半小时内,订单未送达的量
    DStream#window

  • (3)存储数据
    就是就是调用RDD中API将数据存储,批次处理(core)
    console
    开发测试的时候,将实时分析的数据每次批次结果RDD数据打印在控制台
    redis
    基于内存的分布式Key/value数据库
    HBase
    存储到HBase表中
    RDBMS
    关系型数据

  • 需要了解的几个类

    • StreamingContext
      如何读取数据
    • DStream
      处理数据函数
      DStream里面存储着很多RDD
    • PairDStreamFunctions
      当处理的数据类型是二元组的时候,
      DStream自动隐式转换为PairDStreamFunctions
    • RDD
      输出函数,将结果保存到外部系统
      def foreachFunc: (RDD[T], Time) => Unit = {
      (rdd: RDD[T], time: Time) => {
      ….
      }}
  • 企业中典型技术架构
    flume/SDK ->Kafka ->SparkStreaming/Storm/Flink ->redis/HBase
    Spark------------------------spark核心SparkStreaming与 kafka、redis的结合_第3张图片

6.spark运行工作原理

  • batchInterval:批处理时间间隔
    ·通过创建StreamingContext实例对象的时候进行设置
    表明每次处理数据时间间隔,RDD
  • blockInterval:每个Block时间间隔
    启动Streaming应用的时候,将启动Receiver用于接收数据
    按照blockInterval将数据划分为Block,
    默认blockInterval为200ms

计算:如果一个batchInterval是1S,blockInterval为200ms,有几个block块
batchInterva/blockInterval = 5

  • 优化
    • 对于SparkStreaming实时流式数据
      每个批次处理的时间 小于等于 batchInterval时间
      如果大于,需要考虑优化程序
      每批次的数据RDD在执行,可以增加RDD分区数,增加Task数目,在资源充足的情况下,增加并行执行Task数目
    • 优化点
      减少blockInterval的值,比如设置为100ms
      spark.streaming.blockInterval

7.Kafka

  • 介绍
    分布式消息队列(message Queue)系统
    topic:主题、类别

    分布定义的功能
    比喻:微信公众号
    发布者 -》推送文章
    关注公众号
    订阅1
    订阅2
    官网
    http://kafka.apache.org/

  • 安装

伪分布式的方式安装kafka
启动3台kafka Brokers
安装过程
上传解压
配置
conf/server.properties
配置唯一标识符
第20行
broker.id=9092
配置Broker端口
第25行
port=9092
配置Broker运行主机名称
第28行
host.name=bigdata-hpsk01.huadian.com
配置日志文件存储目录
第58行
log.dirs=/opt/modules/kafka_2.11-0.8.2.1/kafkaDatas/data9092
配置ZK地址以及存储ZNode根目录 第118行
zookeeper.connect:2181=bigdata-hpsk01.huadian.com/kafka
复制server.properties,分别为server9092.properties
server9093.properties,
server9094.properties
记得修改对应broker ID,port,日志目录
.
启动服务
需要先启动Zookeeper
启动kafka进程
bin/kafka-server-start.sh -daemon
config/server9092.properties bin/kafka-server-start.sh -daemon
config/server9093.properties bin/kafka-server-start.sh -daemon
config/server9094.properties
.
创建topic
bin/kafka-topics.sh --create
–zookeeper bigdata-hpsk01.huadian.com/kafka --replication-factor 2 --partitions 3 --topic testTopic

–replication-factor:副本数 ,需要 .
查看Kafka Cluster中有多少topic
bin/kafka-topics.sh --list --zookeeper
bigdata-hpsk01.huadian.com/kafka
.
模拟生产者发送数据到Topic中
bin/kafka-console-producer.sh --broker-list
bigdata-hpsk01.huadian.com:9092,bigdata-hpsk01.huadian.com:9093,bigdata-hpsk01.huadian.com:9094–topic testTopic
.
模拟消费者消费Topic中数据 bin/kafka-console-consumer.sh --zookeeper bigdata-hpsk01.huadian.com/kafka --topic testTopic --from-beginning

8.SparkStreaming集成Kafka

sparkStreaming从Kafka读取数据的2种方式
文档:
http://spark.apache.org/docs/2.2.0/streaming-kafka-0-8-integration.html

  • 方式一:Receiver-based Approach
    old approach using Receivers and Kafka’s high-level API
    基于Receiver接收数据
    this approach can lose data under failures
  • 方式二:Direct Approach (No Receivers)
    性能:
    直接去拉取数据的方式
    当且仅当每批次数据处理完成,再去抓取下一批数据,
    可以设置每批次抓取最大条目数
    spark.streaming.kafka.maxRatePerPartition
    如果从一个topic中获取数据,一个topic中有3个分区
    spark.streaming.kafka.maxRatePerPartition = 5000
    一次性拉取到15000

sparkStreaming采用Direct方式从Kafka topic中pull数据,每批次Batch处理数据RDD,
RDD的分区数目 = 所有kafka topic总的分区数目之和

  • 使用Direct的好处

1.simplified paralliser:简单并行化
2.efficiency:高效
3.Exactly-once Semantics:语义一致

8.检查点

  • 检查点功能
    * 保存 每批中 state信息,累加加销售营业额
    * 保存 每次从Kafka topic 中读取数据的offset
    * 保存DStream的来源和DStream处理函数和输出函数

9.Redis

  • redis中数据类型
    key/value类型数据库,所有的Key类型都是字符串,我们说的数据类型指的是Value的数据类型。

字符串 “”
列表List
哈希Hash
和Java中HashMap或者Python中字段Dic 使用语法
hset key 字段 值 写
hset orders:total 12 10000
读:hget orders:total 12
删:del orders:total 集合Set

jedis:基于Java语言访问Redis数据库

  • jedis的基本使用
    Spark------------------------spark核心SparkStreaming与 kafka、redis的结合_第4张图片

9.实时窗口统计分析

实时就是统计分析
比如:饿了么中午和晚上,区域订单数目统计
需求:
最近半小时的各个区域订单状态
11:00
10:30~11:00 半小时时间内,订单状态,还有多少订单没有配送,多的话调人
11:10
10:40~11:00 半小时时间内,订单状态
DStream
窗口统计分析
指定窗口的大小,也就是时间窗口 时间间隔

你可能感兴趣的:(大数据)