Hoey笔记

和有趣的人做尽有趣的事


  • Home

  • Archives

  • Sitemap

  • Search

iPhone 自带VPN锁屏自动断开

Posted on 2024-03-12

一、 Mobileconfig

iOS Mobileconfig是苹果iOS操作系统中的配置文件。这些配置文件以.mobileconfig文件扩展名存储,通常用于配置设备上的各种设置,如VPN配置、电子邮件账户设置、Wi-Fi网络配置、安全策略等。用户可以通过安装.mobileconfig文件来快速轻松地配置设备,而无需手动逐项设置。

Mobileconfig文件采用XML格式,可以包含各种配置指令和参数,让用户和管理员可以方便地搭建和管理iOS设备的配置。通过安装Mobileconfig文件,用户可以一次性完成多项配置,提高了配置的效率和便捷性。这对于企业中需要大规模配置iOS设备时特别有用,管理员可以通过Mobileconfig文件轻松地为员工设备进行批量配置。

总的来说,iOS Mobileconfig文件是一种用于配置iOS设备各项设置的文件格式,能够简化配置流程,提高效率,适用于个人、企业以及其他组织对iOS设备的管理和配置需求。

二、自动断开重连

VPN.IPSec | Apple Developer Documentation

  1. 通过配置MobileConfig实现自动识别重连,我这里使用的是Cisco IPSec,下面这个模版用来参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>IPSec</key>
<dict>
<key>AuthenticationMethod</key>
<string>SharedSecret</string>
<key>LocalIdentifier</key>
<string>***** 群租名称 ****</string>
<key>LocalIdentifierType</key>
<string>KeyID</string>
<key>RemoteAddress</key>
<string>***** 服务器 ****</string>
<key>SharedSecret</key>
<string>***** 密钥 ****</string>
</dict>
<key>IPv4</key>
<dict>
<key>OverridePrimary</key>
<integer>1</integer>
</dict>
<key>OnDemandEnabled</key>
<integer>1</integer>
<key>OnDemandRules</key>
<array>
<dict>
<key>Action</key>
<string>Connect</string>
</dict>
<dict>
<key>Action</key>
<string>Connect</string>
<key>InterfaceTypeMatch</key>
<string>Cellular</string>
</dict>
<dict>
<key>Action</key>
<string>Connect</string>
<key>InterfaceTypeMatch</key>
<string>WiFi</string>
</dict>
<dict>
<key>Action</key>
<string>Ignore</string>
</dict>
</array>
<key>PayloadDescription</key>
<string>defualt payload desc</string>
<key>PayloadDisplayName</key>
<string>VPN</string>
<key>PayloadIdentifier</key>
<string>com.apple.vpn.managed.087D3518-3EE4-44AB-B20B-84B150C5825E</string>
<key>PayloadOrganization</key>
<string>default playload org</string>
<key>PayloadType</key>
<string>com.apple.vpn.managed</string>
<key>PayloadUUID</key>
<string>B6E58B82-F683-4CC9-8A05-DFA9A3B06BB4</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>Proxies</key>
<dict>
<key>HTTPEnable</key>
<integer>0</integer>
<key>HTTPSEnable</key>
<integer>0</integer>
<key>ProxyAutoConfigEnable</key>
<integer>0</integer>
<key>ProxyAutoDiscoveryEnable</key>
<integer>0</integer>
</dict>
<key>UserDefinedName</key>
<string>连接VPN</string>
<key>VPNType</key>
<string>IPSec</string>
</dict>
</array>
<key>PayloadDescription</key>
<string>defualt payload desc</string>
<key>PayloadDisplayName</key>
<string>VPN</string>
<key>PayloadIdentifier</key>
<string>D5CF7299-AF60-45A5-8B40-0051E80C8048</string>
<key>PayloadOrganization</key>
<string>default playload org</string>
<key>PayloadRemovalDisallowed</key>
<false/>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>222010E8-2D18-4BBE-BD19-58B192C4CCE4</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

这里你只需要填写下面几个参数

1
2
3
LocalIdentifier: 群租名称
RemoteAddress: 服务器
SharedSecret: 密钥

你会发现里面没有用户名和密码,是因为用户名和密码不在这个里面填写,所以不需要填,到后面的时候自然会有地方填。

下面对应IOS中Cisco IPSec的客户端界面。

image-20240312132344341

  1. 将上面的模版修改以后,保存为后缀.mobileconfig的文件,放在网站上,保证可以被下载。

你可以启动一个小web file服务器,用来读取到远端的file并下载。可以参考这篇Blog python3 http.server 本地服务支持跨域 - hoey94 - 博客园 (cnblogs.com)

  1. 使用手机端下载.mobileconfig文件,并安装描述文件。
  2. 在安装的过程中输入用户名和密码即可

三、 其他

如果你使用的是L2TP,你可以参考下面的这个模版,这个模版我没有测试,可以自己测一下,据网友反映是可以使用的。

这里也有关于它的讨论,可以看一下iPhone 打开自带VPN后,锁屏没过多久,… - Apple 社区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>IPSec</key>
<dict>
<key>AuthenticationMethod</key>
<string>SharedSecret</string>
</dict>
<key>IPv4</key>
<dict>
<key>OverridePrimary</key>
<integer>1</integer>
</dict>
<key>PPP</key>
<dict>
<key>CommRemoteAddress</key>
<string>****此处输入 VPN 服务器地址****</string>
</dict>
<key>PayloadDisplayName</key>
<string>VPN</string>
<key>PayloadIdentifier</key>
<string>com.apple.vpn.managed.087D3518-3EE4-44AB-B20B-84B150C5825E</string>
<key>PayloadType</key>
<string>com.apple.vpn.managed</string>
<key>PayloadUUID</key>
<string>B6E40B84-A912-4249-A73D-DA224AAAC470</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>UserDefinedName</key>
<string>****此处可以自定义 VPN 显示的名字****</string>
<key>VPNType</key>
<string>L2TP</string>
<key>IPv4</key>
<dict>
<key>OverridePrimary</key>
<integer>1</integer>
</dict>
<key>OnDemandEnabled</key>
<integer>1</integer>
<key>OnDemandRules</key>
<array>
<dict>
<key>Action</key>
<string>Connect</string>
</dict>
<dict>
<key>Action</key>
<string>Connect</string>
<key>InterfaceTypeMatch</key>
<string>Cellular</string>
</dict>
<dict>
<key>Action</key>
<string>Connect</string>
<key>InterfaceTypeMatch</key>
<string>WiFi</string>
</dict>
<dict>
<key>Action</key>
<string>Ignore</string>
</dict>
</array>
</dict>
</array>
<key>PayloadDisplayName</key>
<string>****此处自定义描述文件的名字****</string>
<key>PayloadIdentifier</key>
<string>D653CCA3-DC03-413C-9DE8-D19878CE48A3</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>EAB66BD6-D1D4-4326-BF83-09A9042C5507</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

Doris写入数据异常提示actual column number in csv file is less than schema column number

Posted on 2024-03-12

Flink 写入Doris报错

1
Reason: actual column number in csv file is  less than  schema column number.actual number: 34, column separator: [	], line delimiter: [].......

通过去掉列中的换行和回车,修正了部分问题

原格式:

1
2
3
select 
VERSION_J as VERSION_J
from t

修改后:

1
2
3
select 
REGEXP_REPLACE(coalesce(VERSION_J, ''),'CHAR(13)|CHAR(10)|\r|\n','') as VERSION_J
from t

手机端使用GPT的方法

Posted on 2024-03-08
  1. 访问下面的邀请链接注册一个账号,链接有效期7天,只允许注册5个人。

https://talk.zyh1.cc/#/register?magic_token=4e3c9424a8b516d7a9040835b0c0f8c02dc48a8eac02a5b61e96b29bd5b8cc4700000000000006000000000000003935353636335e46eb65000000000000

image-20240308001252437

  1. 下载移动端

VoceChat 目前支持安卓和苹果两大平台,请前往 VoceChat 官网自行选择下载安装:VoceChat 官网

  1. 打开应用输入服务器地址https://talk.zyh1.cc

image-20240308001645443

使用刚刚注册的邮箱和密码登陆。

  1. 找到联系人ChatGPT

image-20240308002027340

image-20240308002119682

之后和它对话即可。

你也可以在频道里面 @ChatGPT,像下面这样

image-20240308011304177

网店搭建

Posted on 2024-03-04

本次网店搭建的项目使用的是dujiaoka

下面逐步描述一下使用docker-compose安装过程

  1. 进入到github中找到docker-compose.yml和env.conf下载到本地

image-20240304135642159

  1. 创建目录如下目录结构

    1
    2
    3
    4
    5
    6
    7
    dujiaoka
    ├── dujiaoka/docker-compose.yml
    ├── dujiaoka/env.conf
    ├── dujiaoka/mysql
    ├── dujiaoka/redis
    ├── dujiaoka/storage
    └── dujiaoka/upload
  2. 修改docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
version: "3"

services:
web:
image: stilleshan/dujiaoka
container_name: dujiaoka
environment:
# - INSTALL=false
- INSTALL=true
# - MODIFY=true
volumes:
- ./env.conf:/dujiaoka/.env
- ./uploads:/dujiaoka/public/uploads
- ./storage:/dujiaoka/storage
ports:
- 56789:80
restart: always

db:
image: mariadb:focal
container_name: dujiaoka_db
restart: always
environment:
- MYSQL_ROOT_PASSWORD=YOUR_PASSWORD
- MYSQL_DATABASE=dujiaoka
- MYSQL_USER=dujiaoka
- MYSQL_PASSWORD=dujiaoka
volumes:
- ./mysql:/var/lib/mysql

redis:
image: redis:alpine
container_name: dujiaoka_redis
restart: always
volumes:
- ./redis:/data

添加container_name

修改 - MYSQL_PASSWORD

  1. 修改env.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
APP_NAME=hoey-shop
APP_ENV=local
APP_KEY=base64:LvuN6MoP5gRmoz+MvyLJKuT89547FyC8SBRsWqGcSLM=
APP_DEBUG=TRUE
APP_URL=http://shop.***.tk

LOG_CHANNEL=stack

# 数据库配置
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=dujiaoka
DB_USERNAME=dujiaoka
DB_PASSWORD=dujiaoka

# redis配置
REDIS_HOST=redis
REDIS_PASSWORD=
REDIS_PORT=6379

BROADCAST_DRIVER=log
SESSION_DRIVER=file
SESSION_LIFETIME=120


# 缓存配置
# file为磁盘文件 redis为内存级别
# redis为内存需要安装好redis服务端并配置
CACHE_DRIVER=redis

# 异步消息队列
# sync为同步 redis为异步
# 使用redis异步需要安装好redis服务端并配置
QUEUE_CONNECTION=redis

# 后台语言
## zh_CN 简体中文
## zh_TW 繁体中文
## en 英文
DUJIAO_ADMIN_LANGUAGE=zh_CN

# 后台登录地址
ADMIN_ROUTE_PREFIX=/admin

# 是否开启https (前端开启了后端也必须为true)
# 后台登录出现0err或者其他登录异常问题,大概率是开启了https而后台没有开启,把下面的false改为true即可
ADMIN_HTTPS=false

其中的APP_UTL自己用自己的域名

修改DB_PASSWORD

  1. 执行docker-compose
1
docker-compose up -d
  1. 访问ip:56789/install进行安装

image-20240304140315291

MySQL 数据库地址: db

MySQL端口: 3306

MySQL数据库名:dujiaoka

MySQL用户名: dujiaoka

MySQL密码: dujiaoka

Redis链接地址: redis

Redis密码: 默认不填写

Redis端口: 6379

网站名称: 自行填写

网站url: 自行填写, 建议买好域名,如果没有填写http://ip:port可以试一下

后台登录路径: /admin

点击安装,并成功安装。

  1. 停止容器
1
docker-compose down

将docker-compose.yml中的INSTALL改为false

将env.conf中的APP_DEBUG改为false

  1. 重新启动容器
1
docker-compose up -d

后端

image-20240304141006194

前端

image-20240304141046406

  1. 集成机器人

到chatwoot.com注册一个账号

配置机器人

a. 在收件箱中添加 New inbox -> Website -> 创建收件箱

image-20240304152836228

b. 开启自定义问候语

image-20240304152909383

c. 禁用自带的邮箱收集功能

image-20240304153019845

d. 使用头像

image-20240304153034687

e. 找到下面的js

image-20240304153128000

f. 将js粘贴在dujiaoka的配置页面

image-20240304153215531

还有一些其他好玩的配置自行探索即可

doris 分区使用

Posted on 2024-02-06

下面是一个简单的小例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
drop table test.t1;
create table test.t1(
dt DATE,
name varchar(32)
) ENGINE=OLAP
DUPLICATE KEY(dt)
PARTITION BY RANGE(dt)()
DISTRIBUTED BY HASH(dt) BUCKETS auto
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.time_zone" = "Asia/Shanghai",
"dynamic_partition.prefix" = "p",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "3",
"is_being_synced" = "false",
"storage_format" = "V2",
"light_schema_change" = "true",
"disable_auto_compaction" = "false",
"enable_single_replica_compaction" = "false"
);


insert into test.t1
select date '2024-02-07' as dt, 'zs' as name ;

-- alter table test.t1 add partition if not exists p20240131 values[('2024-01-31'),('2024-02-01'));
-- TRUNCATE TABLE test.t1 PARTITION(p20240207);
-- show partitions FROM test.t1;
select * from test.t1 where dt = '2024-02-06';

航司运行领域术语

Posted on 2023-11-09

FOC(FLIGHT OPERATION CONTROL)即航空公司主要的航班运行控制系统。

AFTN(Aeronautical Fixed Telecommunication Network)用于民航空管各类工作报文的网络和规范,通常传输有航班的动态信息报文,比如起飞落地报文、天气报文、情报报文、取消报文等等。

SITA 国际电讯协会,和AFTN一样也是民航一种电报规范,主要用于商务报文传输,比如货运、客运报文、离港订座报文等;

ACARS(Aircraft Addressing and Reporting System)地空通信的链路,是飞机在空中和地面进行数字化报文传输主要的方式;

MCC(Maintenance Control Center)工程维修处的一个处室,是AOC值班的重要岗位,是负责每日航班运行的飞机的故障维修保障岗位;

ADSB (Automatic Dependent Surveillance – Broadcast)通过飞机上的机载GPS等系统,获得飞机自身的位置信息,再通过飞机上的通信设备,将飞机自身的位置信息发送出来,地面人员可以利用通信设备,接收到飞机发送出来的这些信息,从而实现对飞机的监视

CDM (Collaborative Decision-Making 协同决策)是空管和航空公司以及机场协同运作的一个终端流量控制系统;俗称,飞机跑道排队系统;

ACDM(Airport Collaborative Decision-Making 机场协同决策)是机场和航空公司协同运作的一个机场协同指挥系统;

GANTT 条状图(Bar chart)。其通过条状图来显示项目,进度,和其他时间相关的系统进展的内在关系随着时间进展的情况;

HORAM (HO吉祥的二字码,RAM RISK ANALYSIS MANAGEMENT)吉祥的航班风险分析管理系统

CI执行率监控 Cost index成本指数,节油中会针对每条特定航线根据经验给出CI指导政策,系统会根据历史数据分析飞行员节油情况和CI对比

EFB (ELECTRIC FLIGHT BAG)电子飞行包,IPAD代替原来的纸箱,里面可以安装各种电子航图、手册、气象APP、性能计算APP等;

HCC (Hub Control Center)吉祥的地面保障系统,主要是场站,虹桥、浦东有关地面保障单位调度的系统;

SMS (Safety Management System)公司安全风险检查系统,涉及公司任何方面的隐患提报以及整改闭环管理

QAR (Quick Access Recorder)就是黑盒子数据,记录了每个飞行航班的飞机的全部抽样参数

SOP(Standard Operation Procedure)标准作业程序,吉祥航空公司的飞行员SOP手册就是飞机标准操作手册;

DataHub元数据管理体验

Posted on 2023-11-08

Datahub

image-20231108174154093

开源地址:https://github.com/datahub-project/datahub

DataHub是由Linkedin开源的,官方Slogan:The Metadata Platform for the Modern Data Stack - 为现代数据栈而生的元数据平台。目的就是为了解决多种多样数据生态系统的元数据管理问题,它提供元数据检索、数据发现、数据监测和数据监管能力,帮助大家解决数据管理的复杂性。

DataHub基于Apache License 2开源,采用基于推送的数据收集架构(当然也支持pull拉取的方式),能够持续收集变化的元数据。当前版本已经集成了大部分流行数据生态系统接入能力,包括但不限于:Kafka, Airflow, MySQL, SQL Server, Postgres, LDAP, Snowflake, Hive, BigQuery。

Datahub的优点:

  • 名门开源,与Kafka同家庭。社区活跃,发展势头迅猛,版本更新迭代迅速。
  • 定位清晰且宏远,Slogan可以看出团队的雄心壮志及后期投入,且不断迭代更新的版本也应证了这一点。
  • 底层架构灵活先进,未扩展集成而生,支持推送和拉去模式,详见:https://datahubproject.io/docs/architecture/architecture/
  • UI界面简单易用,技术人员及业务人员友好
  • 接口丰富,功能全面

Datahub的不足:

  • 前端界面不支持国际化,界面的构建和使用逻辑不够中国化
  • 版更更新迭代快,使用后升级是个难题
  • 较多功能在建设中,例如Hive列级血缘
  • 部分功能性能还需要优化,例如SQL Profile
  • 中文资料不多,中文交流社群也不多

相关介绍:

https://mp.weixin.qq.com/s/74gK3hTt7-j1lTbKFagbTQ
https://mp.weixin.qq.com/s/iP6sc2DzPaeAKpSWNmf8hQ

选型建议:

1)如果有至少半个前端开发人员+后台开发人员;
2)如果需要用户体验较好的数据资产管理平台;
3)如果有需要扩展支持各种平台、系统的元数据。请把Datahub列为最高选择。
尽管列举了一些不足,但是开源产品中Datahub目前是相对最好的选择。笔者也在生产中使用,有问题的可以随时沟通交流。

商用版本: Metaphor(https://metaphor.io/)是Datahub的SaaS版本。

部署及安装

  1. 执行命令
1
2
3
python3 -m pip install --upgrade pip wheel setuptools
python3 -m pip install --upgrade acryl-datahub
datahub version

⚠️注: 在我们执行安装前,可以创建python虚拟环境

  1. 从docker上拉取镜像部署,datahub提供了自动拉取镜像、自动部署节点的脚本,让部署一键操作
1
datahub docker quickstart

⚠️注: 如果你的网络不佳,或者是国内网络,过程会特别的漫长,我就是等了一天才好

成功后terminal中展示:

image-20231108174029522

下面我们登陆:

http://localhost:9002/login?redirect_uri=%2F

user/pass: datahub/datahub

image-20231108174130857

部署细节不懂的,可以参考: https://datahubproject.io/docs/quickstart

下一章我们结合Datahub API + 血缘解析工具,简单说一下怎么构建企业知识图谱

Marquez元数据管理体验

Posted on 2023-11-08

Marquez

image-20231109105214566

开源地址:https://github.com/MarquezProject/marquez

Marquez的优点:

  • 界面美观,操作细节设计比较棒
  • 部署简单,代码简洁
  • 依靠底层OpenLineage协议,结构较好

Marquez的不足:

  • 聚焦数据资产/血缘的可视化,数据资产管理的一些功能,需要较多开发工作

相关介绍:https://mp.weixin.qq.com/s/OMm6QEk9-1bFdYKuimdxCw

安装及体验

  1. 克隆项目
1
git clone git@github-hoey94:hoey94/marquez.git
  1. 到项目根目录运行docker
1
DOCKER_BUILDKIT=1 ./docker/up.sh --seed

image-20231108111436255

  1. 访问页面

image-20231108113044028

  1. 简单实用

创建namespace

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
curl -X POST http://localhost:5000/api/v1/lineage \
-H 'Content-Type: application/json' \
-d '{
"eventType": "START",
"eventTime": "2020-12-28T19:52:00.001+10:00",
"run": {
"runId": "d46e465b-d358-4d32-83d4-df660ff614dd"
},
"job": {
"namespace": "my-namespace",
"name": "my-job"
},
"inputs": [{
"namespace": "my-namespace",
"name": "my-input"
}],
"producer": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client"
}'

创建input和output

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
curl -X POST http://localhost:5000/api/v1/lineage \
-H 'Content-Type: application/json' \
-d '{
"eventType": "COMPLETE",
"eventTime": "2020-12-28T20:52:00.001+10:00",
"run": {
"runId": "d46e465b-d358-4d32-83d4-df660ff614dd"
},
"job": {
"namespace": "my-namespace",
"name": "my-job"
},
"outputs": [{
"namespace": "my-namespace",
"name": "my-output",
"facets": {
"schema": {
"_producer": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client",
"_schemaURL": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/spec/OpenLineage.json#/definitions/SchemaDatasetFacet",
"fields": [
{ "name": "a", "type": "VARCHAR"},
{ "name": "b", "type": "VARCHAR"}
]
}
}
}],
"producer": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client"
}'

更多细节可以参考一下下面文章:https://blog.csdn.net/weixin_43947468/article/details/129593234

ES操作模版

Posted on 2023-11-08

下面是一些ES日常操作,记录下来方便查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
#查看集群的健康情况
GET /_cat/health?v

#查看节点的情况
GET /_cat/nodes?v

#查询各个索引状态
GET /_cat/indices?v

#创建索引
PUT /movie_index

#查看某一个索引的分片情况
GET /_cat/shards/movie_index?v

#删除索引
DELETE /movie_index

#创建文档
PUT /movie_index/movie/1
{ "id":100,
"name":"operation red sea",
"doubanScore":8.5,
"actorList":[
{"id":1,"name":"zhang yi"},
{"id":2,"name":"hai qing"},
{"id":3,"name":"zhang han yu"}
]
}

PUT /movie_index/movie/2
{
"id":200,
"name":"operation meigong river",
"doubanScore":8.0,
"actorList":[
{"id":3,"name":"zhang han yu"}
]
}

PUT /movie_index/movie/3
{
"id":300,
"name":"incident red sea",
"doubanScore":5.0,
"actorList":[
{"id":4,"name":"zhang san feng"}
]
}

#查询某一个索引中的全部文档
GET /movie_index/_search

#根据id查询某一个文档
GET /movie_index/movie/3

#根据文档id,删除某一个文档
DELETE /movie_index/movie/3

POST /_forcemerge

#put 对已经存在的文档进行替换(幂等性)
PUT /movie_index/movie/3
{
"id":300,
"name":"incident red sea",
"doubanScore":5.0,
"actorList":[
{"id":4,"name":"zhang cuishan"}
]
}


#post 进行新增操作,无法保证幂等性
#根据主键保证幂等性
POST /movie_index/movie/
{
"id":300,
"name":"incident red sea",
"doubanScore":5.0,
"actorList":[
{"id":4,"name":"zhang cuishan111"}
]
}


GET /movie_index/_search

GET /movie_index/movie/1

POST /movie_index/movie/1/_update
{
"doc": { "name": "新的字段值" }
}


POST /movie_index/_update_by_query
{
"query": {
"match":{
"actorList.id":1
}
},
"script": {
"lang": "painless",
"source":"for(int i=0;i<ctx._source.actorList.length;i++){if(ctx._source.actorList[i].id==3){ctx._source.actorList[i].name='tttt'}}"
}
}

GET /movie_index/_search

POST /movie_index/_delete_by_query
{
"query": {
"match_all": {}
}
}

#批量添加两个document
POST /movie_index/movie/_bulk
{"index":{"_id":66}}
{"id":300,"name":"incident red sea","doubanScore":5.0,"actorList":[{"id":4,"name":"zhang cuishan"}]}
{"index":{"_id":88}}
{"id":300,"name":"incident red sea","doubanScore":5.0,"actorList":[{"id":4,"name":"zhang cuishan"}]}




POST /movie_index/movie/_bulk
{"update":{"_id":"66"}}
{"doc": { "name": "wudangshanshang" } }
{"delete":{"_id":"88"}}


#------------------查询操作--------------------
#查询出当前索引中的全部数据
GET /movie_index/_search

GET /movie_index/_search?q=_id:66

#查询全部
GET /movie_index/_search
{
"query": {
"match_all": {}
}
}

#根据电影的名称进行查询
GET /movie_index/_search
{
"query": {
"match": {
"name": "operation red sea"
}
}
}

GET /movie_index

#按分词进行查询
GET /movie_index/_search
{
"query": {
"match": {
"actorList.name": "zhang han yu"
}
}
}

#按短语查询 相当于like
GET /movie_index/_search
{
"query": {
"match_phrase": {
"actorList.name": "zhang han yu"
}
}
}

#不分词 通过精准匹配进行查询 term精准匹配
GET /movie_index/_search
{
"query": {
"term": {
"actorList.name.keyword":"zhang han yu"
}
}
}


#容错匹配
GET /movie_index/_search
{
"query": {
"fuzzy": {
"name": "radd"
}
}
}

#先匹配 再过滤
GET /movie_index/_search
{
"query": {
"match": {
"name": "red"
}
},
"post_filter": {
"term": {
"actorList.id": "3"
}
}
}


#匹配和过滤同时
GET /movie_index/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "red"
}
}
],
"filter": {
"term": {
"actorList.id": "3"
}
}
}
}
}

#范围过滤 ,将豆瓣评分在6到9的文档查询出来
GET /movie_index/_search
{
"query": {
"range": {
"doubanScore": {
"gte": 6,
"lte": 9
}
}
}
}


#按照豆瓣评分降序排序
GET /movie_index/_search
{
"query": {
"match": {
"name": "red"
}
},
"sort": [
{
"doubanScore": {
"order": "asc"
}
}
]
}

#分页查询
GET /movie_index/_search
{
"from": 0,
"size": 2
}

#查询指定字段
GET /movie_index/_search
{
"_source": ["name", "doubanScore"]
}

#高亮显示
GET /movie_index/_search
{
"query": {
"match": {
"name": "red"
}
},
"highlight": {
"fields": {"name":{} },
"pre_tags": "<a>",
"post_tags": "</a>"
}
}


#需求1:取出每个演员共参演了多少部电影
#aggs 聚合
#term 精准匹配
#terms 聚合操作,相当于groupBy
GET /movie_index/_search
{
"aggs": {
"myAggs": {
"terms": {
"field": "actorList.name.keyword",
"size": 10
}
}
}
}

#需求2:每个演员参演电影的平均分是多少,并按评分排序

GET /movie_index/_search
{
"aggs": {
"groupByName": {
"terms": {
"field": "actorList.name.keyword",
"size": 10,
"order": {
"avg_score": "asc"
}
},
"aggs": {
"avg_score": {
"avg": {
"field": "doubanScore"
}
}
}
}
}
}


#分词
#英文默认分词规则
GET /_analyze
{
"text": "hello world"
}

#中文默认分词规则
GET /_analyze
{
"text": "蓝瘦香菇",
"analyzer": "ik_smart"
}

GET /_analyze
{
"text": "蓝瘦香菇",
"analyzer": "ik_max_word"
}


GET /movie_index



#自动定义mapping
PUT /movie_chn_1/movie/1
{ "id":1,
"name":"红海行动",
"doubanScore":8.5,
"actorList":[
{"id":1,"name":"张译"},
{"id":2,"name":"海清"},
{"id":3,"name":"张涵予"}
]
}
PUT /movie_chn_1/movie/2
{
"id":2,
"name":"湄公河行动",
"doubanScore":8.0,
"actorList":[
{"id":3,"name":"张涵予"}
]
}

PUT /movie_chn_1/movie/3
{
"id":3,
"name":"红海事件",
"doubanScore":5.0,
"actorList":[
{"id":4,"name":"张三丰"}
]
}

GET /movie_chn_1/_search
{
"query": {
"match": {
"name": "海行"
}
}
}

GET /movie_chn_1/_mapping


#自定义mapping
DELETE movie_chn_2

PUT movie_chn_2
{
"mappings": {
"movie":{
"properties": {
"id":{
"type": "long"
},
"name":{
"type": "keyword"
},
"doubanScore":{
"type": "double"
},
"actorList":{
"properties": {
"id":{
"type":"long"
},
"name":{
"type":"keyword"
}
}
}
}
}
}
}


PUT /movie_chn_2/movie/1
{ "id":1,
"name":"红海行动",
"doubanScore":8.5,
"actorList":[
{"id":1,"name":"张译"},
{"id":2,"name":"海清"},
{"id":3,"name":"张涵予"}
]
}
PUT /movie_chn_2/movie/2
{
"id":2,
"name":"湄公河行动",
"doubanScore":8.0,
"actorList":[
{"id":3,"name":"张涵予"}
]
}

PUT /movie_chn_2/movie/3
{
"id":3,
"name":"红海事件",
"doubanScore":5.0,
"actorList":[
{"id":4,"name":"张三丰"}
]
}

GET /movie_chn_2/_mapping

GET /movie_chn_2/_search
{
"query": {
"match": {
"name": "海行"
}
}
}

POST /_reindex
{
"source": {}
, "dest": {}
}

#创建索引 并指定别名
PUT movie_chn_3
{
"aliases": {
"movie_chn_3_aliase": {}
},
"mappings": {
"movie":{
"properties": {
"id":{
"type": "long"
},
"name":{
"type": "text",
"analyzer": "ik_smart"
},
"doubanScore":{
"type": "double"
},
"actorList":{
"properties": {
"id":{
"type":"long"
},
"name":{
"type":"keyword"
}
}
}
}
}
}
}


GET /_cat/indices



GET /_cat/aliases


POST /_aliases
{
"actions": [
{
"add": {
"index": "movie_chn_3",
"alias": "movie_chn_3_a2"
}
}
]
}


GET /movie_chn_3/_search

GET /movie_chn_3_a2/_search

GET /_cat/aliases

POST /_aliases
{
"actions": [
{
"remove": {"index": "movie_chn_3","alias": "movie_chn_3_a2"}
}
]
}


GET /movie_chn_1/_search

GET /movie_chn_2/_search



POST _aliases
{
"actions": [
{ "add": { "index": "movie_chn_1", "alias": "movie_chn_query" }},
{ "add": { "index": "movie_chn_2", "alias": "movie_chn_query" }}
]
}


GET /movie_chn_query/_search


POST _aliases
{
"actions": [
{
"add":
{
"index": "movie_chn_1",
"alias": "movie_chn_1_sub_query",
"filter": {
"term": { "actorList.id": "4"}
}
}
}
]
}

GET /movie_chn_1_sub_query/_search


POST /_aliases
{
"actions": [
{ "remove": { "index": "movie_chn_1", "alias": "movie_chn_query" }},
{ "remove": { "index": "movie_chn_2", "alias": "movie_chn_query" }},
{ "add": { "index": "movie_chn_3", "alias": "movie_chn_query" }}
]
}


#创建模板
PUT _template/template_movie0523
{
"index_patterns": ["movie_test*"],
"settings": {
"number_of_shards": 1
},
"aliases" : {
"{index}-query": {},
"movie_test-query":{}
},
"mappings": {
"_doc": {
"properties": {
"id": {
"type": "keyword"
},
"movie_name": {
"type": "text",
"analyzer": "ik_smart"
}
}
}
}
}

POST movie_test_202010/_doc
{
"id":"333",
"name":"zhang3"
}

GET /movie_test_202010-query/_mapping


GET /_cat/templates

GET /_template/template_movie*

Flink Timer定时器

Posted on 2023-07-24

在使用processFunction实现两张事实表的JOIN操作时,接触到了Timer,下面对Flink定时器的核心知识做一个简单总结:

1.1 Timers支持使用在KeyedStream

因为 Timer 是基于每个键即 key 注册并触发,所以 KeyedStream 是 Timer 在 Flink 中使用的先决条件

1
ctx.timerService.deleteEventTimeTimer(timeStamp)

1.2 Timers的唯一性

TimerService 会自动消除计时器的重复数据,始终保持每个键 key 最多只有一个计时器,当一个键 key 注册多个 Timer 计时器时,onTimer 方法只会调用一次,重复注册会覆盖之前的 timer 注册

1.3 Timers支持checkpoint

ValueState 可以通过 checkpoint 进行检查点保存和恢复,同理 Timer 也可以由 checkpoint 托管,从 Flink checkpoint 检查点恢复任务时,将立即启动恢复前应启动的处于恢复状态的每个已注册计时器,这也提高了 Timer 的容错性

1.4 Timers支持被删除

从 Flink 1.6.x 开始,计时器可以暂停和删除,提供更便捷的 Timer 处理方式

文章发布自:[Flink Timer 与 TimerService 源码分析与详解](https://it.cha138.com/ios/show-36808.html#2.1 注册 Timer)

写的十分好,推荐阅读,除此之外推荐阅读:

Flink Timer 机制原理,源码整理

Flink的定时器EventTime和ProcessTime

Flink使用CoProcessFunction完成实时对账、基于时间的双流join_flink实时对账

<1…3456>

54 posts
© 2025 Hoey