Alink 快速使用 WebUI

MacOS M1 上,使用 Docker 构建快速使用和开发 Alink 的相关镜像,启动 Alink 的 server、web、notebook以及数据库服务等,可以在 web 界面上进行 Alink 相关功能的使用。
Alink 提供的 Web UI 工具,可以理解成是 AIStudio 的简易操作版,供学习使用。

快速上手

  1. 参考 https://docs.docker.com/get-docker/ 安装 Docker;

  2. 参考 https://umijs.org/zh-CN/docs/getting-started 准备好 node 和 yarn;

  3. 克隆 Alink 代码:

    1
    2
    git clone https://github.com/alibaba/Alink.git
    cd Alink
  4. 下载 shade 后的 Alink 包到 webui/tools/flink-with-alink-jar/

    1
    wget https://alink-release.oss-cn-beijing.aliyuncs.com/v1.5.0/alink_core_flink-1.9_2.11-1.5.0.jar -P webui/tools/flink-with-alink-jar/
  5. 进入到目录 webui/web/,执行 yarn:

    1
    2
    cd webui/web/
    yarn
  6. 进入到目录 webui/tools/,执行 sh build-image.sh,等待编译 docker 镜像;
    M1 芯片由于底层架构的问题:

  • 需要使用 linux/x86_64 平台的 mysql 镜像,在 webui/tools/docker-compose/alink/docker-compose.yml 的第 41 行前增加一行 platform: linux/x86_64

  • 需要使用 linux/x86_64 平台的 flink 镜像,修改 webui/tools/flink-with-alink-jar/Dockerfile 的第一行,修改后为:FROM --platform=linux/x86_64 flink:1.9.2-scala_2.11

    1
    2
    cd ../tools
    sh build-image.sh
  1. 编译成功后,进入到目录 webui/tools/docker-compose/alink/nfs/,执行 docker-compose up -d,这将启动一个 NFS 服务;

    1
    2
    cd docker-compose/alink/nfs/
    docker-compose up -d
  2. 进入到目录 webui/tools/docker-compose/alink,执行 docker-compose up -d,这将启动 Alink 的 server、web、notebook以及数据库等服务;

    1
    2
    cd ..
    docker-compose up -d
  3. 在浏览器打开 localhost:9090,就能开始使用了。

开发步骤

单启 Web

  1. 设置环境变量:

    1
    2
    vim etc/profile
    export WEB_CONTAINER_ID=$(docker ps -a -q --filter="name=alink_web")
  2. 将在快速上手中启动的 Web 服务杀掉:

    1
    docker kill $WEB_CONTAINER_ID && docker rm $WEB_CONTAINER_ID
  3. 通过代码启动 Web 服务:

    1
    2
    cd webui/web/
    yarn start
  4. 在浏览器打开 localhost:8000,可以实时预览 Web 代码的修改。

单启 Server

  1. 设置环境变量:

    1
    2
    vim etc/profile
    export SERVER_CONTAINER_ID=$(docker ps -a -q --filter="name=alink_server")
  2. 将在快速上手中启动的 Server 服务杀掉:

    1
    docker kill $SERVER_CONTAINER_ID && docker rm $SERVER_CONTAINER_ID
  3. 使用 Intellij IDEA 等工具打开 Server 部分的代码 webui/server/,启动 com.alibaba.alink.server.ServerApplication 类。

  • 修改 application.properties 配置文件,配置信息从 webui/tools/docker-compose/alink/docker-compose.yml 文件中获取:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    spring.datasource.driverClassName=com.mysql.jdbc.Driver
    spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
    spring.jpa.hibernate.ddl-auto: update
    #spring.datasource.url=${SPRING_DATASOURCE_URL}
    #spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
    #spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}
    #域名修改为 localhost
    spring.datasource.url=jdbc:mysql://localhost:3306/alink?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
    spring.datasource.username=alinkalink
    spring.datasource.password=alinkalink

    alink.execution.type=remote
    #alink.execution.remote-cluster-host=${ALINK_REMOTE_CLUSTER_HOST}
    #alink.execution.remote-cluster-port=${ALINK_REMOTE_CLUSTER_PORT}
    #alink.execution.remote-cluster-host=flink-jobmanager
    #域名修改为 localhost
    alink.execution.remote-cluster-host=localhost
    alink.execution.remote-cluster-port=8081

1
2
3
4
5
<dependency>
<groupId>com.alibaba.alink</groupId>
<artifactId>alink_core_flink-1.9_2.11</artifactId>
<version>1.5.2</version>
</dependency>

流程操作示例

csv -> Kafka

附录

webui/tools/docker-compose/alink/docker-compose.yml 启动文件,包括 Alink 的 server、web、notebook以及数据库服务等:

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
# Docker Compose file Reference (https://docs.docker.com/compose/compose-file/)
# Refs: https://www.alinkalink.com/spring-boot-mysql-react-docker-compose-example/

version: '3.7'

# Define services
services:
# App backend service
server:
image: alink_server:v0.1
ports:
- "8080:8080" # Forward the exposed port 8080 on the container to port 8080 on the host machine
restart: always
environment:
ALINK_REMOTE_CLUSTER_HOST: flink-jobmanager
ALINK_REMOTE_CLUSTER_PORT: 8081
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/alink?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
SPRING_DATASOURCE_USERNAME: alinkalink
SPRING_DATASOURCE_PASSWORD: alinkalink
volumes:
- shared-data:/alink
depends_on:
- db # This service depends on mysql. Start that first.
networks: # Networks to join (Services on the same network can communicate with each other using their name)
- backend
- frontend

# Frontend Service
web:
image: alink_web:v0.1
ports:
- "9090:9090" # Map the exposed port 80 on the container to port 9090 on the host machine
restart: always
depends_on:
- server
networks:
- frontend

# Database Service (Mysql)
db:
platform: linux/x86_64
image: mysql:5.7
ports:
- "3306:3306"
restart: always
environment:
MYSQL_DATABASE: alink
MYSQL_USER: alinkalink
MYSQL_PASSWORD: alinkalink
MYSQL_ROOT_PASSWORD: root
volumes:
- db-data:/var/lib/mysql
networks:
- backend

flink-jobmanager:
image: flink_with_alink_jar:v0.1
ports:
- "8081:8081"
restart: always
networks:
- backend
- flink
environment:
FLINK_PROPERTIES: |-
jobmanager.rpc.address: flink-jobmanager
jobmanager.heap.size: 2048m
taskmanager.heap.size: 2048m
classloader.resolve-order: parent-first
taskmanager.memory.preallocate: true
taskmanager.memory.off-heap: true
taskmanager.memory.fraction: 0.3f
akka.ask.timeout: 60s
akka.client.timeout: 120s
volumes:
- shared-data:/alink
command: jobmanager

flink-taskmanager:
image: flink_with_alink_jar:v0.1
depends_on:
- flink-jobmanager
networks:
- flink
environment:
FLINK_PROPERTIES: |-
jobmanager.rpc.address: flink-jobmanager
taskmanager.numberOfTaskSlots: 1
jobmanager.heap.size: 2048m
taskmanager.heap.size: 2048m
classloader.resolve-order: parent-first
taskmanager.memory.preallocate: true
taskmanager.memory.off-heap: true
taskmanager.memory.fraction: 0.3f
akka.ask.timeout: 60s
akka.client.timeout: 120s
volumes:
- shared-data:/alink
command: taskmanager
deploy:
replicas: 2

notebook:
image: alink_notebook:v0.1
ports:
- "8888:8888"
networks:
- backend
volumes:
- notebook-data:/home/jovyan/
- shared-data:/alink
command: "start-notebook.sh --NotebookApp.token='' --NotebookApp.password=''"

# Volumes
volumes:
db-data:
notebook-data:
shared-data:
driver: local
driver_opts:
type: nfs
o: nfsvers=4,addr=localhost,rw
device: ":/"

# Networks to be created to facilitate communication between containers
networks:
backend:
frontend:
flink: