spark-08-SparkStraming简介与kafka0.8集群安装
kafka0.8.2的安装
####################################################
实时计算相关技术
Strom / JStrom Spark Streming Flink
实时性高 有延迟 实时性高
吞吐量较低 吞吐量高 吞吐量高
只能实时计算 离线+实时 离线+实时
算子比较少 算子丰富 算子丰富
没有 机器学习 没有
没有 图计算 没有
使用比较少 非常火 一般
一个完整的生态是非常重要的,spark生态特别完善
http://chant00.com/2017/07/28/Spark%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
---------------------------------------------------------
Kafka的一些概念
Broker : 安装Kafka服务的那台集群就是一个broker(broker的id要全局唯一)
Producer :消息的生产者,负责将数据写入到broker中(push)
Consumer:消息的消费者,负责从kafka中读取数据(pull),老版本的消费者需要依赖zk,新版本的不需要
Topic: 主题,相当于是数据的一个分类,不同topic存放不同的数据
Consumer Group: 消费者组,一个topic可以有多个消费者同时消费,多个消费者如果在一个消费者组中,那么他们不能重复消费数据
Spark Streaming 2.2.0兼容kafka 0.8.2.1以上的版本,主要支持0.8和0.10这两个版本
---------------------------------------------------------
kafka集群安装
1.下载Kafka安装包
2.上传安装包
3.解压
4.修改配置文件 config/server.properties
broker.id=0
host.name=node-4
log.dirs=/data/kafka
zookeeper.connect=node-1:2181,node-2:2181,node-3:2181
5.将配置好的kafka拷贝到其他机器上
6.修改broker.id和host.name
7.启动kafka
/bigdata/kafka_2.11-0.8.2.2/bin/kafka-server-start.sh -daemon /bigdata/kafka_2.11-0.8.2.2/config/server.properties
#查看topic信息
/bigdata/kafka_2.11-0.8.2.2/bin/kafka-topics.sh --list --zookeeper node-1:2181,node-2:2181
#创建topic
/bigdata/kafka_2.11-0.8.2.2/bin/kafka-topics.sh --create --zookeeper node-1:2181,node-2:2181 --replication-factor 3 --partitions 3 --topic xiaoniu
#往Kafka的topic中写入数据(命令行的生成者)
/bigdata/kafka_2.11-0.8.2.2/bin/kafka-console-producer.sh --broker-list node-4:9092,node-5:9092,node-5:9092 --topic xiaoniu
#启动消费者
/bigdata/kafka_2.11-0.8.2.2/bin/kafka-console-consumer.sh --zookeeper node-1:2181,node-2:2181 --topic xiaoniu --from-beginning
kafka0.10安装及命令
##############################################################
kafka集群部署
broker.id=1
delete.topic.enable=true
log.dirs=/bigdata/kafka_2.11-0.10.2.1/data
zookeeper.connect=node-1:2181,node-2:2181,node-3:2181
启动kafka
/bigdata/kafka_2.11-0.10.2.1/bin/kafka-server-start.sh -daemon /bigdata/kafka_2.11-0.10.2.1/config/server.properties
停止kafka
/bigdata/kafka_2.11-0.10.2.1/bin/kafka-server-stop.sh
创建topic
/bigdata/kafka_2.11-0.10.2.1/bin/kafka-topics.sh --create --zookeeper node-1:2181,node-2:2181,node-3:2181 --replication-factor 3 --partitions 3 --topic my-topic
列出所有topic
/bigdata/kafka_2.11-0.10.2.1/bin/kafka-topics.sh --list --zookeeper node-1:2181,node-2:2181,node-3:2181
查看某个topic信息
/bigdata/kafka_2.11-0.10.2.1/bin/kafka-topics.sh --describe --zookeeper node-1:2181,node-2:2181,node-3:2181 --topic my-topic
启动一个命令行的生产者
/bigdata/kafka_2.11-0.10.2.1/bin/kafka-console-producer.sh --broker-list node-1:9092,node-1.xiaoniu.xom:9092,node-3:9092 --topic xiaoniu
启动一个命令行的消费者
/bigdata/kafka_2.11-0.10.2.1/bin/kafka-console-consumer.sh --zookeeper node-1:2181,node-2:2181,node-3:2181 --topic my-topic --from-beginning
# 消费者连接到borker的地址
/bigdata/kafka_2.11-0.10.2.1/bin/kafka-console-consumer.sh --bootstrap-server node-1:9092,node-2:9092,node-3:9092 --topic xiaoniu --from-beginning
Kafka Connect:
https://kafka.apache.org/documentation/#connect
http://docs.confluent.io/2.0.0/connect/connect-jdbc/docs/index.html
Kafka Stream:
https://kafka.apache.org/documentation/streams
https://spark.apache.org/docs/1.6.1/streaming-kafka-integration.html
kafka monitor:
https://kafka.apache.org/documentation/#monitoring
https://github.com/quantifind/KafkaOffsetMonitor
https://github.com/yahoo/kafka-manager
kafka生态圈:
https://cwiki.apache.org/confluence/display/KAFKA/Ecosystem
记录
######################################################
SparkSQL是Spark上的高级模块,SparkSQL是一个SQL解析引擎,将SQL解析成特殊的RDD(DataFrame),然后在Spark集群中运行
SparkSQL是用来处理结构化数据的(先将非结构化的数据转换成结构化数据)
SparkSQL支持两种编程API
1.SQL方式
2.DataFrame的方式(DSL)
SparkSQL兼容hive(元数据库、SQL语法、UDF、序列化、反序列化机制)
SparkSQL支持统一的数据源,课程读取多种类型的数据
SparkSQL提供了标准的连接(JDBC、ODBC),以后可以对接一下BI工具
------------------------------------------------------------
RDD和DataFrame的区别
DataFrame里面存放的结构化数据的描述信息,DataFrame要有表头(表的描述信息),描述了有多少列,每一列数叫什么名字、什么类型、能不能为空?
DataFrame是特殊的RDD(RDD+Schema信息就变成了DataFrame)
------------------------------------------------------------
SparkSQL的第一个入门程序
首先在pom中添加sparkSQL的依赖
<!-- 导入spark sql的依赖 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
SparkSQL 1.x和2.x的编程API有一些变化,企业中都有使用,所以两种方式都将
先用1.x的方式:
SQL方式
创建一个SQLContext
1.创建sparkContext,然后再创建SQLContext
2.先创建RDD,对数据进行整理,然后关联case class,将非结构化数据转换成结构化数据
3.显示的调用toDF方法将RDD转换成DataFrame
4.注册临时表
5.执行SQL(Transformation,lazy)
6.执行Action
----
1.创建sparkContext,然后再创建SQLContext
2.先创建RDD,对数据进行整理,然后关联Row,将非结构化数据转换成结构化数据
3.定义schema
4.调用sqlContext的createDataFrame方法
5.注册临时表
6.执行SQL(Transformation,lazy)
7.执行Action
DSL(DatFrame API)
先用2.x的方式:
创建一个SparkSession
val spark = SparkSession.builder()
.appName("DataSetWordCount")
.master("local[*]")
.getOrCreate()
----------------------------------------------------
UDF (user defined function)
UDF 输入一行,返回一个结果 一对一 ip2Province(123123111) -> 辽宁省
UDTF 输入一行,返回多行(hive)一对多 spark SQL中没有UDTF,spark中用flatMap即可实现该功能
UDAF 输入多行,返回一行 aggregate(聚合) count、sum这些是sparkSQL自带的聚合函数,但是复杂的业务,要自己定义
----------------------------------------------------
Dateset是spark1.6以后推出的新的API,也是一个分布式数据集,于RDD相比,保存了跟多的描述信息,概念上等同于关系型数据库中的二维表,基于保存了跟多的描述信息,spark在运行时可以被优化。
Dateset里面对应的的数据是强类型的,并且可以使用功能更加丰富的lambda表达式,弥补了函数式编程的一些缺点,使用起来更方便
在scala中,DataFrame其实就是Dateset[Row]
Dataset的特点:
1.一系列分区
2.每个切片上会有对应的函数
3.依赖关系
4.kv类型shuffle也会有分区器
5.如果读取hdfs中的数据会感知最优位置
6.会优化执行计划
7.支持更加智能的数据源
调用Dataset的方法先会生成逻辑计划,然后被spark的优化器进行优化,最终生成物理计划,然后提交到集群中运行!
----------------------------------------------------
Hive On Spark (跟hive没太的关系,就是使用了hive的标准(HQL, 元数据库、UDF、序列化、反序列化机制))
在公司中使用hive还是非常多的
Hive原来的计算模型是MR,有点慢(将中间结果写入到HDFS中)
Hive On Spark 使用RDD(DataFrame),然后运行在spark 集群上
真正要计算的数据是保存在HDFS中,mysql这个元数据库,保存的是hive表的描述信息,描述了有哪些database、table、以及表有多少列,每一列是什么类型,还要描述表的数据保存在hdfs的什么位置?
hive跟mysql的区别?
hive是一个数据仓库(存储数据并分析数据,分析数据仓库中的数据量很大,一般要分析很长的时间)
mysql是一个关系型数据库(关系型数据的增删改查(低延迟))
hive的元数据库中保存怎知要计算的数据吗?
不保存,保存hive仓库的表、字段、等描述信息
真正要计算的数据保存在哪里了?
保存在HDFS中了
hive的元数据库的功能
建立了一种映射关系,执行HQL时,先到MySQL元数据库中查找描述信息,然后根据描述信息生成任务,然后将任务下发到spark集群中执行
#spark sql 整合hive,将hive的sql写在一个文件中执行(用-f这个参数)
/bigdata/spark-2.2.0-bin-hadoop2.7/bin/spark-sql --master spark://node-4:7077,node-5:7077 --driver-class-path /home/xiaoniu/mysql-connector-java-5.1.7-bin.jar -f hive-sqls.sql
在idea中开发,整合hive
<!-- spark如果想整合Hive,必须加入hive的支持 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>2.2.0</version>
</dependency>
//如果想让hive运行在spark上,一定要开启spark对hive的支持
val spark = SparkSession.builder()
.appName("HiveOnSpark")
.master("local[*]")
.enableHiveSupport()//启用spark对hive的支持(可以兼容hive的语法了)
.getOrCreate()