一、Apache Spark核心编程模块(基础编程)
集批处理(离线处理)、交互式处理和流式处理为一体的一栈式大数据解决框架
1、Core
- 最核心,Spark其他所有模块的基础
- 数据结构:弹性分布式数据集RDD
SparkContext: sc- 批处理(batch processing),处理数据 N + 1
- 注意:
每次处理的数据都是一个固定的数据集,不是变化的
- 数据结构:弹性分布式数据集RDD
2、SQL
- DataFrame/Dataset = RDD + Scheme(字段名称和字段类型)
- SparkSession:spark
- SQLContext/HiveContext
- 交互式处理(iteractive processing)
- 注意:
每次处理的数据都是一个固定的数据集,不是变化的
- SparkSession:spark
3、Streaming
- 流式数据处理框架(Streaming Processing)
- 要处理的数据就像流水一样,源源不断的产生数据,需要实时进行数据处理
- 数据结构:
- DStream = List 集合:集合中的数据类型为RDD
- 离散的、分离流
- DStream = List 集合:集合中的数据类型为RDD
- 对SparkCore的高级API的封装,将流式的数据切分为小的批次batch(按照时间间隔划分)的数据,然后使用SparkCore对每批次的数据进行处理。
- 如何读取流式数据的??
- StreamingContext:上下文对象从实时流式数据源接收数据
- SparkContext实例对象
- StreamingContext:上下文对象从实时流式数据源接收数据
- 如何读取流式数据的??
二、在大数据技术框架中,对于流式数据实时分析处理方案
-
一条一条的处理
- 来一条数据就处理一条数据
- 典型框架:Storm
- 特点:
- 实时性很高,亚秒级别延迟,延迟性很低,事务性很好
- 阿里巴巴:
- Storm -> JStorm
- 2017年双十一 ,实时销售额统计:
- Flink -> Blink
- 来一条数据就处理一条数据
-
一批次一批次数据的处理
- 按照时间间隔将数据划分,时间间隔比较短,比如1s
- 框架:SparkStreaming
- 近实时流式数据处理框架,延迟性很低,2.2.0以后,1ms以内
- 框架:SparkStreaming
- 按照时间间隔将数据划分,时间间隔比较短,比如1s
官方案例
http://spark.apache.org/docs/2.2.0/streaming-programming-guide.html#a-quick-example
- 案例说明
- 实时词频统计:对每批次的数据进行词频统计
- 数据源:
TCP Socket监控某台机器某个端口,读取数据
使用Linux系统自带nc工具
$ sudo rpm -ivh nc-1.84-22.el6.x86_64.rpm
- 数据展示:
将数据处理以后的结果打印到控制台
println - 演示:
开发第一终端:
$ nc -lk 9999
hadoop spark spark spark hadoop hive
开启第二终端:
$ bin/run-example --master local[3]
streaming.NetworkWordCount bigdata-training01.erongda.com 9999
三、SparkStreaming 处理数据的流程
- 数据源
- 从哪里接收读取数据,进行实时数据的处理分析
- Kafka(最多)/Flume(少数)/Tcp Sockect(开发测试)
DStream: 离散的流、分离的流
- Kafka(最多)/Flume(少数)/Tcp Sockect(开发测试)
- 从哪里接收读取数据,进行实时数据的处理分析
- 数据处理
- DStream#transformation
- 调用转换函数,将DStream转换为另外一个DStream
- 针对不同的业务需求使用不同的函数
- 企业中最多两种统计类型的业务:
- 实时累加统计
- 比如双十一 销售额统计,订单数目统计
DStream#updateStateByKey
DStream#mapWithState - 性能很好
- 比如双十一 销售额统计,订单数目统计
- 实时统计最近某段时间数据
- 比如:趋势统计分析
- 10:30 - 13:30 时间
每次统计二十分钟内未送达的订单 - 11:00 ->
10:40 - 11:00 此段时间内未送达订单量 - 11:05 ->
10:45 - 11:05 …
- 10:30 - 13:30 时间
- 窗口数据统计分析
DStream#window
DStream#xxWindow
- 比如:趋势统计分析
- 实时累加统计
- DStream#transformation
- 存储数据(DStream#output)
其实就是调用RDD中API将数据存储,每批次数据处理完成以后,就进行一次保存输出,微处理- Console
开始测试的时候,将实时分析的每批次结果RDD数据打印到控制台 - Redis
基于内存分布式Key/Value数据库 - HBase
存储到HBase表中,此时实时应用通常ETL工具 - RDBMS
关系型数据库中,通过JDBC/MyBatis
- Console
四、企业中对于流式典型的数据实时处理的技术框架
Flume/SDK -> Kafka -> SparkStreaming/Storm/Flink -> Redis/HBase
五、SparkStreaming中DStream Output输出函数
- def foreachRDD(foreachFunc: RDD[T] => Unit): Unit
- 一个参数,仅仅针对每批次处理结果RDD
- def foreachRDD(foreachFunc: (RDD[T], Time) => Unit): Unit
- 两个参数,每批次处理结果RDD和每批次处理的时间
六、SparkStreaming中DStream的transform转换函数(重要)
DStream(List<RDD>).transform = DStream(List<RDD>)
DStream#transform
将一个DStream应用到一个转换函数上,转换为另外一个DStream
针对DStream中每批次RDD进行操作的,转换为另外一个RDD
- 一个参数RDD:
def transform[U: ClassTag](transformFunc: RDD[T] => RDD[U]): DStream[U]
- 两个参数,每批次处理结果RDD和每批次处理的时间
def transform[U: ClassTag](transformFunc: (RDD[T], Time) => RDD[U]): DStream[U]
七、企业中构建大数据分析平台,技术架构
符合 Lambda Architecture 架构
- Batch Layer
批数据处理层 -> 离线数据分析 - Speed Layer
快速数据处理层 -> 实时数据分析 - Server Layer
提供数据展示层 -> WEB 展示离线或实时分析结果数据
针对SparkStraming运行在本地模式的时候
bin/spark-shell --master local[3]
- 当从Tcp Sockect接收数据
需要启动一个Receiver(Task方式运行)接收数据 - 为了并行计算数据
需要2个Thread运行2个Task
注意
- 从TCP Socket接收数据,Receiver按照时间间隔将数据流划分为block
blockInterval = 200ms(默认值)(可以减小值,来增加partition) - SparkStreaming处理数据批时间间隔
batchInterval = 1s = 1000ms(假设设置为1s)
八、消息系统Kafka
- 分布式消息队列(Message Queue)系统
集群:存储消息(数据)- Topic(主题/类型)
将同一个类型的数据放在一起,类似数据库中表 - 分区存储(Partition)
一个Topic中的数据分为很多分区 - 副本数(Partition)
每个分区的数据有不同的副本,存储在不同机器上 - 服务名称Broker
依赖于Zookeeper协作服务(类似HBase) - 以提交日志方式存储数据
Commit Log
- Topic(主题/类型)
- 发布订阅功能
类比:微信公众号
1、Kafka 下载
http://kafka.apache.org/downloads
http://archive.apache.org/dist/kafka/
针对Scala 2.11编译包,Kafka 0.8.2.1
http://archive.apache.org/dist/kafka/0.8.2.1/kafka_2.11-0.8.2.1.tgz
- 快速安装部署:
http://kafka.apache.org/documentation/
http://kafka.apache.org/082/documentation.html
http://kafka.apache.org/082/documentation.html#quickstart
2、安装Kafka伪分布式集群环境
类似Zookeeper框架分布式安装部署
- 单机部署:standalone
在一台机器上启动一个JVM进程服务 - 伪分布式模式
在一台机器上,启动多个JVM进程服务
配置
拷贝{KAFKA_HOME}/config/server.properties 文件三份,修改如下:
- 配置唯一标识符
20行
broker.id=9092 - 配置Broker端口号
25行
port=9092 - 配置Broker运行的主机名称
28行
host.name=bigdata-training01.erongda.com - 配置日志文件存储目录
58行
log.dirs=/opt/cdh-5.7.6/kafka_2.11-0.8.2.1/kafkaLogs/logs9092 - 配置ZK地址及存储ZNODE根目录
zookeeper.connect=bigdata-training01.erongda.com:2181/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
- Create a topic
- Topic的分区副本数 大于等于 Brokers的数量
bin/kafka-topics.sh --create --zookeeper bigdata-training01.erongda.com:2181/kafka --replication-factor 2 --partitions 3 --topic testTopic
- Topic的分区副本数 大于等于 Brokers的数量
- List topic
bin/kafka-topics.sh --list --zookeeper bigdata-training01.erongda.com:2181/kafka
- Send some messages
bin/kafka-console-producer.sh --broker-list
bigdata-training01.erongda.com:9092,bigdata-training01.erongda.com:9093,bigdata-training01.erongda.com:9094 --topic testTopic
- Start a consumer
bin/kafka-console-consumer.sh --zookeeper bigdata-training01.erongda.com:2181/kafka --topic testTopic --from-beginning