数速云基本使用流程
基于 SSC 上的应用程序可以分成两个部分,服务端由 QVA 和 QVM 构成,应用端由应用程序(以下简称 APP)和 QVS 组成。这两部分都有会涉及 SPL 脚本。服务端的 SPL 脚本在 QVM 上执行,称为 QVM 脚本。应用端也需要写 SPL 脚本来调用 QVM 脚本,称为 APP 脚本。
基本流程是这样:APP 调用 APP 脚本,在其中向 QVS 发出计算请求,QVS 再向 QVA 申请计算资源 QVM,然后由 APP 与获得的 QVM 建立连接,由 QVM 执行 QVM 脚本,获得计算结果返回到 APP 脚本中,再返回给 APP。
用户数据和 QVM 脚本都存储在云对象存储中,在执行时下载到 QVM 上。APP 脚本则与 APP 部署在一起,可以在本地也可以在云上。
1. 帐号及存储
1. 注册 SSC 账号
SSC 支持多种公有云服务商(AWS/GCP/Azure),SSC 管理端(QVA)注册地址也因此不同,以 AWS 为例,地址是 http://sscaws.scudata.com/qva,区域 Region 是 us-west-1。注册地址将来可能变动,请留意官方通告。
注册过程较简单,要注意的是,一个SSC 账号(用户名)有两个密码,分别是管理密码和执行密码,两者不能混用,管理密码用于登录本网站,进行账户和服务的管理;执行密码填在 QVS 的配置文件中,用于 QVS 访问 QVA 获取 QVM 并执行脚本。
注册后用管理密码登录进入,可执行维护管理功能。
试用阶段不收费,没有充值界面。
2. 创建用户的云存储
SSC 不存储用户的数据和脚本,也不收取相关的存储费,这一点和普通的云数仓很不一样。用户的数据和脚本存储在公有云服务商的对象存储中,即云存储。用户要自己去创建云存储并获得连接信息,SSC 再通过连接信息访问云存储,从而访问云存储的数据。不同的服务商有不同的云存储,AWS 的云存储是 S3,GCP 是 GCS,Azure 是 Blob。下面以 S3 为例,说明如何获得云存储的连接信息。
1.Region。Region 是连接信息的四个参数之一。S3 云存储分不同的区域 Region,同区域可能费用低(公有云服务商不收数据传输费),强烈建议选择与 SSC 同 Region 的云存储,否则服务商会收取跨区费用。
2. endPoint。endPoint 与 region 相关,是连接信息的四个参数之一,S3 的一般格式是 protocol://s3."region".amazonaws.com,比如 https://s3.us-west-1.amazonaws.com。详细规则可参考各自云存储服务商的文档,AWS 的相关文档在 https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region,末尾有当前浏览器所属地区的 endpoint 说明。
3. 申请accessKey和secretKey。登录 S3 后进入菜单 account->Security credentials,通过页面链接 create access key 申请。
申请成功后,记下 Access Key 和 Secret Key,这两个串是云存储连接信息的四个参数中的两个,相当于账户和口令。
完整的连接信息类似下面:
region:us-west1
endPoin:https://s3.us-west-1.amazonaws.com
accessKey:AKIA5MD7AFM2KJYIIW6B
secretKey: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
3. 下载并安装 QVS
QVS 全称 QDBase Virtual Service,用于接受并处理计算请求,需要安装在用户准备的服务器上。服务器类型可以是本地、私有云,公有云,操作系统可以是 Windows\Linux\Mac,比较常见的是公有云 +Linux,使用与 SSC 同区域的公有云可能减免数据传播费用。下面以 AWS EC2 公有云服务器为例,介绍 QVS 的安装部署过程。
1. 申请并启动 EC2。在 AWS 控制台新建 Linux 实例,启动后记下公有地址,这就是 QVS 的 IP 地址。
2. 找到 SPL 企业版。QVS 是 SPL 企业版的组件之一,使用 QVS 需要安装 SPL 企业版。打开 scudata 官网http://www.scudata.com,进入下载页面,可以找到 SPL 企业版。
3. 安装 SPL 企业版。根据不同的 Linux 版本,适用的安装包类型也不同,这里以 rpm 安装包为例,请按照链接里的安装指导进行操作,关键步骤是在 EC2 上用 wget 命令下载,用 rpm 命令安装。安装后的 QVS 根目录下文称作QVS 安装目录。
注意:安装时可能提示空间不足但实际空间充足的情况,这一般是临时目录 /tmp 太小导致的,请至少加大到 1GB。
为了检查安装是否正常,可以在配置前先启动 QVS,路径是 QVS 安装目录 /esProc/q-server/bin/startup.sh。用 tail 等命令查看 tomcat 的控制台输出日志,结果应当类似下面。
4. 下载并安装 IDE
IDE 是 SPL 脚本的集成开发环境,是 SPL 企业版的组件之一,使用 IDE 需要安装 SPL 企业版。IDE 一般安装在开发者的图形桌面环境上,同样支持 Windows/Linux/Mac。SPL 企业版的下载步骤可参考前面章节,下载后可一键安装,整个过程没有难度。安装后的 IDE 根目录下文称作IDE 安装目录。
为了检查安装是否正常,可以在配置前先启动 IDE,路径是 IDE 安装目录 /esProc/bin/ esproc.exe。桌面上也有 IDE 的醒目图标。启动后界面类似下面:
2. QVM脚本的本地调试
在 IDE 本地开发并调试 SPL QVM 脚本,脚本可访问云存储中的数据文件,开发后的脚本上传到云存储中,供集成环境的应用程序调用。
1. 配置 IDE
1. 复制云存储访问类库。以 S3 为例,需要将IDE 安装目录\esProc\q-extlib\s3 里的 jar 包复制到IDE 安装目录\esProc\lib。
2. 修改配置文件,重点是 IDE 主目录。先运行 IDE 安装目录 \esProc\bin\esproc.exe(esproc.sh),启动 IDE。再打开 IDE 菜单项 Tool->Options,找到 Main path,即IDE 主目录。
IDE 主目录是脚本和数据文件的根目录,默认路径(空白)对应IDE 安装目录\esproc,应当导航或输入合适的路径。其他配置项请根据需要修改。
也可手工修改,配置文件位于 IDE 安装目录\esProc\config\raqsoftConfig.xml
3. 在 IDE 中激活云存储的上下文环境。打开菜单“Remote Services->Storage Services Setting”,新建 S3 云存储,填入之前申请到的 S3 连接信息,最后点击按钮 connect 激活该云存储。之后在脚本执行云存储函数时,将使用这里的默认云存储。
2. 手工上传数据文件
在编写 SPL 脚本前,需要先将数据上传到云存储。以 S3 为例,先进入亚马逊管理端,按默认参数创建存储桶 bucket,再上传 data 目录及目录下的两个 txt 文件,结果应当如下:
SSC 支持多种数据文件格式,高性能计算还会使用 btx、ctx 等格式;除了上面的手工上传形式,SPL 也支持用脚本上传,这些内容后续会讲到。
3. 开发并调试 QVM 脚本
在激活的远程存储(云存储)上下文环境中,编写 QVM 脚本,并用 IDE 进行全功能调试。比如 remote001.splx,对两个云存储中的 txt 进行分组汇总,并按外部参数进行过滤。
A |
B |
|
1 |
=Qfile("bucket0925/data/Orders.txt").import@t() |
云存储中数据文件 |
2 |
=Qfile("bucket0925/data/OrderDetails.txt").import@t() |
|
3 |
=join(A1,order_id;A2,order_id) |
关联 |
4 |
=A3.groups(#1.customer_id; count(1):cnt,sum(#2.item_qty):amt) |
分组汇总 |
5 |
=A4.select(amt>arg1 && amt<=arg2) |
按外部参数过滤 |
注意:访问云存储应当使用 Q 开头的函数,比如代码中的 Qfile,这与访问本地文件系统的 file 函数不同。这段代码在 IDE 和 QVM 中都可以运行,读取的都是云存储中的数据文件。
开发调试完的 QVM 脚本,也需要上传到云存储,以便在应用集成环境(或远程调试环境)中使用。可像前面的数据文件一样,用手工方式上传 QVM 脚本;
4. 用脚本上传文件
除了使用云存储界面手工上传文件外,也可以用脚本上传。
先在 IDE 主目录下建立与存储桶同名的目录,将刚才编辑的 QVM 脚本即 remote001.splx 复制进去,然后在 IDE 中执行下面的上传脚本:
A |
B |
|
1 |
>Qload("bucket0925/remote001.splx") |
上传到云存储 |
执行后,在 S3 管理端应能看到刚上传的文件:
Qload 可以上传符合云存储规定的所有文件,包括前面章节的数据文件,还可以将云存储上的文件下载到本地,具体用法参考http://d.raqsoft.com.cn:6999/esproc/func/ychfw.html
3. QVM脚本被 APP 调用
集成环境下,Java 程序通过 SSC 提供的 QJDBC 执行 SPL APP 脚本,APP 脚本可以不访问 QVS 服务,只进行本地运算,也可以用 QConnect 函数访问 QVS,再由 QVS 向 QVA 申请,分配一个 QVM 执行 QVM 脚本。
QVS 有两种运行模式:独立 QVS、内嵌 QVS,独立 QVS 即按常规方式部署 QVS 服务,可以部署在本地局域网、私有云,公有云,推荐公有云,前面章节已经介绍过下载安装过程。内嵌 QVS 指在 Java 程序的进程里启动一次 QVS 服务,后续每次用 QJDBC 执行 QConnect 函数时,都默认访问这个内嵌的 QVS,不必再写明 IP 地址。
1. 无 QVS 服务
QJDBC 的基本用法是不访问 QVS 服务,仅在 Java 中执行普通 SPL 脚本。
1. QJDBC 的部署
在“QVS 安装目录\esProc\q-server\webapps\qvs\WEB-INF\lib”找到下面的四个 jar 包,复制到 Java 应用的类路径:
ecloud-XXXXXXXX.jar
esproc-bin-XXXXXXXX.jar
esproc-ent-XXXXXXXX.jar
esproc-ext-XXXXXXXX.jar
将“QVS 安装目录\esProc\q-server\webapps\qvs\WEB-INF\home\ raqsoftConfig.xml”复制到 Java 类路径,并根据实际情况进行修改,重点改 mainPath,以定位脚本和本地数据文件的根目录。IDE 中也有类似的配置文件。
2. APP 脚本
编写与 SSC 无关的 APP 脚本,比如在 Basic001.splx 中用本地的文本文件进行计算:
A |
B |
|
1 |
=file("bucket0925/data/Orders.txt").import@t() |
本地文件 |
2 |
=file("bucket0925/data/OrderDetails.txt").import@t() |
用 file 函数 |
3 |
=join(A1,order_id;A2,order_id) |
关联 |
4 |
=A3.groups(#1.customer_id; count(1):cnt,sum(#2.item_qty):amt) |
分组汇总 |
5 |
=A4.select(amt>arg1 && amt<=arg2) |
按外部参数过滤 |
3. Java 集成代码
在 Java 中通过 QJDBC 调用前面的 APP 脚本 Basic001.splx,代码同调用数据库存储过程。
java.sql.Connection con = null;
java.sql.PreparedStatement st=null;
try{
Class.forName("com.esproc.jdbc.QDriver");
con= DriverManager.getConnection("jdbc:esproc:q:local://");
st =con.prepareCall("call bucket0925/Basic001(?,?)");
st.setFloat(1,500);
st.setFloat(2,600);
st.execute();
…
2. 独立 QVS 服务
在前面章节的基础上,只需少许改动就能使用 SSC,本小节先调用独立 QVS 服务。
1. 修改独立 QVS 服务的配置文件。文件位于“QVS 安装目录\esProc\q-server\webapps\qvs\WEB-INF\home\qvsConfig.xml“
runMode:改为 0,表示运行模式而非调试模式。
user/xpwd:SSC 的账号和执行密码。
url:SSC 的管理端地址,同时也是 QVA 地址。
store: 云存储的连接信息,共 4 个参数。
2. 启动独立的 QVS 服务,命令位置:QVS 安装目录 /esProc/q-server/bin/startup.sh。
3. QJDBC 的部署设置:无需改动,与“无 QVS 服务”时配置相同。
4. 在 APP 脚本中访问独立 QVS 服务:
A |
B |
|
2 |
=Qconnect("http://3.34.4.61:8090/qvs":"demoqvs",30,60) |
连接独立的 QVS 服务,第一个参数是独立 QVS 服务的地址 |
3 |
try |
=A1.exec("bucket0925/remote001.splx",arg1,arg2) |
4 |
>A1.close() |
|
5 |
return B2 |
注意,bucket0925/remote001.splx 是云存储上的 QVM 脚本,前面章节有介绍。
5. Java 集成代码:无需改动。注意要释放 Statement,否则可能导致 QVM 耗尽
3. 内嵌 QVS 服务
内嵌 QVS 是内嵌于 Java 应用中的 QVS,不支持调试模式,也不支持数据维护,不能使用全局锁和全局变量
1. QJDBC 的部署设置:
首先把 QVS 的 jar 包复制到 Java 应用类路径,QVS 的 jar 包位于”QVS安装目录\esProc\q-server\webapps\qvs\WEB-INF\lib”。再将云存储 jar 包复制到 Java 应用类路径,其中,S3 的 jar 包位于 IDE 安装目录 \esProc\q-extlib\s3。最后,将 QVS 的配置文件放入 Java 应用的类路径(也支持绝对路径),QVS 的配置文件可参考前面独立 QVS 服务的配置文件。
2. 准备好 APP 脚本,脚本代码应访问内嵌 QVS 服务,并调用 QVM 脚本。比如 local_InnerQvs_001.splx:
A |
B |
|
1 |
=Qconnect(:"demoqvs",30,60) |
|
2 |
try |
=A1.exec("bucket0925/remote001.splx",arg1,arg2) |
3 |
>A1.close() |
|
4 |
return B2 |
注意,内嵌 QVS 服务的地址无意义,所以 Qconnect 的第一个参数为空。
3. Java 集成代码。
首先,通过静态方法启动一次内嵌 QVS 服务,需指定 QVS 配置文件,可以是类路径和绝对路径。一般在应用或模块的初始阶段执行这个操作,Java 代码如下:
com.scudata.ecloud.server.QVS.init("/qvsConfig.xml");
之后,可以在业务模块中执行 APP 脚本,Java 代码同调用数据库存储过程:
Connection con = null;
java.sql.PreparedStatement st=null;
try{
Class.forName("com.esproc.jdbc.QDriver");
con= DriverManager.getConnection("jdbc:esproc:q:local://");
st =con.prepareCall("call bucket0925/local_InnerQvs_001(?,?)");
st.setFloat(1,500);
st.setFloat(2,600);
st.execute();
4. APP脚本的本地调试
在本地 IDE 中可开发调试 APP 脚本,通过 Qconnect 函数连接 QVS,由 QVS 通过 QVA 申请 QVM,并在 QVM 上执行云存储上的 QVM 脚本。QVS 有两种部署方式,独立 QVS 服务和内嵌 IDE 的 QVS 服务。
1. 配置并启动独立 QVS 服务
独立 QVS 服务一般部署在公有云上,如 EC2,可参考前面章节。
2. 编写 QVM 脚本并上传到云存储
可参考前面章节,如前面用过的 remote001.splx
A |
B |
|
1 |
=Qfile("bucket0925/data/Orders.txt").import@t() |
云存储中数据文件 |
2 |
=Qfile("bucket0925/data/OrderDetails.txt").import@t() |
|
3 |
=join(A1,order_id;A2,order_id) |
关联 |
4 |
=A3.groups(#1.customer_id; count(1):cnt,sum(#2.item_qty):amt) |
分组汇总 |
5 |
=A4.select(amt>arg1 && amt<=arg2) |
按外部参数过滤 |
3. 用于独立 QVS 的 APP 脚本
APP 脚本可以通过 Qconnect 函数访问 QVS,通过 QVA 申请 QVM,从云存储下载脚本并执行。
A |
B |
|
2 |
=Qconnect("http://3.34.4.61:8090/qvs":"demoqvs",30,60) |
连接独立的 QVS 服务,第一个参数是独立 QVS 服务的地址 |
3 |
try |
=A1.exec("bucket0925/remote001.splx",arg1,arg2) |
4 |
>A1.close() |
|
5 |
return B2 |
4. 调试 APP 脚本
在 IDE 里对 APP 脚本进行全功能调试。
以上是独立 QVS 服务的用法,下面介绍内嵌 QVS 服务。
5. 配置并启动内嵌 QVS 服务
找到 QVS 服务的配置文件,位于“QVS 安装目录\esProc\q-server\webapps\qvs\WEB-INF\home\qvsConfig.xml“,文件内容见前面章节,同独立 QVS 服务。将该配置文件复制到”IDE安装目录\esProc\config”。
启动 IDE,内嵌于 IDE 的 QVS 会随之启动。
6. 用于内嵌 QVS 的 APP 脚本
在 IDE 中编写访问内嵌 QVS 服务的脚本:
A |
B |
|
1 |
=Qconnect(:"demoqvs",30,60) |
|
2 |
try |
=A1.exec("bucket0925/remote001.splx",arg1,arg2) |
3 |
>A1.close() |
|
4 |
return B2 |
注意,内嵌 QVS 服务的地址无意义,所以 Qconnect 的第一个参数为空;QVM 脚本与 QVS 的部署方式无关,不必需改。用于内嵌 QVS 的 APP 脚本同样可以在 IDE 中进行全功能调试,开发调试的方法与用于独立 QVS 的 APP 脚本没有区别。
7. 将 APP 脚本部署到应用中
开发调试后的 APP 脚本,就可以部署到应用程序中。脚本有两种写法:用于独立 QVS 的 APP 脚本、用于内嵌 QVS 的 APP 脚本,Java 应用的 QVS 服务对应这两种不同的部署方法,Java 代码也有两种不同的写法,请参考前面章节。
5. QVM脚本的远程调试
调式开发时,调试环境会向 S3 读取数据(个别情况还会写),如果是调试环境在本地,就会有流量费用,如果调试环境和 S3 在同一个区域则没有流量费用(但会有少量 IDE 和调试 QVS 的流量),SSC 为此提供了 QVM 脚本的远程调试方式。
远程调试 QVM 脚本需要再安装一个 QVS,设置为调试模式,只负责远程调试,与原独立 QVS 逻辑上无关(但因为共用的配置较多,这部分功能也在 QVS 服务中实现)。两个 QVS 分别启动后,本地 IDE 连接调试 QVS,读取云存储信息,以目录树的形式供开发者维护,即可对 QVM 脚本(包括数据文件)进行增删改以及调试。在 IDE 中调试 QVM 脚本时,实际的运行过程发生在调试 QVS 上,但会实时同步到 IDE 上,供开发者直观观察。
1. 配置并运行调试 QVS
1. 修改 QVS 配置。配置文件位于QVS 安装目录\esProc\q-server\webapps\qvs\WEB-INF\home\qvsConfig.xml,需要改三处:
1) 修改运行模式 runMode=1,表示调试模式。
2) 注释掉 <qva user> 一节,表示不使用 SSC 账户。这一步可选,因为 runMode=1 时本来就不读取 SSC 账号信息,无论 <qva user> 是否注释掉。
3) 注释掉 <store> 一节,表示使用文件系统存储,不使用云存储。保留 <store> 表示既使用主目录存储,也使用云存储。留着可以保持最大兼容性。
2. 修改 QVS 上的 SPL 配置。配置文件位于 QVS 安装目录 \esProc\q-server\webapps\qvs\WEB-INF\home\raqsoftConfig.xml。主要修改主目录 mainPath,这是 QVS 的根目录。注意 mainPath 可以是绝对路径也可以是相对路径。写成相对路径时,相对于 QVS 安装目录 \esProc\q-server\webapps\qvs\WEB-INF\home。
最后启动 QVS 服务。
2. IDE连接远程调试 QVS
启动 IDE,进入菜单栏的”Remote Services-Login”,在窗口输入 qvs 连接信息并登录。
登录成功后,IDE 左侧会显示出 QVS 上的文件资源,MainPath 表示文件系统目录,Cloud storage directory 表示云存储。
此时的 IDE 仅用于显示远程服务器的执行结果,它本身并不执行这个脚本。本质上,此时的 IDE 和之前的 IDE 在逻辑上无关,但物理上相同的东西很多,所以做进一个程序(EXE)了。
3. 上载调试脚本和相关文件
在左侧资源列表上,选云存储的某个目录,比如 test0904,点击右键,在弹出菜单上选择“upload file”,进入上载界面。
为了方便用户,可以在现存的上载路径后面手工填写子目录名,比如从“test0904”变成加“test0904/function”,这样可以达到建二级目录 function 的效果。注意:不能用双斜杠 \\,不能建一级目录。
点击按钮 Upload File,上载后关闭上载界面,IDE 中自动出现刚才创建的二级目录,展开目录可看到刚才上载的文件:
用同样的方法可以上载数据文件,不再赘述。
4. 远程执行 / 调试脚本。
上载脚本后双击该脚本,即可打开云上的脚本,之后可对该脚本进行远程修改、删除、保存、运行、调试,实际的操作发生在 QVS 上,但会同步到本地 IDE 上。
6. APP脚本的远程调试
同样为了节省流量费用,可以对 APP 脚本进行远程调试。类似地,也要启动两个 QVS,一个设置为服务模式,一个设置为调试模式。从本地 IDE 登录到调试 QVS,读取该 QVS 上的云存储信息,维护 APP 脚本和数据。APP 脚本中的代码通过 Qconnect 函数连接服务 QVS 上,申请 QVM 并执行 QVM 脚本。在 IDE 中调试 APP 脚本时,实际的调试过程发生在 QVS 上,但会实时同步到 IDE 上,供开发者直观观察。
1. 配置并启动服务模式 QVS
服务模式的 QVS 即一般的独立 QVS,通常部署在公有云上(如 EC2),重点在于配置文件 qvsConfig.xml 中 runMode=0,可参考前面章节。
2. 配置并启动调试模式 QVS
调试模式的 QVS 前面章节也介绍过,重点在于 qvsConfig.xml 中 runMode=1,可参考前面章节。
服务模式 QVS 和调试模式 QVS 可以部署在不同的服务器上,也可以部署成同一个 Web 服务里的两个应用。为了维护方便,可以修改调试 QVS 的 URL 路径 / 应用名 / 目录名(比如 debug),服务模式的 QVS 则保持不变 (仍然是 qvs)。
3. IDE连接远程 QVS
启动 IDE,进入菜单栏的”Remote Services-Login”,在窗口输入调试 QVS 的连接信息并登录。
4. 上载文件和脚本
上载文件和脚本的过程可参考前面章节,注意这里上载的应当是 APP 脚本,APP 脚本中的 Qconnect 函数连接的是独立的 QVS 服务。
A |
B |
|
2 |
=Qconnect("http://3.34.136.169:8090/qvs":"demoqvs",30,60) |
连接独立的 QVS 服务,第一个参数是独立 QVS 服务的地址 |
3 |
try |
=A1.exec("bucket0925/remote001.splx",arg1,arg2) |
4 |
>A1.close() |
|
5 |
return B2 |
5. 远程执行 / 调试脚本。
上载脚本后双击该脚本,即可打开云上的脚本,之后可对该脚本进行远程修改、删除、保存、执行、调试。
英文版