使用 Docker-Compose 快速上手
前提条件
启动 HStream 需要一个内核版本不小于 Linux 4.14 的操作系统。
安装
安装 docker
提示
如果您已经有一安装好的 Docker,可以跳过这一步
浏览查阅 Install Docker Engine
(opens new window),然后 安装到您的操作系统上。安装时,请注意检查您的设备是否满足所有的前置条件。
确认 Docker daemon 正在运行:
1. docker version
提示
在 Linux,Docker 需要 root 权限。当然,你也可以以非 root 用户的方式运行 Docker,详情可以参考 Post-installation steps for Linux
(opens new window)。
安装 docker-compose
提示
如果您已经有一安装好的 Docker Compose,可以跳过这一步
浏览查阅 Install Docker Compose
(opens new window),然 后安装到您的操作系统上。安装时,请注意检查您的设备是否满足所有的前置条件。
1. docker-compose -v
启动 HStreamDB 服务
注意
请不要在生产环境中使用以下配置
创建一个 quick-start.yaml, 可以直接下载
(opens new window)或者复制以下内容:
1. # quick-start.yaml
3. version: "3.5"
5. services:
6. hserver0:
7. image: hstreamdb/hstream:v0.11.0
8. depends_on:
9. - zookeeper
10. - hstore
11. ports:
12. - "127.0.0.1:6570:6570"
13. expose:
14. - 6570
15. networks:
16. - hstream-quickstart
17. volumes:
18. - /var/run/docker.sock:/var/run/docker.sock
19. - /tmp:/tmp
20. - data_store:/data/store
21. command:
22. - bash
23. - "-c"
24. - |
25. set -e
26. /usr/local/script/wait-for-storage.sh hstore 6440 zookeeper 2181 600 \
27. /usr/local/bin/hstream-server \
28. --bind-address 0.0.0.0 --port 6570 \
29. --internal-port 6571 \
30. --server-id 100 \
31. --seed-nodes "$$(hostname -I | awk '{print $$1}'):6571,hserver1:6573" \
32. --advertised-address $$(hostname -I | awk '{print $$1}') \
33. --metastore-uri zk://zookeeper:2181 \
34. --store-config /data/store/logdevice.conf \
35. --store-admin-host hstore --store-admin-port 6440 \
36. --io-tasks-path /tmp/io/tasks \
37. --io-tasks-network hstream-quickstart
39. hserver1:
40. image: hstreamdb/hstream:v0.11.0
41. depends_on:
42. - zookeeper
43. - hstore
44. ports:
45. - "127.0.0.1:6572:6572"
46. expose:
47. - 6572
48. networks:
49. - hstream-quickstart
50. volumes:
51. - /var/run/docker.sock:/var/run/docker.sock
52. - /tmp:/tmp
53. - data_store:/data/store
54. command:
55. - bash
56. - "-c"
57. - |
58. set -e
59. /usr/local/script/wait-for-storage.sh hstore 6440 zookeeper 2181 600 \
60. /usr/local/bin/hstream-server \
61. --bind-address 0.0.0.0 --port 6572 \
62. --internal-port 6573 \
63. --server-id 101 \
64. --seed-nodes "hserver0:6571,$$(hostname -I | awk '{print $$1}'):6573" \
65. --advertised-address $$(hostname -I | awk '{print $$1}') \
66. --metastore-uri zk://zookeeper:2181 \
67. --store-config /data/store/logdevice.conf \
68. --store-admin-host hstore --store-admin-port 6440 \
69. --io-tasks-path /tmp/io/tasks \
70. --io-tasks-network hstream-quickstart
72. hserver-init:
73. image: hstreamdb/hstream:v0.11.0
74. depends_on:
75. - hserver0
76. - hserver1
77. networks:
78. - hstream-quickstart
79. command:
80. - bash
81. - "-c"
82. - |
83. timeout=120
84. until ( \
85. /usr/local/bin/hadmin server --host hserver0 --port 6570 status && \
86. /usr/local/bin/hadmin server --host hserver1 --port 6572 status \
87. ) >/dev/null 2>&1; do
88. >&2 echo 'Waiting for servers ...'
89. sleep 1
90. timeout=$$((timeout - 1))
91. [ $$timeout -le 0 ] && echo 'Timeout!' && exit 1;
92. done; \
93. /usr/local/bin/hadmin server --host hserver0 init
95. hstore:
96. image: hstreamdb/hstream:v0.11.0
97. networks:
98. - hstream-quickstart
99. volumes:
100. - data_store:/data/store
101. command:
102. - bash
103. - "-c"
104. - |
105. set -ex
106. /usr/local/bin/ld-dev-cluster --root /data/store \
107. --use-tcp --tcp-host $$(hostname -I | awk '{print $$1}') \
108. --user-admin-port 6440 \
109. --no-interactive
111. zookeeper:
112. image: zookeeper
113. expose:
114. - 2181
115. networks:
116. - hstream-quickstart
117. volumes:
118. - data_zk_data:/data
119. - data_zk_datalog:/datalog
121. networks:
122. hstream-quickstart:
123. name: hstream-quickstart
125. volumes:
126. data_store:
127. name: quickstart_data_store
128. data_zk_data:
129. name: quickstart_data_zk_data
130. data_zk_datalog:
131. name: quickstart_data_zk_datalog
在同一个文件夹中运行:
1. docker-compose -f quick-start.yaml up
如果出现如下信息,表明现在已经有了一个运行中的 HServer:
1. hserver_1 | [INFO][2021-11-22T09:15:18+0000][app/server.hs:137:3][thread#67]************************
2. hserver_1 | [INFO][2021-11-22T09:15:18+0000][app/server.hs:145:3][thread#67]Server started on port 6570
3. hserver_1 | [INFO][2021-11-22T09:15:18+0000][app/server.hs:146:3][thread#67]*************************
提示
当然,你也可以选择在后台启动
1. docker-compose -f quick-start.yaml up -d
并且可以通过以下命令展示 logs :
1. docker-compose -f quick-start.yaml logs -f hserver
启动 HStreamDB 的 SQL 命令行界面
1. docker run -it --rm --name some-hstream-cli --network host hstreamdb/hstream:v0.11.0 hstream --port 6570 sql
如果所有的步骤都正确运行,您将会进入到命令行界面,并且能看见一下帮助信息:
1. __ _________________ _________ __ ___
2. / / / / ___/_ __/ __ \/ ____/ | / |/ /
3. / /_/ /\__ \ / / / /_/ / __/ / /| | / /|_/ /
4. / __ /___/ // / / _, _/ /___/ ___ |/ / / /
5. /_/ /_//____//_/ /_/ |_/_____/_/ |_/_/ /_/
7. Command
8. :h To show these help info
9. :q To exit command line interface
10. :help [sql_operation] To show full usage of sql statement
12. SQL STATEMENTS:
13. To create a simplest stream:
14. CREATE STREAM stream_name;
16. To create a query select all fields from a stream:
17. SELECT * FROM stream_name EMIT CHANGES;
19. To insert values to a stream:
20. INSERT INTO stream_name (field1, field2) VALUES (1, 2);
22. >
创建一个 stream
首先,我们可以用 CREATE STREAM 语句创建一个名为 demo 的 stream.
1. CREATE STREAM demo;
对这个 stream 执行一个持久的查询操作
现在,我们可以通过 SELECT 在这个 stream 上执行一个持久的查询。
这个查询的结果将被直接展现在 CLI 中。
以下查询任务会输出所有 demo stream 中具有 humidity 大于 70 的数据。
1. SELECT * FROM demo WHERE humidity > 70 EMIT CHANGES;
现在看起来好像无事发生。这是因为从这个任务执行开始,还没有数据被写入到 demo 中。 接下来,我们会写入一些数据,然后符合条件的数据就会被以上任务输出。
启动另一个 CLI 窗口
我们可以利用这个新的 CLI 来插入数据:
1. docker exec -it some-hstream-cli hstream --port 6570 sql
向 stream 中写入数据
输入并运行以下所有 INSERT 语句,然后关注我们之前创建的 CLI 窗口。
1. INSERT INTO demo (temperature, humidity) VALUES (22, 80);
2. INSERT INTO demo (temperature, humidity) VALUES (15, 20);
3. INSERT INTO demo (temperature, humidity) VALUES (31, 76);
4. INSERT INTO demo (temperature, humidity) VALUES ( 5, 45);
5. INSERT INTO demo (temperature, humidity) VALUES (27, 82);
6. INSERT INTO demo (temperature, humidity) VALUES (28, 86);
不出意外的话,你将看到以下的结果。
1. {"temperature":22,"humidity":80}
2. {"temperature":31,"humidity":76}
3. {"temperature":27,"humidity":82}
4. {"temperature":28,"humidity":86}
