首页 > 大数据 > 数据挖掘 > 如何在 Kuscia 上运行 SCQL 联合分析任务
打开链接即可点亮社区Star,照亮技术的前进之路。
Github 地址: https://github.com/secretflow/kuscia*
本教程将以
KusciaAPI 创建本地数据源作为示例,介绍如何在 Kuscia 上运行 SCQL 联合分析任务。 本示例在
点对点组网模式下完成。在中心化组网模式下,证书的配置会有所不同。 {#cert-and-token} 在下面
准备数据步骤中需要使用到 KusciaAPI,如果 KusciaAPI 启用了 MTLS 协议,则需要提前准备好 MTLS 证书和 Token。协议参考
这里。 证书的配置参考
配置授权 这里以 Alice 节点为例,接口需要的证书文件在 ${USER}-kuscia-autonomy-alice 节点的
证书文件在 ${USER}-kuscia-master 节点的
您可以使用本文示例的测试数据文件,或者使用您自己的数据文件。 在 Kuscia 中,在节点容器的
``
下面 datasource_id 名称以 scql-demo-local-datasource 为例: ``
:::{tip} K8S RunK 模式部署 Kuscia 时,此处需要使用
OSS 数据源,并将 /home/kuscia/var/storage/data/scql-alice.csv 示例数据放入 OSS 中。 ::: 下面 domaindata_id 名称以 scql-alice-table 为例: ``
``
下面 datasource_id 名称以 scql-demo-local-datasource 为例: ``
:::{tip} K8S RunK 模式部署 Kuscia 时,此处需要使用
OSS 数据源,并将 /home/kuscia/var/storage/data/scql-bob.csv 示例数据放入 OSS 中。 ::: 下面 domaindata_id 名称以 scql-bob-table 为例: ``
``
如果是中心化组网模式,则需要登录到 master 节点容器中。 ``
从 SCQL 官方文档中,获取 AppImage 具体内容,并将其内容保存到 scql-image.yaml 文件中。 具体模版内容,可参考
SCQL AppImage。 > 注意: > > 1. 如果
``
如果是中心化组网模式,则需要登录到 master 节点容器中。 docker exec -it ${USER}-kuscia-master bash ``` 从 SCQL 官方文档中,获取 AppImage 具体内容,并将其内容保存到 scql-image.yaml 文件中。 具体模版内容,可参考
SCQL AppImage。 > 注意: > > 1. 如果
``
``
下面以 Alice 节点为例,Bob 节点类似 下面仅以流程步骤作为示例展示,更多接口参数请参考
SCQL API。 ``
下面项目名称以 "demo" 为例: ``
``
``
``
``
``
``
下面 table
name 以 ta 为例,reftable 参数的值为
创建 DomainData时的
``
下面 table
name 以 ta 为例,reftable 参数的值为
创建 DomainData时的
下面以 Alice 为例,Bob 节点类似 若想删除创建的数据表时,可以参考下面命令。以 Alice 节点为例,Bob 节点类似。 ``
``
``
``
下面以 Alice 为例,Bob 节点类似 若想撤销数据表授权,那么可以参考下面命令。以 Alice 节点为例,Bob 节点类似。 下面以 Alice 节点查询为例 Bob 节点类似。 返回的成功结果如下: 下面以 Alice 节点为例,Bob 节点类似。 ``
``
查看 broker kd 状态: 查看 broker deployment 状态 查看 broker 应用状态 查看 broker configmap 查看 appImage 删除 broker 在 Kuscia 中,可以登陆到节点容器内查看 SCQL 应用容器的日志。具体方法如下。 下面以 Alice 节点为例: ``
在目录
```bash ls /home/kuscia/var/stdout/pods cat /home/kuscia/var/stdout/pods/alice
xxxxengine
xxxx/secretflow/0.log cat /home/kuscia/var/stdout/pods/alicexxxx
brokerxxxx/secretflow/0.log ```准备节点
获取 KusciaAPI 证书和 Token
点对点组网模式
/home/kuscia/var/certs/ 目录下:
文件名
文件功能
kusciaapi-server.key
服务端私钥文件
kusciaapi-server.crt
服务端证书文件
ca.crt
CA 证书文件
token
认证 Token ,在 headers 中添加 Token: { token 文件内容} 中心化组网模式
/home/kuscia/var/certs/ 目录下:
文件名
文件功能
kusciaapi-server.key
服务端私钥文件
kusciaapi-server.crt
服务端证书文件
ca.crt
CA 证书文件
token
认证 Token ,在 headers 中添加 Token: { token 文件内容} 准备数据
/home/kuscia/var/storage 目录存放内置测试数据文件,下面 Alice 和 Bob 节点分别使用的是 scql-alice.csv 和 scql-bob.csv,您可以在容器中查看这两个数据文件。准备测试数据
Alice 准备测试数据
bash docker exec -it ${USER}-kuscia-autonomy-alice bash ``
bash export CTR_CERTS_ROOT=/home/kuscia/var/certs curl -k -X POST 'https://localhost:8082/api/v1/domaindatasource/create' \ --header "Token: $(cat ${CTR_CERTS_ROOT}/token)" \ --header 'Content-Type: application/json' \ --cert ${CTR_CERTS_ROOT}/kusciaapi-server.crt \ --key ${CTR_CERTS_ROOT}/kusciaapi-server.key \ --cacert ${CTR_CERTS_ROOT}/ca.crt \ -d '{ "domain_id": "alice", "datasource_id":"scql-demo-local-datasource", "type":"localfs", "name": "DemoDataSource", "info": { "localfs": { "path": "/home/kuscia/var/storage/data" } }, "access_directly": true }' ``
bash export CTR_CERTS_ROOT=/home/kuscia/var/certs curl -k -X POST 'https://localhost:8082/api/v1/domaindata/create' \ --header "Token: $(cat ${CTR_CERTS_ROOT}/token)" \ --header 'Content-Type: application/json' \ --cert ${CTR_CERTS_ROOT}/kusciaapi-server.crt \ --key ${CTR_CERTS_ROOT}/kusciaapi-server.key \ --cacert ${CTR_CERTS_ROOT}/ca.crt \ -d '{ "domain_id": "alice", "domaindata_id": "scql-alice-table", "datasource_id": "scql-demo-local-datasource", "name": "alice001", "type": "table", "relative_uri": "scql-alice.csv", "columns": [ { "name": "ID", "type": "str" }, { "name": "credit_rank", "type": "int" }, { "name": "income", "type": "int" }, { "name": "age", "type": "int" } ] }' ``Bob 准备测试数据
bash docker exec -it ${USER}-kuscia-autonomy-bob bash ``
bash export CTR_CERTS_ROOT=/home/kuscia/var/certs curl -k -X POST 'https://localhost:8082/api/v1/domaindatasource/create' \ --header "Token: $(cat ${CTR_CERTS_ROOT}/token)" \ --header 'Content-Type: application/json' \ --cert ${CTR_CERTS_ROOT}/kusciaapi-server.crt \ --key ${CTR_CERTS_ROOT}/kusciaapi-server.key \ --cacert ${CTR_CERTS_ROOT}/ca.crt \ -d '{ "domain_id": "bob", "datasource_id":"scql-demo-local-datasource", "type":"localfs", "name": "DemoDataSource", "info": { "localfs": { "path": "/home/kuscia/var/storage/data" } }, "access_directly": true }' ``
bash export CTR_CERTS_ROOT=/home/kuscia/var/certs curl -k -X POST 'https://localhost:8082/api/v1/domaindata/create' \ --header "Token: $(cat ${CTR_CERTS_ROOT}/token)" \ --header 'Content-Type: application/json' \ --cert ${CTR_CERTS_ROOT}/kusciaapi-server.crt \ --key ${CTR_CERTS_ROOT}/kusciaapi-server.key \ --cacert ${CTR_CERTS_ROOT}/ca.crt \ -d '{ "domain_id": "bob", "domaindata_id": "scql-bob-table", "datasource_id": "scql-demo-local-datasource", "name": "bob001", "type": "table", "relative_uri": "scql-bob.csv", "columns": [ { "name": "ID", "type": "str" }, { "name": "order_amount", "type": "int" }, { "name": "is_active", "type": "int" } ] }' ``部署 SCQL
Alice 部署 SCQL
bash docker exec -it ${USER}-kuscia-autonomy-alice bash ``bash docker exec -it ${USER}-kuscia-master bash ``
secretflow/scql 仓库访问网速较慢,可以替换为
secretflow-registry.cn-hangzhou.cr.aliyuncs.com/secretflow/scql。 > 2. 请删除
#--datasource_router=kusciadatamesh 代码行前面的 # 符号,以启用 Datamesh 本地数据源配置。 > 3. 在
engineConf 字段加上
--enable_restricted_read_path=false 限制 csv 文件的读取路径。 > 4. K8S RunK 模式部署 Kuscia 时,需要使用 MySQL 存储 Broker 元数据。修改
storage 字段的
type 为 MySQL 和
conn_str 对应的数据库连接字符串。 > 5. 如果 AppImage 配置有改动可以重启 Kuscia 或重新创建 Broker 使配置生效。示例命令:
kubectl delete KusciaDeployment scql -n cross-domain
kubectl apply -f broker-deploy.yaml 。
kubectl apply -f scql-image.yaml
kubectl apply -f /home/kuscia/scripts/templates/scql/broker_alice.yaml
Bob 部署 SCQL
bash docker exec -it ${USER}-kuscia-autonomy-bob bash ``
secretflow/scql 仓库访问网速较慢,可以替换为
secretflow-registry.cn-hangzhou.cr.aliyuncs.com/secretflow/scql。 > 2. 请删除
#--datasource_router=kusciadatamesh 代码行前面的 # 符号,以启用 Datamesh 本地数据源配置。 > 3. 在
engineConf 字段加上
--enable_restricted_read_path=false 限制 csv 文件的读取路径。 > 4. K8S RunK 模式部署 Kuscia 时,需要使用 MySQL 存储 Broker 元数据。修改
storage 字段的
type 为 MySQL 和
conn_str 对应的数据库连接字符串。 > 5. 如果 AppImage 配置有改动可以重启 Kuscia 或重新创建 Broker 使配置生效。示例命令:
kubectl delete KusciaDeployment scql -n cross-domain
kubectl apply -f broker-deploy.yaml 。
bash kubectl apply -f appimage.yaml ``
bash kubectl apply -f /home/kuscia/scripts/templates/scql/broker_bob.yaml ``查看 broker 是否部署成功
docker exec -it ${USER}-kuscia-autonomy-alice kubectl get po -A
# When the Pod status is Running, it indicates that the deployment was successful:
NAMESPACE NAME READY STATUS RESTARTS AGE
alice scql-broker-6f4f85b64f-fsgq8 1/1 Running 0 2m42s
使用 SCQL 进行联合分析
创建项目并邀请参与方加入
Alice 创建项目,并邀请 Bob 加入
bash docker exec -it ${USER}-kuscia-autonomy-alice bash ``
bash curl -X POST http://127.0.0.1:80/intra/project/create \ --header "host: scql-broker-intra.alice.svc" \ --header "kuscia-source: alice" \ -d '{ "project_id":"demo", "name":"demo", "conf":{ "spu_runtime_cfg":{ "protocol":"SEMI2K", "field":"FM64" } }, "description":"this is a project" }' ``
bash curl -X POST http://127.0.0.1:80/intra/project/list \ --header "host: scql-broker-intra.alice.svc" \ --header "kuscia-source: alice" ``
bash curl -X POST http://127.0.0.1:80/intra/member/invite \ --header "host: scql-broker-intra.alice.svc" \ --header "kuscia-source: alice" \ -d '{ "invitee": "bob", "project_id": "demo" }' ``
bash curl -X POST http://127.0.0.1:80/intra/invitation/list \ --header "host: scql-broker-intra.alice.svc" \ --header "kuscia-source: alice" ``Bob 接受邀请
bash docker exec -it ${USER}-kuscia-autonomy-bob bash ``
bash curl -X POST http://127.0.0.1:80/intra/invitation/process \ --header "host: scql-broker-intra.bob.svc" \ --header "kuscia-source: bob" \ -d '{ "invitation_id":1, "respond":0 }' ``创建数据表
Alice 创建数据表
bash docker exec -it ${USER}-kuscia-autonomy-alice bash ``
domaindata_idcurl -X POST http://127.0.0.1:80/intra/table/create \
--header "host: scql-broker-intra.alice.svc" \
--header "kuscia-source: alice" \
-H "Content-Type: application/json" \
-d '{
"project_id": "demo",
"table_name": "ta",
"ref_table": "scql-alice-table",
"db_type": "csvdb",
"columns": [
{"name":"ID","dtype":"string"},
{"name":"credit_rank","dtype":"int"},
{"name":"income","dtype":"int"},
{"name":"age","dtype":"int"}
]
}'
Bob 创建数据表
bash docker exec -it ${USER}-kuscia-autonomy-bob bash ``
domaindata_idcurl -X POST http://127.0.0.1:80/intra/table/create \
--header "host: scql-broker-intra.bob.svc" \
--header "kuscia-source: bob" \
-H "Content-Type: application/json" \
-d '{
"project_id": "demo",
"table_name": "tb",
"ref_table": "scql-bob-table",
"db_type": "csvdb",
"columns": [
{"name":"ID","dtype":"string"},
{"name":"order_amount","dtype":"double"},
{"name":"is_active","dtype":"int"}
]
}'
查看数据表
curl -X POST http://127.0.0.1:80/intra/table/list \
--header "host: scql-broker-intra.alice.svc" \
--header "kuscia-source: alice" \
-H "Content-Type: application/json" \
-d '{
"project_id": "demo"
}'
删除数据表
curl -X POST http://127.0.0.1:80/intra/table/drop \
--header "host: scql-broker-intra.alice.svc" \
--header "kuscia-source: alice" \
-H "Content-Type: application/json" \
-d '{
"project_id": "demo",
"table_name":"ta"
}'
数据表授权
Alice 的数据表授权
bash curl -X POST http://127.0.0.1:80/intra/ccl/grant \ --header "host: scql-broker-intra.alice.svc" \ --header "kuscia-source: alice" \ -H "Content-Type: application/json" \ -d '{ "project_id": "demo", "column_control_list":[ {"col":{"column_name":"ID","table_name":"ta"},"party_code":"alice","constraint":1}, {"col":{"column_name":"age","table_name":"ta"},"party_code":"alice","constraint":1}, {"col":{"column_name":"income","table_name":"ta"},"party_code":"alice","constraint":1}, {"col":{"column_name":"credit_rank","table_name":"ta"},"party_code":"alice","constraint":1} ] }' ``
bash curl -X POST http://127.0.0.1:80/intra/ccl/grant \ --header "host: scql-broker-intra.alice.svc" \ --header "kuscia-source: alice" \ -H "Content-Type: application/json" \ -d '{ "project_id": "demo", "column_control_list":[ {"col":{"column_name":"ID","table_name":"ta"},"party_code":"bob","constraint":1}, {"col":{"column_name":"age","table_name":"ta"},"party_code":"bob","constraint":1}, {"col":{"column_name":"income","table_name":"ta"},"party_code":"bob","constraint":1}, {"col":{"column_name":"credit_rank","table_name":"ta"},"party_code":"bob","constraint":1} ] }' ``Bob 的数据表授权
bash curl -X POST http://127.0.0.1:80/intra/ccl/grant \ --header "host: scql-broker-intra.bob.svc" \ --header "kuscia-source: bob" \ -H "Content-Type: application/json" \ -d '{ "project_id": "demo", "column_control_list":[ {"col":{"column_name":"ID","table_name":"tb"},"party_code":"alice","constraint":1}, {"col":{"column_name":"is_active","table_name":"tb"},"party_code":"alice","constraint":1}, {"col":{"column_name":"order_amount","table_name":"tb"},"party_code":"alice","constraint":1} ] }' ``
bash curl -X POST http://127.0.0.1:80/intra/ccl/grant \ --header "host: scql-broker-intra.bob.svc" \ --header "kuscia-source: bob" \ -H "Content-Type: application/json" \ -d '{ "project_id": "demo", "column_control_list":[ {"col":{"column_name":"ID","table_name":"tb"},"party_code":"bob","constraint":1}, {"col":{"column_name":"is_active","table_name":"tb"},"party_code":"bob","constraint":1}, {"col":{"column_name":"order_amount","table_name":"tb"},"party_code":"bob","constraint":1} ] }' ``查看数据表授权
curl -X POST http://127.0.0.1:80/intra/ccl/show \
--header "host: scql-broker-intra.alice.svc" \
--header "kuscia-source: alice" \
-H "Content-Type: application/json" \
-d '{
"project_id": "demo",
"tables":["ta"],
"dest_parties":["alice"]
}'
撤销数据表授权
curl -X POST http://127.0.0.1:80/intra/ccl/revoke \
--header "host: scql-broker-intra.alice.svc" \
--header "kuscia-source: alice" \
-H "Content-Type: application/json" \
-d '{
"project_id": "demo",
"column_control_list":[
{"col":{"column_name":"ID","table_name":"ta"},"party_code":"alice","constraint":1},
{"col":{"column_name":"age","table_name":"ta"},"party_code":"alice","constraint":1},
{"col":{"column_name":"income","table_name":"ta"},"party_code":"alice","constraint":1},
{"col":{"column_name":"credit_rank","table_name":"ta"},"party_code":"alice","constraint":1}
]
}'
进行联合分析
同步查询
curl -X POST http://127.0.0.1:80/intra/query \
--header "host: scql-broker-intra.alice.svc" \
--header "kuscia-source: alice" \
-H "Content-Type: application/json" \
-d '{
"project_id": "demo",
"query":"SELECT ta.credit_rank, COUNT(*) as cnt, AVG(ta.income) as avg_income, AVG(tb.order_amount) as avg_amount FROM ta INNER JOIN tb ON ta.ID = tb.ID WHERE ta.age >= 20 AND ta.age <= 30 AND tb.is_active=1 GROUP BY ta.credit_rank;"
}'
{
"status": {
"code": 0,
"message": "",
"details": []
},
"affected_rows": "0",
"warnings": [],
"cost_time_s": 7.171298774,
"out_columns": [{
"name": "credit_rank",
"shape": {
"dim": [{
"dim_value": "2"
}, {
"dim_value": "1"
}]
},
"elem_type": "INT64",
"option": "VALUE",
"annotation": {
"status": "TENSORSTATUS_UNKNOWN"
},
"int32_data": [],
"int64_data": ["6", "5"],
"float_data": [],
"double_data": [],
"bool_data": [],
"string_data": [],
"ref_num": 0
}, {
"name": "cnt",
"shape": {
"dim": [{
"dim_value": "2"
}, {
"dim_value": "1"
}]
},
"elem_type": "INT64",
"option": "VALUE",
"annotation": {
"status": "TENSORSTATUS_UNKNOWN"
},
"int32_data": [],
"int64_data": ["3", "1"],
"float_data": [],
"double_data": [],
"bool_data": [],
"string_data": [],
"ref_num": 0
}, {
"name": "avg_income",
"shape": {
"dim": [{
"dim_value": "2"
}, {
"dim_value": "1"
}]
},
"elem_type": "FLOAT64",
"option": "VALUE",
"annotation": {
"status": "TENSORSTATUS_UNKNOWN"
},
"int32_data": [],
"int64_data": [],
"float_data": [],
"double_data": [438000, 30070],
"bool_data": [],
"string_data": [],
"ref_num": 0
}, {
"name": "avg_amount",
"shape": {
"dim": [{
"dim_value": "2"
}, {
"dim_value": "1"
}]
},
"elem_type": "FLOAT64",
"option": "VALUE",
"annotation": {
"status": "TENSORSTATUS_UNKNOWN"
},
"int32_data": [],
"int64_data": [],
"float_data": [],
"double_data": [4060.6666666666665, 3598],
"bool_data": [],
"string_data": [],
"ref_num": 0
}]
}
异步查询
bash curl -X POST http://127.0.0.1:80/intra/query/submit \ --header "host: scql-broker-intra.alice.svc" \ --header "kuscia-source: alice" \ -H "Content-Type: application/json" \ -d '{ "project_id": "demo", "query":"SELECT ta.credit_rank, COUNT(*) as cnt, AVG(ta.income) as avg_income, AVG(tb.order_amount) as avg_amount FROM ta INNER JOIN tb ON ta.ID = tb.ID WHERE ta.age >= 20 AND ta.age <= 30 AND tb.is_active=1 GROUP BY ta.credit_rank;" }' ``
bash curl -X POST http://127.0.0.1:80/intra/query/fetch \ --header "host: scql-broker-intra.alice.svc" \ --header "kuscia-source: alice" \ -H "Content-Type: application/json" \ -d '{ "job_id":"3c4723fb-9afa-11ee-8934-0242ac12000" }' ``参考
常用命令
docker exec -it ${USER}-kuscia-autonomy-alice kubectl get kd -n cross-domain
docker exec -it ${USER}-kuscia-autonomy-alice kubectl get deployment -A
docker exec -it ${USER}-kuscia-autonomy-alice kubectl get po -A
docker exec -it ${USER}-kuscia-autonomy-alice kubectl get cm scql-broker-configtemplate -n alice -oyaml
docker exec -it ${USER}-kuscia-autonomy-alice kubectl get appimage
docker exec -it ${USER}-kuscia-autonomy-alice kubectl delete kd scql -n cross-domain
如何查看 SCQL 应用容器日志
bash docker exec -it ${USER}-kuscia-autonomy-alice bash ``
/home/kuscia/var/stdout/pods 下可以看到对应 SCQL Broker 和 Engine 应用容器的目录。后续进入到相应目录下,即可查看应用的日志。View the current application container's directory
View the application container's logs, example as follows:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047764/viewspace-3104680/ ,如需转载,请注明出处,否则将追究法律责任。