tonglin0325的个人主页

go学习笔记——基本语法

1.*和&的区别

& 是取地址符号 , 即取得某个变量的地址 , 如 &a

  • 是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值

参考:Go中*和&区别

println打印对象只能打印出其指针,需要使用fmt.Printf,如下

1
2
fmt.Printf("%+v\n", user)

参考:Golang 通过fmt包输出完整struct信息

2.defer

defer是Go语言提供的一种用于注册延迟调用的机制:让函数或语句可以在当前函数执行完毕后(包括通过return正常结束或者panic导致的异常结束)执行。

defer语句通常用于一些成对操作的场景:打开连接/关闭连接;加锁/释放锁;打开文件/关闭文件等。

defer在一些需要回收资源的场景非常有用,可以很方便地在函数结束前做一些清理操作。在打开资源语句的下一行,直接一句defer就可以在函数返回前关闭资源,可谓相当优雅。

1
2
3
f, _ := os.Open("defer.txt")
defer f.Close()

参考:Golang之轻松化解defer的温柔陷阱

全文 >>

Java反射机制

如果要通过一个对象找到一个类的名称,此时就需要用到反射机制(反射技术是用来做框架的,一般情况下Java私有对象不能被访问,但是暴力反射可以访问私有对象)

任何一个类如果没有明确地声明继承自哪个父类的时候,则默认继承Object类,所以getClass()方法是Object类中的。

文件在包java_reflect目录

 

1
2
3
4
5
6
7
// 类名:Y
// 属性:
// 方法:
class Y{

}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Y{

}

//主类
//Function : GetClass_demo;
public class GetClass_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根
Y y = new Y();
System.out.println(y.getClass().getName());
}

}

 输出  

 

 

 

全文 >>

Airflow分布式部署

airflow分布式部署所依赖的组件有mysql,redis,web-server,scheduler,worker等,可以将这些组件部署在不同的机器上,来减低单台机器的压力

单机安装请参考:Ubuntu16.04安装apache-airflow

然后在不同的机器上启动不同的组件

1
2
3
4
airflow webserver -D
airflow scheduler -D
airflow worker -D

安装airflow其他支持组件,比如airflow-kerberos,参考

1
2
https://awesome.dbyun.net/study/details?mid=160&id=7427

airflow启用kerberos,参考

1
2
https://github.com/astronomer/airflow-guides/blob/main/guides/kerberos.md

MySQL学习笔记——事务和隔离级别

ACID

ACID数据库事务管理的四个关键属性,用于确保数据在并发环境下的可靠性和一致性。

1.Atomicity(原子性)

原子性指的是一个事务中的所有操作要么全部执行成功,要么全部不执行。换句话说,事务是不可分割的最小单位。ACID模型的原子性主要涉及InnoDB事务。

例如,在银行转账操作中,假设从账户 A 转账到账户 B 是一个事务。如果在从 A 扣款后,B 未能成功入账,整个操作就会回滚到初始状态,A 账户的余额也不会减少。

相关的MySQL功能包括:

  • AUTOCOMMIT设置。
  • COMMIT语句。 
  • ROLLBACK语句。

2.Consistency(一致性)

数据库通常有各种完整性约束,如主键约束(Primary Key Constraint)、外键约束(Foreign Key Constraint)、唯一性约束(Unique Constraint)、检查约束(Check Constraint)等。一致性要求在事务执行之前和之后,这些约束必须始终满足。

例如,假设数据库要求每个用户的余额不能为负数,如果一个事务试图将用户的余额更新为负数,该事务将会失败并回滚,因为它违反了数据库的一致性约束。

3.Isolation(隔离性)

隔离性指的是在并发环境下,各个事务相互隔离执行,事务的中间状态对其他事务是不可见的。这意味着每个事务的执行应该不会受到其他事务的影响。

数据库通过使用锁和其他并发控制机制来实现隔离性。例如,在两个事务同时试图更新同一条记录的情况下,数据库会确保这些事务不会相互干扰,一个事务必须在另一个事务完成之前等待。

4.Durability(持久性)

持久性指的是一旦事务提交,数据库系统必须确保事务的结果被永久保存下来,即使在系统崩溃或断电的情况下也是如此。

这通常通过将事务的更改写入持久存储(如硬盘)来实现。例如,如果一个银行转账事务已经提交,即使服务器随后崩溃了,系统在恢复后仍然能保证该事务的结果是持久的,转账操作已被正确记录。

参考:https://dev.mysql.com/doc/refman/5.7/en/mysql-acid.html

全文 >>

hudi-cli使用

在 Amazon EMR 版本 5.28.0 及更高版本中, Amazon EMR 默认情况下会在安装 Spark、Hive 或 Presto 时安装 Hudi 组件。

参考:创建安装了 Hudi 的集群

Amazon EMR的版本和hudi的版本对应可以参考文档:Hudi 发行版历史记录

可以使用下面命令进入hudi-cli

1
2
/usr/lib/hudi/cli/bin/hudi-cli.sh

hudi-cli如下

退出cli,输入exit

我们可以在hive中注册hudi表,然后使用hive,sparkSQL或者presto对其进行查询

参考:Hudi 的工作原理

全文 >>

mongo基本操作

1.安装mongo客户端

参考:ubuntu安装mongodb-4.4(通过apt命令)

2.连接mongodb

1
mongo ip:27017/db_name -u user_name -p

3.创建collection

参考:MongoDB 教程

1
2
use xx_db
db.createCollection("xx_collection")

4.插入数据

insert one

1
2
3
4
5
6
7
8
9
10
use xx_db

db.xx_collection.insertOne(
{
"id":"100000",
"time":new Date(),
"abc":"123456"
}
)

insert many

1
2
3
4
5
6
7
8
9
10
11
12
13
db.xx_collection.insertMany(
[
{
"id":"200000",
"time":new Date(),
"token":"1111111"
}, {
"id":"300000",
"time":new Date(),
"token":"2222222"
}
]
)

5.删除数据

delete one

1
2
3
use xx_db
db.xx_collection.deleteOne({'id':'200000'})

全文 >>

Helm基本操作

Helm是k8s的包管理工具,使用helm可以简化k8s应用部署

而使用了helm之后,helm会提供一个模板,将这些yaml文件作为一个整体进行管理,高效复用,同时方便版本管理

 

1.安装Helm和配置仓库

1
2
https://helm.sh/zh/docs/intro/install/

mac安装helm

1
2
brew install helm

ubuntu安装helm

1
2
3
4
5
6
curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -
sudo apt-get install apt-transport-https --yes
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm

添加helm bitnami源

1
2
3
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

全文 >>

Hudi学习笔记——基本操作

1.Hudi概念

参考:

英文官方文档:https://hudi.apache.org/docs/concepts/

中文官方文档:https://hudi.apache.org/cn/docs/0.9.0/concepts/

Apache Hudi架构设计和基本概念

1.Hudi表的存储类型

hudi表的类型有2种,分成cow和mor

cow是Copy On Write的缩写,含义是写入时复制(只有parquet文件)

mor是Merge On Read的缩写,含义是读取时合并(log文件+parquet文件)

2种hudi表类型的对比

适用场景,参考:ByteLake:字节跳动基于Apache Hudi的实时数据湖平台

全文 >>

java程序内存泄露排查

1.生成内存快照文件(Heap Profile)

1
2
jmap -dump:format=b,file=heap.hprof ${pid}

2.使用Eclipse Memory Analyzer工具对hprof文件进行分析

1.12.0版本需要jdk11,所以下载1.10.0版本

1
2
http://www.eclipse.org/downloads/download.php?file=/mat/1.10.0/rcp/MemoryAnalyzer-1.10.0.20200225-linux.gtk.x86_64.zip

由于堆栈文件可能会很大,所以需要修改 MemoryAnalyzer.ini 文件中的-Xmx1024m,比如改成-Xmx10240m,否则可能会遇到下面报错

1
2
an internal error occurred during parsing heap dump from

3.分析堆栈文件

全文 >>