大数据工程师细节
2023-07-25 18:04:45 0 举报
AI智能生成
个人笔记
作者其他创作
大纲/内容
计算机基础知识
数据结构与算法
数据结构
线性表
顺序表(数组)
链表
单链表
双向链表
循环链表
栈
队列
树形结构
二叉树
二叉查找树
平衡二叉树
红黑树
哈夫曼树
森林
图
图的存储
图的遍历
深度优先遍历
广度优先遍历
跳表
哈希表
算法
排序
直接插入排序
冒泡排序
快速排序
希尔排序
选择排序
堆排序
归并排序
基数排序
递归
二分查找
堆排序
贪心
分治
回溯
动态规划
位图
最短路径
搜索
索引
度量
大O表示法
时间复杂度
空间复杂度
计算机组成原理
存储器与IO系统
计算机基本组成
硬件
cpu
主板
内存
磁盘
冯诺依曼体系
计算机性能
计算机功耗
计算机的指令和运算
处理器设计
网络
7层结构
tcp/ip
tcp三次握手、四次握手
http
cdn
操作系统
设计模式
设计原则
单一职责原则S
说明
定义:一个类或一个模块只做一件事情,实现高内聚低耦合。概念比较笼统,实际开发中要对类内的行为做分析
判断依据
一个类的属性和方法是否过多,代码行数是否过多
类依赖过多,或者被依赖过多
私有方法过多
比较难给类起统一的命名(职责模糊)
大多数方法操作的是一个属性
开闭原则O
说明
对扩展开发,对修改关闭
新增一个功能,应该在原有的代码基础上扩展(新增类、模块、方法、属性)
并非完全杜绝修改,而是以最小的代价来进行修改
对于不同粒度的认知,粗粒度认为是修改,细粒度认为是扩展
如何做
具备扩展意识、抽象意识、封装意识
应用一些设计原则:多态、面向接口而非实现编程、依赖注入
应用一些设计模式:装饰、策略、模板、职责链、状态
里式替换L
说明
定义:子类对象能够替换程序中原父类对象出现的任何地方,并保证原来程序的逻辑行为不变且正确性不被破坏
子类对象在设计的时候,要遵循父类对象的设计约定,包括:对输入、输出、异常的约定;注释中特殊说明的
里式替换和多态的区别
关注的角度不同。多态是面向对象编程的一种语法特性,是一种代码实现的思路
里式替换是一种设计原则,用来指导继承关系中子类应该如何设计,子类的设计要保证在替换掉父类后,不会有逻辑变动,不会破坏原来代码的正确性
里式替换是一种设计原则,用来指导继承关系中子类应该如何设计,子类的设计要保证在替换掉父类后,不会有逻辑变动,不会破坏原来代码的正确性
接口隔离原则I
说明
定义:客户端不应该被强迫依赖它所不需要的接口
接口有三种层次的理解:一组API接口、某一个微服务的接口、某一个类库的接口
如果部分接口/功能/方法能给部分调用者使用,就需要把功能隔离出来,单独给调用者使用
接口隔离原则和单一职责原则的区别
单一职责原则面向模块、类、接口的设计
设计模式
创建型
单例
工厂
简单工厂
工厂方法
抽象工厂
结构型
外观
装饰器
代理
行为型
策略
编程语言
python
python基础笔记
https://note.youdao.com/s/AcmbZqxt
java
java概述
java发行版历史
java版本特性
名词解释
jdk
jre
jvm
jdk基础
概念:名词解释
分类版本
Java SE
标准版本
Java EE
企业版本
Java Me
版本
8
名词
JDK
Java Development Kit
oracle jdk
8以后收费
open jdk
开源免费
可执行文件
java
启动JVM,然后让JVM执行指定的编译后的代码
javac
用于把Java源码文件(以.java后缀结尾)编译为Java字节码文件(以.class后缀结尾)
jar
用于把一组.class文件打包成一个.jar文件,便于发布
javadoc
从Java源码中自动提取注释并生成文档
JRE
Java Runtime Environment
JSR
Java Specification Request
JCP
Java Community Process
JVM
Java Virtual Machine
基础
注释
// 这是注释...
/*
这是注释
blablabla...
这也是注释
*/
/**
* 可以用来自动创建文档的注释
*
* @auther liaoxuefeng
*/
* 可以用来自动创建文档的注释
*
* @auther liaoxuefeng
*/
变量和数据类型
变量
先定义再赋值
变量的作用范围
{}扩起来的作用域里
常量
加final修饰符不可再改
基本数据类型
整形
byte
1字节
short
2字节
int
4字节
十六进制 0xff0000
二进制 0b00010
long
8字节
123124L
浮点型
float
4字节
1.24f
double
8字节
字符
char
2字节
支持acsii和unicode
布尔类型
boolen
true/false
引用类型
除了基本类型都是引用类型
运算
整数运算
整数的四则运算是精确的,除数为0的时候运行会报错,编译不会
溢出
整数存在范围限制,超出范围会溢出,不会报错
简便写法
+=
n += 100 => n = n + 100
-=
*=
/=
自增自减
i++
先引用再加1
++i
先加1再引用
移位运算
整数就是用字节表示的二进制,所以可以移位
<< 左移 x2 注意溢出
>> 右移 /2 符号不动
>>> 右移符号也变化
位运算
按位进行运算
与
&
两个数同时为1 结果为1
或
|
只要一个为1 结果为1
非
~
0 1互换
异或
^
两个数不同结果为1 否则为0
类型自动提升
计算中两个值类型不一致,结果为较大的类型
也可以强制转型
注意类型范围,超出转型的范围结果有误
int i = 123123;
short s = (short) i;
short s = (short) i;
浮点运算
只能进行加减乘除,不能位运算和移位运算
布尔运算
如果一个布尔运算的表达式能提前确定结果,则后续的计算不再执行,直接返回结果
三元运算符
b ? x : y
注意 x和y的返回值类型必须一致
字符和字符串
字符
char是基本类型,保存一个unicode编码字符
字符串
字符串是引用类型,可以存任意类型
字符串赋值不可变,是变量指向这个字符
使用+拼接字符串,如果拼接其他类型,优先转为字符串
java13开始可以使用""" """多行字符串
空值null和空串不一样
数组类型
数组基础
定义数组
int[] l;
int[] l = new int[5];
int[] l = new int[5] { 1,2,3,4,5};
数组声明后大小不可变
int类型默认值是0,float默认值是0.0,布尔默认值是false
使用数组下标访问
数组变量.length获取数组大小
数组操作
遍历数组
for循环
数组排序
Arrays.sort()
排序操作会更改变量的指针指向一个新的数组
多维数组
命令行参数
string数组
控制流
输入输出
输出
输出并换行
System.out.println()
格式化输出
System.out.printf()
%d
整数
%x
十六进制整数
%f
浮点数
%e
科学计数法浮点数
%s
字符串
输入
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
if条件判断
if (condition) { //条件满足执行此块};
对于应用类型,==判断引用是否相等
要判断值,需要使用.equals()方法
使用equals()方法时,注意第一个值不能为null,一般使用短路判断第一个值不为null
switch
switch (表达式) {
case1 : do; break;
case2 : do; break;
default : 1; break;
}
case1 : do; break;
case2 : do; break;
default : 1; break;
}
java12之后支持 case x -> 表达式;
也可以赋值
int x = case 1 -> 表达式;
case 2 -> {表达式;表达式;}
也可以赋值
int x = case 1 -> 表达式;
case 2 -> {表达式;表达式;}
while
while (表达式) {
循环
}
循环
}
do while
do { 执行 }
while (表达式);
while (表达式);
for
for
for ( 初始条件; 循环检测条件; 更新计数器) {
表达式
}
表达式
}
for each
for ( int n: ns) { 表达式} 遍历数组元素
break/continue
break结束循环
continue跳到下一次循环
面向对象
面向对象基础
定义一个类多个field
class Person {
public String name;
public int age;
}
public String name;
public int age;
}
创建实例
Person ming = new Person();
方法
控制field的访问权限,做一些额外操作;
封装成对外的接口,外部不关心实现
封装成对外的接口,外部不关心实现
修饰符 方法返回类型 方法名(方法参数列表) {
若干方法语句;
return 方法返回值;
}
public void setName(String name) {
if (name == null || name.isBlank()) {
throw new IllegalArgumentException("invalid name");
}
this.name = name.strip(); // 去掉首尾空格
}
方法调用
实例变量.方法名(参数);
ming.setName("xiaoming");
修饰符
public
类外部可以调用
private
类外部不能调用
this变量
指向当前实例
方法参数
参数
方法可以传递0或者n个参数,调用时严格按照参数定义传递
public void setName(String name) {
this.name = name;
}
this.name = name;
}
可变参数
使用 类型... 定义,相当于数组类型
class Group {
private String[] names;
public void setNames(String... names) {
this.names = names;
}
}
参数绑定
基本类型参数的传递,是调用方值的复制。双方各自的后续修改,互不影响
引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方
构造方法
构造方法的名称与类名一致
参数没有限制
没有返回值
必须用new
可以写多个构造方法,编译器通过构造方法的参数数量、位置和类型自动区分
方法重载
同名方法:一个类里,名称一样,参数不一样的方法
这种方法名相同,但各自的参数不同,称为方法重载
方法重载的目的是,功能类似的方法使用同一名字,更容易记住,因此,调用起来更简单
继承
extends
用来继承类,只能继承一个
目的
复用父类的代码
protected修饰符
控制权限在继承树内
super
表示父类
引用父类的字段是使用super.fieldname
应用父类方法使用super.method()
对于构造方法,如果不显示写super()来调用父类的构造方法,则默认会调用父类无参的构造方法,如果父类没有无参,编译错误
阻止继承
java15引入控制继承权限
public sealed class Shape permits Rect, Circle, Triangle {
...
}
sealed修饰类
permits表示可继承的子类
向上转型
引用类型为父类,实例为子类,这个时候叫做向上转型,但是这个对象丢失了子类特有的熟悉和方法
class Animal {};
class Brid extends Animal {};
Animal a = new Bird();
class Brid extends Animal {};
Animal a = new Bird();
向下转型
把向上转型过的实例,再用子类的引用类型重新赋值给新的变量,叫做向下转型,注意可能会失败
class Animal {};
class Bird extends Animal {};
Animal a = new Bird();
Bird b = (Bird) a;
class Bird extends Animal {};
Animal a = new Bird();
Bird b = (Bird) a;
instanceof
instanceof判断一个引用变量指向的实例,是不是这个类型,或者这个类型的父类
java14 后
public class Main {
public static void main(String[] args) {
Object obj = "hello";
if (obj instanceof String s) {
// 可以直接使用变量s:
System.out.println(s.toUpperCase());
}
}
}
public static void main(String[] args) {
Object obj = "hello";
if (obj instanceof String s) {
// 可以直接使用变量s:
System.out.println(s.toUpperCase());
}
}
}
区分组合和继承
继承 is a
组合 has a
class Student extends{
protected Book book;
protected int score;
}
protected Book book;
protected int score;
}
多态
前置知识
override
子类覆写父类的方法
需要方法名、入参、返回值类型都一样
使用@Override可以帮助检查
这个注解不是必须写的
使用@Override可以帮助检查
这个注解不是必须写的
overload
方法签名不一样,就是新方法,overload
多态定义
针对某个类型的方法调用,真正执行的类型取决于实际执行时的类型
Java的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型
public class Main {
public static void main(String[] args) {
Person p = new Student();
p.run(); // 应该打印Person.run还是Student.run?
}
}
class Person {
public void run() {
System.out.println("Person.run");
}
}
class Student extends Person {
@Override
public void run() {
System.out.println("Student.run");
}
}
//打印的是Student.run
public static void main(String[] args) {
Person p = new Student();
p.run(); // 应该打印Person.run还是Student.run?
}
}
class Person {
public void run() {
System.out.println("Person.run");
}
}
class Student extends Person {
@Override
public void run() {
System.out.println("Student.run");
}
}
//打印的是Student.run
多态应用
1、父类A创建了a方法,子类A1,A2,A3分别覆写了a方法,当我们在处理可能传入的实例是不同的子类,却要调用相同的方法是,传入的变量类型写成父类,逻辑代码中执行a方法。这样新增子类时,完全不需要改动父类的代码
2、所有的class都继承自Object,Object提供了toString()方法、equals()方法、hashCode()方法,在必要的时候我们覆写这几个方法
调用super
子类的覆写方法中,如果要调用父类方法,使用super.method()
final
父类加final修饰符,不允许子类覆写
也可以修饰类,不允许继承
修饰实例字段,不可修改
也可以修饰类,不允许继承
修饰实例字段,不可修改
抽象类
abstract
声明抽象类,抽象方法
无法实例化一个抽象类
抽象类定义的方法,子类必须覆写
使用抽象类作为引用类型来声明变量,来实现多态。调用方法时不用关系变量的具体类型
面向抽象编程
上层只关心定义规范
不需要子类就能正常编译
子类来明确具体逻辑
接口
interface
=没有字段的抽象类
比抽象类还要抽象,所有方法默认都是public abstract,所以不需要写
implements
用来实现接口,可以选多个
接口继承
使用extends继承一个接口,相当于扩展接口的方法
default方法
抽象类vs接口
继承
抽象类
只能extends一个class
接口
可以implements多个interface
字段
抽象类
可以定义实例字段
接口
不能定义实例字段
抽象方法,必须覆写
抽象类
可以定义抽象方法
接口
可以定义抽象方法
非抽象方法,不必须覆写
抽象类
可以定义非抽象方法
可以访问实例字段
接口
可以定义default方法
不可以访问实例字段
使用
一般来说,公共逻辑适合放在abstract class中,具体逻辑放到各个子类,而接口层次代表抽象程度
举例
List list = new ArrayList(); // 用List接口引用具体子类的实例
Collection coll = list; // 向上转型为Collection接口
Iterable it = coll; // 向上转型为Iterable接口
静态方法和静态字段
static
静态字段属于类
不推荐使用实例.静态字段去访问,使用类.静态字段/方法
静态方法无法访问this变量和实例变量
通常用于工具类
接口可以定义静态字段,public static final,关键字可省略
包
package
一般是多层结构用点分割,一般使用倒置的域名
位于同一个包的类,可以访问包作用域下边的字段和方法
import
完整包名类名
使用*引入包内所有类
作用域
public
可以被其他任何类访问
private
无法被其他类访问
被限定在类内部,推荐把private方法放在类的后边
嵌套类可以访问外边的private
protected
用作继承关系,被标识的字段和方法可以被子类和子类的子类访问
package
访问同包,一个包里默认
局部变量
一般在方法内部定义,作用域到块标记结尾
final
修饰类,不可被继承
修饰字段,不可被重新赋值
修饰局部变量,组织重新赋值
内部类
Inner Class
Anonymous Class
public interface Human() {}
Human h = new Human() {
@Override
public void run() {
System.out.println("Hello, " + Outer.this.name);
}
};
@Override
public void run() {
System.out.println("Hello, " + Outer.this.name);
}
};
接口本身不能实例化,通过匿名类定义了一个实现接口的匿名类,再new这个类
普通的类也可以
HashMap<String, String> map2 = new HashMap<>() {};
HashMap<String, String> map3 = new HashMap<>() {
{
put("A", "1");
put("B", "2");
}
};
{
put("A", "1");
put("B", "2");
}
};
Static Nested Class
java核心类
字符串和编码
String是一个引用类型,也是一个class,字符串内部是char[]组成的
字符串比较
使用.equals()比较而不是==,==判断引用
字符串方法
equals()
equalsIgnoreCase()
contains()
搜索字串
indexOf()
符合pattern的第一个索引位置
lastIndexOf()
同上,最后一个位置
startsWith()
开始位置,返回布尔
endsWith()
结束位置,返回布尔
substring()
提取子串
trim()
去掉首尾空白\t\r\n
strip()
去掉首尾空白\t\r\n中文空白
isEmpty()
判空
isBlank()
判空白串
replace()
替换
replaceAll()
正则替换
split()
切割字符串
join()
拼接字符串
formatted()
格式化,字符串.formatted()
format()
格式化,String.format(字符串)
String.valueOf()
转成字符串
编码
Java的String和char在内存中总是以Unicode编码表示
早期版本,String使用char[]数组保存,较新的版本中使用byte[]保存
StringBuilder
泛型
IO
jvm
scala
服务端
DevOps
nginx
nginx.conf
http
log_format
server
location
proxy_pass
容器
docker
docker-compose
对Docker容器集群的快速编排
DockerFile
FROM
RUN
COPY
CMD
ENTRYPOINT
ENV
WORKDIR
USER
k8s
ingrass
svc
部署
git
ci/cd
Jenkins
gitlab-ci/cd
分布式
分布式概论
目的
大流量处理
通过集群把大规模请求负载到不同的节点处理
关键业务保护
提高后台服务可用性,隔离故障防止多米诺效应
流量过大,进行服务降级,保障关键业务
高性能常用技术
缓存
从浏览器、网络、后端服务、数据库、文件系统、磁盘和cpu,都有缓存。
对于分布式下的缓存系统,通常需要一个缓存集群,以及一个proxy做分片和路由
负载均衡
水平扩展
异步调用
通过消息队列,缓存请求,后端根据能力来处理请求,问题是实时性不能保证
数据分区和数据镜像
数据分区是把数据按照一定的方式分区,不同分区承担不同的请求流量(比如地理位置),这样会导致跨库join和事务比较复杂
数据镜像是把一个库镜像成多份,不需要数据路由中间件。可以在任意节点读写,数据库内部做同步,问题是数据一致性的保证
稳定性常用技术
服务拆分
故障隔离,重用服务模块,但会引入服务间依赖调用问题
服务冗余
去除单点故障,支持弹性伸缩和故障迁移,但对于有状态的服务,复杂度较高,比如弹性伸缩时要考虑数据复制或是重新分片
限流降级
停掉一些服务,或者拒绝一些用户请求
高可用架构
从冗余架构的角度来保障可用性,比如,多租户隔离,灾备多活,或是数据可以在其中复制保持一致性的集群。
高可用运维
指DevOps里边的CI/CD,包括自动化测试,灰度发布
分布式系统的关键技术
服务治理
服务拆分、服务发现、服务调用、服务依赖、服务的关键度定义。。
软件架构管理
架构版本管理,架构生命周期管理,以及对服务的编排、聚合、事务处理等服务调度
DevOps
环境构建、持续集成、持续部署
自动化运维
基于DevOps对服务进行自动伸缩、故障迁移、配置管理、状态管理
资源调度管理
计算、存储、网络等资源调度、隔离和管理。
整体架构监控
需要对三层系统(应用层、中间件层、基础层)进行监控。
流量控制
负载均衡、服务路由、熔断、降级、限流等和流量相关的调度
web框架
tornado
协程,在linux上使用epoll模型的IO多路复用,异步,不使用wsgi
基本结构
1、引包
from tornado import x
from tornado.ioloop import IOLoop
主循环
from tornado import gen
异步方法
from tornado import web
web上下文
from tornado_mysql import pools
异步的mysql客户端
from tornado.httpclient import AsyncHTTPClient
异步的http接口
2、写handler类继承(web.RequestHandler )
同步
异步
方法加@gen.coroutine装饰器
定义get或post
3、创建Application实例
application= Application(路由数组,app参数)
4、绑定监听接口
application.listen(8888)
5、主循环
IOLoop.current().start()
flask
小巧,用的人多,插件多
django
大而全,后台管理,session管理,orm
spring
Ioc容器
ioc
Inversion of Control 控制反转
spring通过统一Ioc容器来实例化组件、管理组件之间的依赖管理、负责组件的创建及销毁,在Ioc容器中,创建和装配组件的控制权交由spring管理;应用程序只需直接使用已经创建及配置好的组件
DI
DI:Dependency Injection 依赖注入
想使用spring组装好的组件,需要有一种声明的方式,这种方式叫做依赖注入
依赖注入的三种方式
构造器注入
set方法注入
字段注入(基于注解)
组件管理
基于application.xml
注入bean
<bean id="" class=""></bean>
每个bean的id是唯一标识
<bean>
<property name="" ref="" />
</bean>
<property name="" ref="" />
</bean>
name注入的名称,ref依赖的bean
注入boolean int String
<bean id="" class="">
<property name="" value="" />
</bean>
<property name="" value="" />
</bean>
通过value写入值
创建容器
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("application.xml"));
区别
ApplicationContext
一次性加载所有bean
BeanFactory
获取bean的时候才加载
基于注解
标记组件
@Component
在类上标记注解
注入
@Autowired
在字段上注入,通常使用package权限,方便测试
启动类
@ComponentScan
扫描组件,可指定范围
@Configuration
默认搜索当前类和子类所在的包
创建容器
ApplicationContext context = new AnnotationConfigApplicationContext(启动类.class);
定制Bean
@Scope
默认的Bean是单例的
ConfigurableBeanFactory.SCOPE_PROTOTYPE
每次获取Bean都会生成一个新的,例如connection
注入List
@Autowired
List<接口> 实现集合
List<接口> 实现集合
通过实现一个接口,来扩展具体实现,并通过list注入
@Order
在具体实现类上标注,可以控制注入的顺序
可选注入
@Autowired(required=false)
提供默认值,当没有此Component时使用默认值
创建第三方Bean
@Bean
对于不在自己package的类,创建一个配置类来承载第三方组件的注入,在方法上标注@Bean,方法内写获取此Bean逻辑
初始化和销毁
@PostConstruct
在Bean注入后,执行标注了此注解的方法
@PreDestroy
在销毁时,容器会先调用此注解的方法进行执行
使用别名
@Bean("displayName")
@Bean
@Qualifier("displayName")
@Qualifier("displayName")
注入的时候,也要用@Qualifier("displayName")标注是用的哪个
@Primary
遇到相同类型,优先使用此注解的Bean
注入文件
org.springframework.core.io.Resource
@Value("classpath:/")
Resource resource
Resource resource
resource.getInputStream()获得输入流
注入配置
@Configuration
@PropertySource("app.properties")
@PropertySource("app.properties")
标注在类上
@Value("${a.b:default")
标注在字段上,方法参数中
获取a.b这个key的值,如果没有,默认值为default
@Value("#{otherConfig.name}")
#标记表示从其他Bean获取属性
使用条件装配
@Profile("test")
-Dspring.profiles.active=test
启动时,jvm会识别这个参数
启动时,jvm会识别这个参数
在test环境生效
@Conditional(条件类.class)
aop
AspectJ
定义一个类使用@Aspect修饰
定义一个方法使用@拦截器修饰
拦截器类型
@Before()
先执行拦截器代码,再执行目标代码,遇到拦截器异常,抛异常退出
@Before("execution(public * com.xx.xx.UserSerivce.*(..))") 通过注解识别具体哪个类的哪个方法来织入
@After()
先执行目标代码,再执行拦截器,无论目标代码是否异常,都执行拦截器,类似finally
@AfterReturning()
目标代码正常返回后,执行
@AfterThrowing
目标代码抛异常退出后,执行
@Around
能完全控制目标代码是否执行,可以在执行前后,抛异常前后拦截,包括上边的所有功能
可以获取ProceedingJoinPoint pjp作为方法入参
只有around能获取此变量
pjp.getSignature()
pjp.proceed()执行目标代码
注解装配
原理
Spring使用CGLIB动态创建的子类
使用注意
各个拦截器的执行顺序
只有Around可以return修改后的返回值且不能改变类型,其余的return是无效的
final类型的字段会抛出NPE,原因是CGLIB动态创建的代理子类,不会super()调用父类的构造方法,从父类继承的final成员变量,是没有初始化的
事务
数据库
关系型数据库
mysql
ACID
原子性
一致性
隔离性
持久性
事务
事务的隔离级别
读提交
读未提交
重复读
串行化
现象
脏读
幻读
不可重复读
引擎
Innodb
Myisam
索引
b+树
nosql
redis
数据类型
string
mongodb
hbase
搜索
es
olap
doris
【Doris全面解析】Doris Compaction机制解析
https://mp.weixin.qq.com/s/5D1gAOEiFWM7N6KPwqHHdw
Apache Doris 四万字小总结
https://xie.infoq.cn/article/b2250c2d887f69d8519a3f50b
Apache Doris 索引机制解析
https://www.modb.pro/db/111345
kylin
druid
知识点
存储与检索
http://ddia.vonng.com/#/ch3
手撸sstable
https://github.com/x-hansong/TinyKvStore/blob/master/src/main/java/com/xiaohansong/kvstore/model/sstable/SsTable.java
大数据
数据仓库
数仓规范
建模规范
阿里巴巴-大数据之路
开发/测试/上线/DQC规范
数仓运营
指标运营
数据可视化
bi
常用bi工具
cboard
tableau
superset
一般方法
配置数据源
多种connector
构建数据集
基于sql或者数据源,识别字段,选择维度和指标
配置dashboard
配置筛选器,配置table,排版
数据处理和计算
存储
hdfs
计算
hive
HiveServer2
HiveMetastore
HiveClient
spark
spark streaming
spark batch
dataframe/dataset api
rdd
Transformation算子
Action算子
spark sql
driver/excutor
累加器
broadcast
flink
数据湖
iceberg
hudi
数据采集和同步
采集,面向日志
flume
filebeat
flink-cdc
canel
同步,面向db
sqoop
资源管理与协调
分布式协调
zk
etcd
资源管理
yarn
k8s
工作流调度
azkaban
airflow
0 条评论
下一页