storm学习笔记

Storm学习笔记

Storm架构和编程模型总结

39253A13-DCD6-4e82-A16E-9D91041DDBDA.png

51434407-0DBC-4456-8D7B-FE81078B7726.png
F26D7059-172A-4907-B599-86EC0F8066A1.png

917A9D61-6158-426e-AACB-634F468895C0.png

DFF4D4E2-77B4-4b8c-8487-1A3A578AA0B4.png

stomr内部通讯机制

3629E400-2E1D-4860-AA66-D8A994A0B12D.png
BBF07517-A841-4bd0-A870-66CC16879AEB.png

Disruptor

一种可替代有界队列完成并发线程间数据交换的高性能解决方案。
底层通过环形缓冲区,和序号管理器实现。 没有锁的竞争,因此并发高, 每秒可达600万的生产和消费。

Netty权威指南

spark 学习笔记

76DB8A02-A773-4b13-A711-5897E22C9738.png

自定义partioner

1.继承spark的partitioner ,重写两个方法,应用 key-value 形式的数据
2.默认使用hashPartitioner, 但会存在hash碰撞问题

自定义排序sort

1.继承ordered类, 重写compare方法

广播变量

我们可以把数据缓存到任务所在的excute里面,例如:把ip的规则缓存起来
var arr = rdd.collect ,先执行action 获取数据到driver。再执行broadcast广播到excute。
var bd = sc.broadcast(arr)

3CAF2C8C-A63D-4b75-A77A-16832B1A2E5B.png

RDD缓存机制

RDD有时候在计算时非常快, 是因为我们可以把一些数据缓存在内存当中。
以后在创建新的RDD时,可以使用之前缓存的数据。
使用rdd.cache() 方法缓存,rdd.unpersist(true)取消缓存。 是个transformation , 在执行action时才会缓存下来。

checkPoint

将rdd的产生的数据,存下来到HDFS, 当内存或磁盘出现故障时,仍旧可以获取之前rdd的结果。防止中间结果丢失。
恢复的时候会根据依赖关系进行恢复。

spark任务提交流程

1. RDD在经过 transformation和action 之后 生成一个DAG(有向无环图)
2. DAGScheduler 将 DAG切分成一个个的stage,然后以 taskSet的方式 提交给 taskScheduler
3. taskScheduler中 Master(Cluster manager)决定在哪些机器上起Excutor,而 driver将任务提交到 worker ,并有失败重试机制
4. worker执行Excutor

启动Drive时 指定使用的资源,内存/CPU,一启动就会调自己写的 main方法,main方法里会创建sparkContext ,sparkContext创建完后就和Master建立起链接了。然后master会根据任务所需的资源,到集群找符合条件的work,然后master跟work建立RPC通信,告诉work启动Excutor,之后Excutor就和Driver建立起通信,driver给Excutor提交task。

宽依赖(narrow)和窄依赖(wide dependencies)

narrow dependencies:  一对一, 多对一 即 一个父RDD只给一个子RDD
	map , filter 针对一个分区的
	union
	join 在大多数情况下都是宽依赖,只有 join with inputs co-partitioned 是窄依赖(提前groupBy之后的 join是窄依赖)

注意:两个RDD 才能join, 并且Key Value 的数据才能Join 

wide dependencies :  一个父RDD 给多个子RDD
	groupByKey
	 join with inputs not co-partitioned 

两者重要区别是:有没有发生 shuffer(英文:洗牌)
划分stage重要的依据是 宽依赖,但最终的stage 可能需要前面多个的结果,所以是个整体的stage

SparkSql

1.dataframe : 分布式数据容器,更像传统数据库的二维表格,除了记录数据以外,还记录了数据的结构信息。

var df = personRDD.toDF
df.show()
df.select("id","name").show()  ------> select 相当于transformation , show相当于action
df.filter(col("age") >=18 ).show()
...

2.如果想使用sql风格的语法,需要将DataFrame 注册成表

personDF.registerTempTable("t_person")
sqlContext.sql("select * from t_person order by age desc limit 2").show
sqlContext.sql("desc t_person ").show   // 查询表信息
object SQLDemo{
	def main(args:Array[String]){
		var conf = new SparkConf().setAppName("SQLDemo").setMaster("local")
		var sc = new SparkContext(conf)
		var sqlContext = new SQLContext(sc)
		System.setProperty("user.name","bigdata")
		var personRdd = sc.textFile("hdfs://node-1.itcast.cn:9000/person.txt").map(line =>{
			val fields = line.split(",")
			Person(fields(0).toLong,fields(1),fields(2).toInt)
		})
		//导入隐式转换,如果不导入无法将rdd转换成dataframe
		import sqlContext.implicits_
		var personDF = personRdd.toDF
		//注册表
		personDF.registerTempTable("t_person")
		//传入sql
		var df = sqlContext.sql("select * from t_person order by age desc limit 2")
		//将结果以JSON的方式 存储到指定位置
		// df.save()
		df.write.json(args(1))
		//停止Spark Context
		sc.stop()

	}
}

case class Person(id:Long,name:String,age:Int)
  1. 通过structType直接指定每个字段的 schema
	var conf = new SparkConf().setAppName("SQLDemo").setMaster("local")
	var sc = new SparkContext(conf)
	var sqlContext = new SQLContext(sc)
	var personRDD = sc.textFile(args(0)).map(.split(" "))
	var schema = StructType(
		List(
			StructField("id",IntegerType,true)
			StructField("name",StringType,true)
			StructField("age",IntegerType,true)
		)
	)
	//将RDD映射到rowRDD
	val rowRDD = personRDD.map(p => Row(p(0).toInt,p(1).trim,p(2).toInt))
	//将schema信息应用到rowRDD上
	val personDataFrame = sqlContext.createDataFrame(rowRDD,schema)
	//注册表
	personDataFrame.registerTempTable("t_person")
	//执行sql
	var df = sqlContext.sql("select * from t_person order by age desc limit 2")
	//将结果以JSON的方式 存储到指定位置
	// df.save()
	df.write.json("hdfs://node-1.itcast.cn:9000/json")
	//停止Spark Context
	sc.stop()

4.load数据

val df = sqlContext.load("hdfs://node-1.itcast.cn:9000/json","json")

5.hive on spark

hive的 执行引擎换成 spark rdd ; MR --> spark
spark 要知道hive的元数据在哪里,hive-site.xml  core-site.xml  hdfs-site.xml  放到spark-home/conf 目录下
启动命令:spark-sql   --master  --driver-class-path  mysql驱动

6.远程debug

spark-env.sh 添加参数
IDEA里 设置remote ,host填执行机ip地址 和 暴露端口

spark Streaming

RDD SQL
Streaming 吞吐量较 storm 大, 设置时间间隔,批处理
0C339F23-568A-474c-99D4-F49D7248740E.png
C182576E-3D71-4de4-B8A5-7E50B4068E18.png

object StreamingWordCount{
	def main(args:Array[String]){
		var conf = new SparkConf().setAppName("StreamingWordCount").setMaster("local[2]")
		var sc = new SparkContext(conf)
		sc.setCheckPointDir("c://ck")
		//设置rdd产生的 时间间隔
		var ssc = new StreamingContext(sc,Seconds(5))
		//接收数据  linux 命令往端口写数据 nc -lk 8888,会启动一个socketServer 和SocketClient(即命令行,输入数据)
		val ds = ssc.socketTextStream("172.16.0.11",8888)
		//DStream是一个特殊的RDD
		//reduceByKey 计算当前批次的
		val result = ds.flatMap(_.split("")).map(_,1).reduceByKey(_+_)
		//updateStateByKey 计算累加值,必须设置checkpoint,只需设置dir即可,他会自动ck, 防止程序意外终止时,原来计算的数据丢失
		val totalResult = ds.flatMap(_.split("")).map(_,1).updateStateByKey(updateFunc ,new HashPartitioner(sc.defaultParallelism),true)

		//打印结果
		result.print()
		//存到redis 或其它地方
		result.mapPartitions(it =>{
			//val connection
			//it.map()
		})
		ssc.start()
		ssc.awaitTermination()

	}
}

//创建一个 function , Seq里装的是这个批次某个单词的次数,Option装的是以前的结果
//(hello,1) (hello,1) (tom,1)
//(hello,Seq(1,1)) (tom,Seq(1))
val updateFunc = (iter:Iterator[(String,Seq[Int],Option[Int])])=>{
	//x代表单词;y 代表seq ;z代表以前sum,没有则取0
	iter.flatMap{case(x,y,z)=>Some(v.sum + z.getOrElse(0)).map(x=>(x,m))}
	
	//iter.map(t => (t._1, t._2.sum + t._3.getOrElse(0)))
	//iter.map{case(word,current_count,history_count)=> (word,current_count.sum + history_count.getOrElse(0))}
}

遗留问题

foreachPartition 往mysql写数据时, 写入的不是分区的数据吗?
例如:1 区  ‘tom’ 单词 的count 为3 ; 2区  ‘tom’ 单词 的count为6 ,本应该写入 ‘tom’ 单词 count 为9这一条数据的, 结果写入了 两条分别为 3 和 6的数据??

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值