0%

  • 语法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT [column_list]

    FROM (

    SELECT [column_list],

    ROW_NUMBER() OVER ([PARTITION BY col1[, col2...]]

    ORDER BY col1 [asc|desc][, col2 [asc|desc]...]) AS rownum

    FROM table_name)

    WHERE rownum <= N [AND conditions]
    参数 说明
    ROW_NUMBER() 计算行号的OVER窗口函数。行号从1开始计算。
    PARTITION BY col1[, col2..] 可选。指定分区的列,即去重的KEYS。
    ORDER BY timeAttributeCol asc desc 指定排序的列,必须是一个的字段(即Proctime或Rowtime)。可以指定顺序(Keep FirstRow)或者倒序 (Keep LastRow)。
    rownum 外层查询中对排名进行过滤,只取前N条
    • Deduplicate Keep FirstRow保留首行的去重策略:保留KEY下第一条出现的数据,之后出现该KEY下的数据会被丢弃掉。因为STATE中只存储了KEY数据,所以性能较优。
    • Deduplicate Keep LastRow保留末行的去重策略:保留KEY下最后一条出现的数据。因此过程中会产生变更的记录,会向下游发送变更的消息。因此,sink表需要支持retract操作。

在 Deduplication 关于是否会出现回撤流

  1. ⭐ Order by 事件时间 DESC:会出现回撤流,因为当前 key 下 可能会有 比当前事件时间还大的数据
  2. ⭐ Order by 事件时间 ASC:会出现回撤流,因为当前 key 下 可能会有 比当前事件时间还小的数据
  3. ⭐ Order by 处理时间 DESC:会出现回撤流,因为当前 key 下 可能会有 比当前处理时间还大的数据
  4. ⭐ Order by 处理时间 ASC:不会出现回撤流,因为当前 key 下 不可能会有 比当前处理时间还小的数据

reference

https://www.modb.pro/db/232004

虚拟环境

项目粒度:python -m venv venv
poetry
系统粒度:pyenv
conda

指令

  • 安装tar.gz,解压之后,执行

    1
    python3 setup.py install

pip

  • 国内镜像

    1
    2
    pip config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple
    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
  • 安装子模块

    1
    pip install 'fastapi_amis_admin[cli]'  # 注意引号
  • 查看指定依赖版本

    1
    pip show package_name
  • 把项目的依赖放入指定文件

    1
    pip freeze > requirements.txt
  • 清除缓存

    1
    python -m pip cache purge

Buildins

  • 装饰器 staticmethod 用于定义与类或实例无关的函数,而 classmethod 用于定义需要访问类或类变量的函数。

信创

  • 安装python3-devel

    1
    dnf install python3-devel

规范

  • 请选择四个空格的缩进,不要使用 Tab,更不要 Tab 和空格混着用。

  • 全局的类和函数的上方需要空两个空行,而类的函数之间需要空一个空行

  • 代码的尾部,每个代码文件的最后一行为空行,并且只有这一个空行。

  • 可以使用#进行单独注释,请记得要在#后、注释前加一个空格。

  • 对于操作符,例如+-*/&|===!=,请在两边都保留空格。不过与此对应,括号内的两端并不需要空格。

  • 采用 from module import func 这样的语句,请确保 func 在本文件中不会出现命名冲突。不过,你其实可以通过 from module import func as new_func 来进行重命名,从而避免冲突。

  • 如果是类的私有变量,请记得前面增加两个下划线。

  • 对于常量,最好的做法是全部大写,并通过下划线连接

  • 对于函数名,同样也请使用小写的方式,通过下划线连接起来,例如:launch_nuclear_missile()check_input_validation()

  • 对于类名,则应该首字母大写,然后合并起来,例如:class SpatialDropout2D()class FeatureSet()

安装部署

注意项

  • 安装前配置环境变量

    1
    export STARROCKS_HOME=xxx
  • 启动mysql客户端

    1
    mysql -h <fe_ip> -P<fe_query_port> -uroot -p # 密码为空,直接回车即可

FE

1
2
3
4
5
6
7
8
9
netstat -tunlp | grep 18030
netstat -tunlp | grep 19010
netstat -tunlp | grep 19020
netstat -tunlp | grep 19030

http_port = 18030
rpc_port = 19020
query_port = 19030
edit_log_port = 19010
  • 启动FE
    start_fe.sh --daemon

  • 查看FE状态+
    SHOW PROC '/frontends'\G

  • 添加新FE节点(follow和observer)
    ./start_fe.sh --helper 172.18.244.74:19010 --daemon

    注意:

    • 在mysql command先将实例添加进集群,然后逐个启动实例。(只在首次新增节点时操作)

    • 各个节点的时间一定要同步,不然FE的心跳超过5s时差,就会报错

  • 扩容FE
    ALTER SYSTEM ADD FOLLOWER 'ip:19010';
    ALTER SYSTEM ADD observer 'ip:19010';

  • 缩容FE
    ALTER SYSTEM DROP follower "ip:19010";
    ALTER SYSTEM DROP observer "ip:19010";


BE

1
2
3
4
5
6
7
8
9
netstat -tunlp | grep 19060
netstat -tunlp | grep 18040
netstat -tunlp | grep 19050
netstat -tunlp | grep 18060

be_port = 19060
be_http_port = 18040
heartbeat_service_port = 19050
brpc_port = 18060
  • 查看BE状态
    SHOW PROC '/backends'\G

  • 启动BE
    ./start_be.sh --daemon

  • 添加BE节点
    ALTER SYSTEM ADD BACKEND "172.18.244.74:19050";

  • 缩容BE节点
    ALTER SYSTEM DECOMMISSION BACKEND "172.18.244.74:19050";
    等待该节点BE从列表中消失(查看命令SHOW PROC ‘/backends’;),即可使用./stop_be.sh停掉服务

  • 崩溃排查日志be.out


配置修改

  • FE修改端口信息,需要清理meta
1
2
3
4
1. 重建meta目录
2. 重启主节点FE
3. 登录mysql command,添加新FE节点(follow和observer),添加BE节点
4. 启动follower和observer节点
  • BE修改端口信息,需要清理storage
1
2
3
1. 重建storage目录(是否可以修改cluster_id进行集群处理)
2. 逐个启动BE服务
3. 登录mysql command,添加新BE节点(ALTER SYSTEM ADD BACKEND "ip:19050";)
  • 修改密码
    SET PASSWORD = PASSWORD('datacanvas')

TIPS

  • 节点时间需要同步(延迟需要在5秒内),不然starrocks无法扩容FE节点

CPU

  • ARM架构

​ 飞腾CPU、鲲鹏CPU

  • X86架构

​ 海光CPU(与AMD合作)

​ 兆芯、龙芯、申威

实践一: 查看进程参数

查看服务设置的jvm

jps -v

查看服务jvm的默认参数

jinfo -flags PID

  • 参考kafka服务的运行参数

    1
    2
    3
    4
    5
    -server
    -XX:+UseG1GC
    -XX:MaxGCPauseMillis=20
    -XX:InitiatingHeapOccupancyPercent=35
    -XX:+ExplicitGCInvokesConcurrent

    -XX:MaxGCPauseMillis=200

    为所需的最长暂停时间设置目标值。默认值是 200 毫秒。这个数值是一个软目标,也就是说JVM会尽一切能力满足这个暂停要求,但是不能保证每次暂停一定在这个要求之内。

    根据测试发现,如果我们将这个值设定成50毫秒或者更低的话,JVM为了达到这个要求会将年轻代内存空间设定的非常小,从而导致youngGC的频率大大增高。所以我们并不设定这个参数。

    -XX:InitiatingHeapOccupancyPercent=45

    设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%。就是说当使用内存占到堆总大小的45%的时候,G1将开始并发标记阶段。为混合GC做准备,这个数值在测试的时候我想让混合GC晚一些处理所以设定成了70%,经过观察发现如果这个数值设定过大会导致JVM无法启动并发标记,直接进行FullGC处理。

    G1的FullGC是单线程,一个22G的对GC完成需要8S的时间,所以这个值在调优的时候写的45%

之前查看ignite,12秒回收了71G

实践二:查看进程加载的类

jcmd命令要使用启动目标进程的用户执行

  1. 使用dump内存信息到heap.bin文件
    使用命令jmap -dump:live,format=b,file=heap.bin pid(进程号)将进程pid的堆栈信息输出到heap.bin文件中

  2. 使用jhat 对heap.bin 文件进行分析
    命令jhat -J-mx512m heap.bin, 如果解析过程中出现内存不足,需要加大内存如:jhat -J-mx800m heap.bin

  3. 通过浏览器访问 http://ip:7000/即可看到分析结果。点击每个类,可以查看详细信息,包括该类是被哪个类加载器加载。

DB2

DB2 SQL Error: SQLCODE=-805, SQLSTATE=51002, SQLERRMC=NULLID.SYSLH2DA 0X5359534C564C3031

日志

lambda是否可打日志

静态编译:编译时就把所有用到的Java代码全都编译成字节码,是一次性编译。

动态编译:在Java程序运行时才把需要的Java代码的编译成字节码,是按需编译。

从JDK1.6开始,引入了Java代码重写过的编译器接口,使得我们可以在运行时编译Java源代码,然后再通过类加载器将编译好的类加载进JVM,这种在运行时编译代码的操作就叫做动态编译。


【Java动态编译】动态编译的应用_牛客博客

Java动态性(1) - 动态编译(DynamicCompile)

节点 端口号 协议 使用 说明
zookeeper 2181 zkCli.sh -server zookeeper1:2181 客户端接入
2888,3888 N/A 集群内部通讯
HDFS Namenode 9000 HDFS hdfs dfs -ls hdfs://namenode1:9000/ 客户端接入
50070 HTTP http://namenode1:50070/ 集群监控
HDFS SecondaryNamenode 50090 HTTP http://namenode1:50090/ secondary监控
HDFS Datanode 50010 N/A 客户端接入/其他节点接入
50020 N/A
50075 HTTP http://datanode1:50075/ 节点监控
HBase Master 16000 hbase-client-1.x.x.jar RegionServer接入
16010 HTTP http://namenode1:16010/ 集群监控
HBase RegionServer 16020 N/A 客户端接入
16030 HTTP http://datanode1:16030/ 节点监控

目录结构

  • flink-annotations: Flink自定义的一些注解,用于配置、控制编译等功能。
  • flink-clients: Flink客户端,用于向Flink集群提交任务、查询状态等。其中org.apache.flink.client.cli.CliFrontend就是执行./flink run的入口。
  • flink-connectors: Flink连接器,相当于Flink读写外部系统的客户端。这些连接器指定了外部存储如何作为Flink的source或sink。例如对于kafka来说,flink-connector-kafka-xx定义了FlinkKafkaConsumer和FlinkKafkaProducer类分别作为Flink的source和sink,实现了对kafka消费和生产的功能。从图二可以看出,flink 1.9目前支持的外部存储有Cassandra、ES、Kafka、Hive等一些开源外部存储。
  • flink-container: Flink对docker和kubernetes的支持。
  • flink-contrib: 社区开发者提供的一些新特性。
  • flink-core: Flink核心的API、类型的定义,包括底层的算子、状态、时间的实现,是Flink最重要的部分。Flink内部的各种参数配置也都定义在这个模块的configuration中。(这部分代码还没怎么看过,就不细讲了)。
  • flink-dist: Flink编译好之后的jar包会放在这个文件夹下,也就是网上下载的可执行的版本。其中也包括集群启动、终止的脚本,集群的配置文件等。
  • flink-docs: 这个模块并不是Flink的文档,而是Flink文档生成的代码。其中org.apache.flink.docs.configuration.ConfigOptionsDocGenerator是配置文档的生成器,修改相关配置的key或者默认值,重新运行这个类就会更新doc文件夹下的html文件。同样org.apache.flink.docs.rest.RestAPIDocGenerator是Flink RestAPI文档的生成器。
  • flink-fliesystems: Flink对各种文件系统的支持,包括HDFS、Azure、AWS S3、阿里云OSS等分布式文件系统。
  • flink-formats: Flink对各种格式的数据输入输出的支持。包括Json、CSV、Avro等常用的格式。
  • flink-java: Flink java的API,就是写flink应用时用到的map、window、keyBy、State等类或函数的实现。
  • flink-jepsen: 对Flink分布式系统正确性的测试,主要验证Flink的容错机制。
  • flink-libraries: Flink的高级API,包括CEP(复杂事件处理)、Gelly图处理库等。
  • flink-mesos: Flink对mesos集群管理的支持。
  • flink-metrics: Flink监控上报。支持上报到influxdb、prometheus等监控系统。具体的使用配置可以在flink-core模块的org.apache.flink.configuration.MetricOptions中找到。
  • flink-python: Flink对python的支持,目前还比较弱。
  • flink-queryable-state: Flink对可查询状态的支持,其中flink-queryable-state-runtime子模块实现了StateClientProxy和StateServer。这两部分都运行在TaskManager上,StateClientProxy负责接收外部请求,StateServe负责管理内部的queryable state。flink-queryable-state-client-java子模块实现了QueryableStateClient,作为外部系统访问queryable state的客户端。
  • flink-runtime: flink运行时核心代码,在第二节细说。
  • flink-runtime-web: Flink Web Dashboard的实现。默认启动standalone集群后,访问http://localhost:8081 出现的界面。
  • flink-scala: Flink scala的API。
  • flink-scala-shell: Flink提供的scala命令行交互接口。
  • flink-state-backends: flink状态存储的方式,目前这个模块中只有RocksDBStateBackend,未来可能会支持更多种的状态存储,以适应不同的业务场景。MemoryStateBackend和FsStateBackend的实现并不在这个目录下,而是在flink-runtime目录下。
  • flink-streaming-java: Flink Streaming的java API。
  • flink-streaming-scala: Flink Streaming的scala API。
  • flink-table: Flink Table API,在第三小节中细说。
  • flink-yarn: Flink对yarn集群管理的支持。

  • flink-runtime模块是Flink最核心的模块之一,实现了Flink的运行时框架,如JobManager、TaskManager、ResourceManager、Scheduler、Checkpoint Coordinator

  • flink-table模块属于Flink的上层API,包括java和scala版本的table-api,以及SQL的解析和SQL的执行。

    随着Flink SQL越来越受重视,flink-table从flink-libraries中移了出来,成为了独立的一级目录。Flink 1.9中,阿里把blink-planner开源了出来,这样整个flink-table中就有了2个planner。从长期来看,流批的统一是一个趋势,因此blink-planner只使用了StreamTableEnvironment中相关的API,而没有使用BatchTableEnvironment,将批当做一个有限的流来处理,希望通过这种方式实现流和批的统一。由于blink-table-planner更好的支持流批统一,且性能更好,在未来的版本中,很有可能完全替代flink-table-planner的功能,而flink-table-planner可能将会被移除。