虽然Jetbrains的pycharm好用,但是开发graphscope我个人建议还是用jupyterlab。因为graphscope(我用的是0.16.0)的API只能用于Linux,所以如果要用Pycharm,操作系统层面就要带图形化界面。而我只能用纯净版的Linux操作系统,所以使用能远程连接jupyterlab比较好。
如何快速安装k8s,以及jupyterlab开发环境
graphscope依赖于k8s环境,关于k8s的部署安装可以参考
【部署与运维】sealos k8s 的安装和使用
我们使用jupyterlab进行开发
【大数据分析】基于virtualenv和jupyterlab搭建远程开发环境
使用sealos安装helm
root@master:~# sealos run labring/helm:v3.8.2
基于helm安装graphscope
配置helm的graphscope依赖
root@master:~# helm repo add graphscope https://graphscope.oss-cn-beijing.aliyuncs.com/charts/
然后update一下。
安装graphscope
root@master:~# helm install graphscope graphscope/graphscope
graphscope的安装对配置有一定的要求,例如所运行的cpu内核数>=4,内存>=8等,还至少两个worker。否则使用kubectl describe pod命令可以查看到pod并没有真正运行。
查看graphscope在k8s中的service
查看k8s中的服务,可以看到graphscope的service已经建立。
root@master:~# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
graphscope-coordinator-service NodePort 10.96.0.13 59001:30922/TCP,8888:30080/TCP 2m1s
kubernetes ClusterIP 10.96.0.1 443/TCP 19m
k8s中sevice的作用(备忘):
(1)使得集群内部可以访问pod。
(2)使用 NodePort 或者 LoadBalancer 类型的 Service,外部网络也可以访问该pod。
(3)每个 service 会创建出来一个虚拟 ip,通过访问 vip:port 就能获取服务的内容(vip是虚拟ip,用于内部访问,外部无法访问的)。
查看graphscope在k8s中的pod
root@master:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
graphscope-coordinator-744bdb9cf7-fksf6 0/2 ContainerCreating 0 2m25s
可以看到此时的graphscope的pod并没有准备好,进一步用一下命令,可以看到第一次安装graphscope会有一个较长的拉取镜像(pulling image)的过程。
(这里关于如何修改如下中,graphscope的registry.cn-hongkong.aliyuncs.com镜像源,我还没有找到方法。有找到的读者希望可以指教,我是跨过了一个中秋假期回来才发现pull完的,放假前以为卡住没戏了,回来一看发现pull了两个半小时)
root@master:~# kubectl describe pod graphscope-coordinator-744bdb9cf7-fksf6
......省略
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m44s default-scheduler Successfully assigned default/graphscope-coordinator-744bdb9cf7-fksf6 to worker2
Normal Pulling 117s kubelet Pulling image "registry.cn-hongkong.aliyuncs.com/graphscope/graphscope:0.16.0
成功后再查看pods
root@master:~# kubectl get pods
NAME READY STATUS RESTARTS AGE
graphscope-coordinator-744bdb9cf7-fksf6 2/2 Running 12 (3d12h ago) 3d15h
gs-engine-graphscope-8pdnl 2/2 Running 0 3d12h
gs-engine-graphscope-hsl5d 2/2 Running 0 3d12h
gs-etcd-graphscope-0 1/1 Running 0 3d12h
gs-etcd-graphscope-1 1/1 Running 0 3d12h
gs-etcd-graphscope-2 1/1 Running 0 3d12h
此时我们可以查看使用graphscope-client需要连接的graphscope服务地址。
root@master:~# export NODE_IP=$(kubectl --namespace default get pod -l graphscope.coordinator.name=graphscope-coordinator --no-headers=true | awk '/ /{print $1}' | xargs kubectl -o jsonpath="{.status.hostIP}")
root@master:~# export NODE_PORT=$(kubectl --namespace default get services -o jsonpath="{.spec.ports[0].nodePort}" graphscope-coordinator-service)
root@master:~# echo "GraphScope service listen on ${NODE_IP}:${NODE_PORT}"
GraphScope service listen on 172.16.11.99:30922
接着我们在jupyterlab上写一个样例代码
import graphscope
sess = graphscope.session(addr="172.16.11.99:30922")
print(sess)
执行可以得到下面这个结果
{'status': 'active', 'type': 'k8s', 'engine_hosts': 'gs-engine-graphscope-8pdnl,gs-engine-graphscope-hsl5d', 'namespace': 'default', 'cluster_type': '1', 'session_id': 'session_dfzwgkuz', 'num_workers': 2, 'coordinator_endpoint': '172.16.11.99:30922', 'engine_config': {'networkx': 'ON', 'vineyard_socket': '/tmp/vineyard_workspace/vineyard.sock', 'vineyard_rpc_endpoint': '172.16.11.99:30868', 'enable_java_sdk': 'ON', 'vineyard_service_name': 'gs-vineyard-service-graphscope', 'mars_endpoint': None}}