数据开发
未读Spark的宽窄依赖如何划分宽窄依赖如果子RDD的一个分区完全依赖父RDD的一个或多个分区,则是窄依赖,否则就是宽依赖。这个完全依赖怎么理解呢?其实就是父RDD一个分区的数据是否需要切分,或者说子RDD分区要依赖父RDD分区的全部而不仅仅是一部分。上面这样说相对比较严谨,但也会有特殊情况,比如在只有一个分区的情况下,强行使用repartiton操作,即使父子RDD各自只有一个分区,也是宽依赖。这种情况生产中不会遇到,但要知晓。Narrow DependiesVolantis
数据开发
未读常用端口号
常用端口号
2.x
3.x
访问 HDFS 端口号
50070
9870
NN 内部通信端口
9000
8020
访问 MR 执行任务情况端口
8088
8088
Yarn 内部通信端口
8032
8032
访问历史服务器端口
19888
19888
历史服务器内部端口
10020
10020
常用配置文件
常用配置文件
作用
core-site.xml
配置 Hadoop 的基本属性,例如 HDFS 的默认文件系统、I/O 和记录日志等设置。
hdfs-site.xml
配置 HDFS 的属性,例如数据块大小、副本数量、名字节点和数据节点的地址、缓存等。
yarn-site.xml
配置 YARN 的属性,例如资源管理器和节点管理器的地址、内存和 CPU 的分配、日志聚合等。
mapred-site.xml
配置 MapReduce 的属性,例如作业跟踪器和任务跟踪器的地址、作业优先级、输出压缩等。
hadoop-env.sh
配置 Hadoop 的环境变量,例如 JAVA_HOME、HADOOP_H ...
基于 Ububtu Server 20.04.1 LTS 版本Hadoop 3.1.3 版本
一、重新设置主机名12hostnamectl set-hostname localhostbash
二、关闭防火墙防火墙常用命令
Ubuntu安装防火墙 sudo apt-get install ufw -y
查看防火墙开启状态 sudo ufw status
开启某个端口(以8866为例) sudo ufw allow 8866
开启防火墙 sudo ufw enable
关闭防火墙 sudo ufw disable
重启防火墙 sudo ufw reload
禁止某个端口(以8866为例) sudo ufw delete allow 8866
查看端口IP netstat -ltn
2.1 关闭防火墙1ufw disable
2.2 检查防火墙是否关闭1ufw status
三、设置IP映射2.1 主节点配置 hosts 文件1vim /etc/hosts
3.2 添加ip地址和主机名110.211.55.60 localhost
3.3 测试IP映射配置1pin ...
Git版本控制什么是GitGit 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目
可以实现软件的版本控制,在多个版本之间切换
可以实现多分支开发,提高开发效率
可以实现历史记录,历史状态的恢复
团队内部实现权限管理等
Git工作流程
Git的工作流程分为四个模块:
工作目录:存放我们正在写的代码(当我们新版本开发完成之后,就可以进行新版本的提交)
暂存区:暂时保存待提交的内容(新版本提交后会存放到本地仓库)
本地仓库:位于我们电脑上的一个版本控制仓库(存放的就是当前项目各个版本代码的增删信息)
远程仓库:位于服务器上的版本控制仓库(服务器上的版本信息可以由本地仓库推送上去,也可以从服务器抓取到本地仓库)
安装Git可以前往 Git 的官网进行下载安装 https://git-scm.com
在安装完成后,需要设定全局用户名和邮箱来区分不同的用户:
12git config --global user.name "Your Name"git config --global user.email "email@exampl ...
Scala 模式匹配模式匹配简单示例1234567891011121314val oper: Char = '+'val n1: Int = 20val n2: Int = 10var res: Int = 0oper match { case '+' => res = n1 + n2 case '-' => res = n1 - n2 case '*' => res = n1 * n2 case '/' => res = n1 / n2 case _ => println("oper error")}println("res:\t" + res)
说明:
1. match 和 case 是 scala 中模式匹配的关键字
1. 如果匹配成功,执行 => 后的代码块
1. 匹配顺序是从上到下的,匹配到就执行对应的代码
1. => 还没的代码块不需要写 break ,会自动退出 ...
偏函数(partial function)这里通过一个例子来了解一下什么是偏函数
需求:将一个 Any 类型的列表中的数字+1,非数字忽略
123456789val list: List[Any] = List(1, 2, 3, 4, "hello")list// 过滤 Int 类型之外的类型.filter(_.isInstanceOf[Int])// 将 Any 类型转为 Int 类型.map(_.asInstanceOf[Int])// 数字+1.map(_ + 1)
这里虽然解决了问题,但是太过于麻烦了
这里还可以通过模式匹配的方法去解决
1234list.map { case x: Int => x + 1 case _ =>}
虽然使用模式匹配比较简洁,但还是不够完美,这里我们就要通过偏函数去达到更加简洁方便的去解决这个问题
那么什么是偏函数呢?
在对符合某个条件时,而不是所有情况进行逻辑操作时,使用偏函数是个不错的选择
将包括在大括号内的一组 case 语句封装为函数,称之为偏函数,它只会对作用于指定类型的参数或者指定 ...
高阶函数(high-order function) 及 函数柯里化能够接收函数作为参数的函数,叫做高阶函数(high-order function)
可以使应用程序更加健壮
123456789def highFunc(f: Double => Double, num: Double): Unit = { f(num)}def sum(num: Double): Double = { num + num}highFunc(sum,6.0)
高阶函数可以接收多个函数作为参数
高阶函数可以返回一个函数
1234567def minusxy(x: Int) = { // 匿名函数 (y: Int) => x - y}// 输出结果是 8 - 5 = 3println(minusxy(8)(5))
说明:
minusxy 是高阶函数,返回了一个匿名函数
返回的匿名函数 (y: Int) => x - y
返回的匿名函数可以使用变量接收
闭包(closure)闭包就是一个函数和与其相关的引用环境组合的一个整体 ...
Scala泛型泛型的意思是 泛指某种具体的数据类型,在 Scala 中泛型用 [数据类型] 表示。
泛型方法通过getMiddleElement方法获取任意数据类型的数组中的中间元素
123def getMiddleElement[T](array: Array[T]): T = { array(array.length / 2)}
泛型类定义一个Pair泛型类,这个类中包含两个字段且字段类型不固定
1class Pair[T](var x: T, var y: T)
泛型特质Loggers是一个泛型特质,ConsoleLogger继承了Loggers,并重写了其 x 字段和 show 方法
1234567891011trait Logger[T] { val x: T def show(y: T)}object ConsoleLogger extends Logger[String] { override val x: String = "log" override def show(y: String) ...
Scala Actor 并发编程模型 Actor并发编程模型,是 Scala 提供的一直与 Java 完全不一样的并发编程模型,是一直基于事件模型的并发机制。Actor并发编程模型是一种不共享数据,依赖消息传递的并发编程模型,有效避免了资源争夺、死锁等现象。
Actor是一种基于事件(消息)的并发编程模型,不共享数据,有效避免了共享数据加锁问题。
Java并发编程对比 Actor 并发编程模型
Java并发编程
Actor 并发编程模型
共享数据锁模型(share data and lock)
share nothing
每个 object 都有一个monitor,用来监视对共享数据的访问
不共享数据,Actor直接通过Message通讯
加锁代码使用synchronized标识
死锁问题
每个Actor内部是顺序执行的
每个线程内部是顺序执行的
每个Actor内部是顺序执行的
Scala 在 2.11 及之后的版本中加入了Akka并发编程框架,Actor并发编程模型已经被废弃了。
创建 Actor可以通过类(Class)或者单例对象(O ...
通过 Akka 构建简单的 Spark 通信框架实现思路:
构建Master、Worker阶段
构建 Master ActorSystem、 Actor
构建 Worker ActorSystem、 Actor
Worker注册阶段
Worker进行向Master注册(将自己的ID、CPU 核数、内存大小(MB)发送给 Master)
Worke定时发送心跳阶段
Worke定期向Master发送心跳消息
Master定时心跳检测阶段
Master定期检测Worker心跳,将一些超时的Worker移除,并对Worker按照内存进行倒序排列
多个Worker测试阶段
启动多个Worker,查看是否能注册成功,并停止某个Worker查看是否能正常移除