- 博客(71)
- 资源 (13)
- 收藏
- 关注
原创 Shuffle 机制
1、在 Spark 中,不同stage、不同节点上的task 进行数据传递的过程通常称为 Shuffle 机制。Shuffle 解决的是如何将数据进行重新组织,使其能够在上游和下游 task 间进行
2021-05-29 18:38:13
561
原创 4. Spark 物理执行计划
1. 执行步骤Spark 具体采用3个步骤来生成物理执行计划:首先根据action() 操作顺序将应用划分为job,在每个job 中,根据job 的逻辑流程中的 ShuffleDependency 依赖关系,将job 划分为stage。 最后在每个stage 中,根据最后生成的RDD 分区个数,生成 task。(1). job 的生成当应用程序出现 action() 操作的时候,表示该应用会生成一个 job,该job 的处理流程为从输入数据到 resultRDD 生成的过程。(2). sta
2021-05-25 08:33:37
711
原创 3. Spark逻辑处理流程
1. 逻辑处理流程概览1). 数据模型RDD只是一个逻辑概念,在内存中并不会真正为RDD 分配存储空间(除非这个RDD 需要被缓存)。RDD 只会在计算中产生,计算结束后就会消失。 RDD 可以包含多个分区,不同分区的数据由不同的任务(task) 在不同的节点上产生。Spark 将RDD 的操作分为两种:transformation() 操作和 action() 操作。两者的区别是: action() 是一种后处理(post-processing), 产生输出结果,而且会触发Spark 提交j.
2021-05-20 08:51:31
465
原创 3. 无重复字符的最长子串
题目描述:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: s = "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注意,你的答案必须是 子串 ...
2021-05-17 08:04:02
94
原创 1. 两数之和(*)
题目描述:给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], tar...
2021-05-16 16:03:58
255
原创 2、Spark系统部署与应用运行的基本流程
1、Spark系统架构与Hadoop MapReduce 的结构类似,Spark 也是采用 Master-Worker 架构。Master 节点与Worker 节点的职责如下:1)、Master 节点上常驻Master 进程。该进程负责给Worker 进程分发Spark 任务,监控Worker 进程的存活情况以及监控Worker 进程上任务的执行情况。2)、Worker 节点上常驻Worker 进程。该进程除了与Master 进程进行通信外,还负责管理Spark 任务的执行,如启动 Exec
2021-05-15 17:27:38
324
2
原创 1、大数据处理框架概览
1、大数据具有数据量大(Volume)、数据类型多样(Variety)、产生与处理速度快(Velocity)、价值高(Value)的 “4V” 特性。2、Spark 是有 UC Berkeley 的 AMPLab 于2012年提出的基于内存,适合迭代计算的分布式处理框架。该框架允许用户将可重用的数据缓存(cache)到内存中,同时利用内存进行中间数据的聚合,极大缩短了数据处理的时间。这些大数据处理框架拥有共同的模型,即 MapReduce-like 模型,采用“分治-聚合”策略来对数据进行分布并行处理。
2021-05-13 08:51:44
1667
原创 Go 中的并发调度
1、概述go 的并发调度示意图为:首先是 Processor(简称 P),其作用类似于 CPU 核,用来控制可同时并发执行的任务数量。每个工作线程都必须绑定一个有效 P 才被允许执行任务,否则只能休眠,直到有空闲 P 时被唤醒。P 还为线程提供执行资源,比如对象分配内存、本地任务队列等。线程独享所绑定的P资源,可在无锁状态下执行高效操作。基本上,进程内的一切都在以 goroutine(简称...
2019-10-18 08:45:17
420
原创 Go 中的垃圾回收
三色标记和写屏障其基本原理为:起初所有对象都是白色。扫描找出所有可达对象,标记位灰色,放入待处理队列。从队列提取灰色对象,将其引用对象标记为灰色放入队列,自身标记为黑色。写屏障监视对象内存修改,重新标记或放回队列。当完成全部扫描和标记工作后,剩余的不是白色就是黑色,分别代表待回收和活跃对象,清理操作只续将白色对象内存收回即可。...
2019-10-17 08:46:14
172
原创 Go 中的内存分配
1、概述内存分配的基本策略:每次从操作系统申请一大块内存(比如1MB),以减少系统调用。将申请到的大块内存按照特定大小预先切分成小块,构成链表。为对象分配内存时,只须从大小合适的链表提取一小块即可。回收对象内存时,将该小块内存重新归还原链表,以便复用。如闲置内存过多,则尝试归还部分内存给操作系统,降低整体开销。内存块分配器将其管理的内存块分为两种。span: 将多个地址连续...
2019-10-16 08:56:17
315
原创 Go 中的工具链
1、编译编译并不仅仅是执行“go build” 命令,还有一些须额外注意的内容。如习惯使用 GDB 这类调试器,建议编译时添加 -gcflags “-N -l” 参数阻止优化和内联,否则调试时会有各种“找不到”的情况。package mainfunc test(x *int) { println(*x)}func main() { x := 0x100 test(&...
2019-10-14 08:56:12
416
原创 Go 中的测试
1、单元测试testing工具链和标准库自带单元测试框架,这让测试工作变得相对容易。测试代码须放在当前包以“_test.go” 结尾的文件中。测试函数以 Test 为名称前缀。测试命令(go test) 忽略以“_” 或 “.” 开头的测试文件。正常编译操作(go build/install) 会忽略测试文件。使用 Parallel 可有效利用多核并行优势,缩短测试时间。pac...
2019-10-10 08:55:51
310
原创 GO 中的反射
1、类型在面对类型时,我们要区分Type 和 Kind 。前者表示真实类型(静态类型),后者表示其基础结构(底层类型)类别。package mainimport ( "fmt" "reflect")type X intfunc main() { var a X = 100 t := reflect.TypeOf(a) fmt.Println(t.Name(), t.K...
2019-09-29 08:55:34
165
原创 Go 的包结构
1、导入包除使用默认包名外,还可使用别名,已解决同名冲突问题。import osx "github.com/apple/osx/lib"import nix "github.com/linux/lib"归纳起来,有四种不同的导入方式。import "github.com/qyuhen/test" // 默认方式:test.Aimport X "github.com/qyuhe...
2019-09-27 08:56:11
709
原创 Go 中的通道
从底层实现上来看,通道只是一个队列。同步模式下,发送和接收双方配对,然后直接复制数据给对方。如配对失败,则置入等待队列,直到另一方出现后才会唤醒。异步模式抢夺的则是数据缓冲槽。发送方要求有空槽可供写入,而接收方则要求有缓冲数据可读。需求不符时,同样加入等待队列,直到有另一方写入数据或腾出空槽后被唤醒。内置函数 cap 和 len 返回缓冲区大小和当前已缓冲数量;而对于同步通道则都返回0,据此可判...
2019-09-26 08:43:21
180
原创 Go 中的并发
1、并发的含义并发和并行的区别如下:并发:逻辑上具备同时处理多个任务的能力。并行:物理上在同一时刻执行多个并发任务。我们通常会说程序是并发设计的,也就是说它允许多个任务同时执行,但实际上并不一定真在同一时刻发生。在单核处理器上,它们能以间隔方式切换执行。而并行则依赖多核处理器等物理设备,让多个任务真正在同一时刻执行,它代表了当前程序运行状态。简单点说,并行是并发设计的理想执行模式。多线...
2019-09-24 08:55:49
322
原创 Go 中的接口
1、定义接口代表一种调用契约,是多个方法声明的集合。Go 接口实现机制很简洁,只要目标类型方法集合内包含接口声明的全部方法,就被视为实现了该接口,无须做显示声明。当然,目标类型可实现多个接口。2、执行机制接口有一个重要特征:将对象赋值给接口变量时,会复制该对象。package maintype data struct { x int}func main() { d := ...
2019-09-24 08:27:30
136
原创 Go 中的方法
定义方法和函数定义语法区别在于前者有实例接收参数,编译器以此确定方法所属类别。在某些语言里,尽管没有显示定义,但会在调用时隐式传递 this 实例参数。方法集类型有一个与之相关的方法集,这决定了它是否实现某个接口。类型 T 方法集包含所有 receiver T 方法。类型 *T 方法集包含所有 receiver T + *T 方法。匿名嵌入 S,T 方法集包含了所有 receiver...
2019-09-23 08:45:40
136
原创 Go 中的数据
1、字符串字符串是不可变字节序列,其本身就是一个复合结构。type stringStruct struct { str unsafe.Pointer len int} 使用“ ` ”定义不做转义处理的原始字符串,支持跨行。package mainimport ( "fmt")func main() { s := `line1\r\n line2`...
2019-09-19 09:01:03
211
原创 Go 函数
1、参数在 Go 中,不管是指针、引用类型,还是其他类型参数,都是值拷贝传递。区别无非是拷贝目标对象,还是拷贝指针而已。在函数面前,会为形参和返回值分配内存空间,并将实参拷贝到形参内存。表面上看,指针参数的性能要更好一些,但实际上得具体分析。被复制的指针会延长目标对象的生命周期,还可能会导致它被分配到堆上,那么其性能消耗就得加上堆内存分配和垃圾回收的成本。其实在栈上分配小对象只需要很少的指令...
2019-09-11 08:49:34
167
原创 Go 的表达式
1、运算符位移右操作数必须是无符号整数,或可以转换的无显示类型常量。package mainfunc main() { b := 23 x := 1 << b // 无效操作: 1 << b (shift count type int, must be unsigned integer) println(x)}如果是非常量位移表达式,那么会优先将无...
2019-09-09 09:01:12
1092
原创 Go 的类型
1、枚举Go 并没有明确意义上的 enum 定义,不过可借助 iota 标识符实现一组自增常量值来实现枚举类型。const ( x = iota // 0 y // 1 z // 2)const ( _ = iota // 0 KB = 1 << (10 * iota) // 1 ...
2019-09-07 09:02:22
119
原创 Go中的反射
Go 语言提供了一种机制,在编译时不知道类型的情况下,可更新变量、在运行时查看值、调用方法以及直接对它们的布局进行操作,这种机制称为反射。reflect.Type 和 reflect.Value反射功能由reflect 包提供,它定义了两个重要的类型:Type 和 Value。Type 表示Go 语言的一个类型,它是一个有很多方法的接口,这些方法可以用来识别类型以及透视类型的组成部分,比如一个...
2019-07-19 09:00:56
199
原创 Go中的测试
go test 工具go test 子命令是Go 语言包的测试驱动程序,这些包根据某些约定组织在一起。在一个包木目录中,以_test.go 结尾的文件不是 go build 命令编译的目标,而是 go test 编译的目标。在 *_test.go 文件中,三种函数需要特殊对待,即功能测试函数、基准测试函数和示例函数。功能测试函数是以Test 前缀命名的函数,用来检测一些程序逻辑的正确性,go ...
2019-07-18 08:57:09
362
原创 包和go 工具
go 的编译众所周知,Go 程序的编译比其他语言要快,即使从零开始编译也如此。这里有三个主要原因。第一,所有的导入都必须在每一个源文件的开头进行显式列出,这样编译器在确定依赖性的时候就不需要读取和处理整个文件;第二,包的依赖形成有向无环图,因为没有环,所以包可以独立甚至并行编译。第三,Go 包输出的目标文件不仅记录它自身的导出信息,还记录它所依赖的包的导出信息。当编译一个包时,编译器必须从每一个...
2019-07-17 08:42:21
85
原创 使用共享变量实现并发
竞态竞态是指在多个 goroutine 按某些交错顺序执行时程序无法给出正确的结果。一种避免数据竞态的方法是避免从多个 goroutine 访问同一个变量。由于其他 goroutine 无法直接访问相关变量,因此它们就必须使用通道来向受阻 goroutine 发送查询请求或者更新变量。这也是 Go 箴言的含义:不用通过共享内存来通信,而应该通过通信来共享内存。另一种避免数据竞态的方法是允许多...
2019-07-15 09:02:03
545
原创 Go中的通道
如果说 goroutine 是 Go 程序并发的执行体,通道就是它们之间的连接。通道是可以让一个goroutine 发送特定值到另一个 goroutine 的通信机制。每一个通道是一个具体类型的导管,叫做通道的元素类型。一个有 int 类型元素的通道写为 chan int。ch := make(chan int) // ch 的类型是 'chan int'像 map 一样,通道是一个使用 ...
2019-07-12 08:48:21
912
原创 Go 中的接口
很多面向对象的语言都有接口这个概念。Go 语言的接口的独特之处在于它是隐式实现。换句话说,对于一个具体的类型,无序声明它实现了哪些接口,只要提供接口所必需的方法即可。接口类型一个接口类型定义了一套方法,如果一个具体类型要实现该接口,那么必须实现接口类型定义的所有方法。实现接口如果一个类型实现了一个接口所要求的所有方法,那么这个类型就实现了这个接口。...
2019-07-10 08:59:51
132
原创 Go 中的方法
方法声明方法的声明和普通函数的声明类似,只是在函数名字前面多了一个参数。这个参数把这个方法绑定到这个参数对应的类型上。指针接收者的方法命名类型(Point) 与指向它们的指针(*Point)是唯一可以出现在接收者声明处的类型。而且,为防止混淆,不允许本身是指针的类型进行方法声明:type p *intfunc (p) f() { } // 编译错误:非法的接收者类型实际上...
2019-07-09 08:36:39
129
原创 Go 中的函数
函数声明函数的类型称作函数的签名。当两个函数拥有相同的形参列表和返回列表时,认为这两个函数的类型或签名是相同的。而形参和返回值的名字不会影响到函数类型、采用简写同样也不会影响到函数的类型。实参是按值传递的,所以函数接收到的是每个实参的副本;修改函数的形参变量并不会影响到调用者提供的实参。然而,如果提供的实参包含引用类型,比如指针、slice、map、函数或者通道,那么当函数使用形参变量时就要可...
2019-07-05 09:03:44
136
原创 Go 中的复合数据类型
数组在数组字面量中,如果省略号“…” 出现在数组长度的位置,那么数组的长度由初始化数组的元素个数决定。 q := [...]int{1,2,3} fmt.Printf("%T\n", q) // [3]int数组的长度是数组类型的一部分,所以 [3]int 和 [4]int 是两种不同的数组类型。数组的长度必须是常量表达式,也就是说,这个表达式的值在程序编译的时候就可以确定。 q ...
2019-07-02 09:02:28
226
原创 GO 中的数据类型
Go 的数据类型分四大类:基础类型,聚合类型,引用类型和接口类型。整数Go 同时具备有符号整数和无符号整数。有符号整数分四种大小:8位、16位、32位、64位,用 int8、int16、int32、int64 表示,对应的无符号整数是 uint8、uint16、uint32、uint64。有符号整数以补码表示,保留最高位作为符号位,n 为数字的取值范围是字符串常量...
2019-06-05 09:00:43
183
原创 Go基础知识梳理
1、名称指针Go提供了指针,它的值是变量的地址。使用& 操作符可以获取一个变量的地址,使用* 操作符可以获取指针引用的变量的值,但是指针不支持算数运算。指针类型的零值是 nil。测试 p != nil,结果是 true 说明 p 指向一个变量。指针是可比较的,两个指针当且仅当指针指向同一个变量或者两者都是 nil 的情况下才是相等的。 var x, y int fmt.Pri...
2019-05-31 09:01:51
801
原创 一个 Web服务器
package mainimport ( "fmt" "log" "net/http" "sync")var mu sync.Mutexvar count intfunc main() { http.HandleFunc("/", handler1) http.HandleFunc("/count", counter) log.Fatal(http.List
2019-03-04 08:06:57
108
原创 并发获取多个URL
package mainimport ( "fmt" "io" "io/ioutil" "net/http" "os" "time")func main() { start1 := time.Now() ch := make(chan string) for _, url := range os.Args[1:] { go fetch(url, ch)
2019-03-04 07:28:42
314
原创 找出重复行
1、package mainimport ( &quot;bufio&quot; &quot;fmt&quot; &quot;os&quot;)func main() { counts := make(map[string]int) input := bufio.NewScanner(os.Stdin) for input.Scan() { counts[input.Text()]+
2019-03-03 16:45:00
231
原创 linux环境下以非root权限安装lua
1、下载资源在以下网站中下载所用的源代码http://www.lua.org/download.htmlhttp://ftp.gnu.org/gnu/readline/http://ftp.gnu.org/pub/gnu/ncurses/2、安装readline、ncurses./configure --prefix=$path // 指定安装目录makemake insta...
2018-11-05 20:03:03
1440
3
原创 Go中的基准测试
基准测试可以用来识别某段代码的 CPU 或者内存效率问题。基准测试可以被用来测试不同的并发模式或者被用来辅助配置工作池的数量,以保证能最大化系统的吞吐量。package chapter10import ( "fmt" "testing")// BenchmarkSprintf 对 fmt.Sprintf 函数进行基准测试func BenchmarkSprintf(b *testi...
2018-10-30 08:16:38
944
原创 Go中的测试之单元测试
单元测试时用来测试包或者程序的一部分代码或者一组代码的函数。在Go语言中,其单元测试主要包括:基础测试,其只使用一组参数和结果来测试一段代码。表组测试也会测试一段代码,但是会使用多组参数和结果进行测试。也可以使用一些方法来模拟测试代码需要用到的外部资源,如数据库或者网络服务器。这有助于让测试在没有所需的外部资源可用的时候,模拟这些资源的行为让测试正常进行。1、基础单元测试package ch...
2018-10-26 08:17:10
3475
原创 编码、解码
在今天,JSON远比XML流行。这主要原因是因为与XML相比,使用JSON所处理的标签更少。而这就意味着网络传输时每个消息的数据更少,从而提升整个系统的性能。而且,JSON可以转化为BSON(Binary JavaScript Object Notation,二进制JavaScript对象标记),进一步缩小每个消息的数据长度。1、解码JSON(1)、使用 json 包的 NewDecoder ...
2018-10-25 08:00:55
163
二阶巴特沃斯低通滤波器(BLPF)
2015-05-06
理想低通滤波器
2015-05-06
基于二阶导数的边缘检测
2015-05-06
基于Prewit算子的边缘检测
2015-05-06
基于Log算子的边缘检测
2015-05-06
基于Sobel算子的边缘检测
2015-05-06
基于Canny算子的边缘检测
2015-05-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人