# Livy Apache Livy 是开源的 Spark REST 接口服务, 通过 Livy 的 REST 接口可以远程地在 Spark Context 中执行代码. 本项目 fork 自 [https://github.com/apache/incubator-livy](https://github.com/apache/incubator-livy), 在官方代码的基础上进行二次开发, 并修复部分 BUG. ## 构建及运行方法 ### 1. 构建命令 构建前请将 `spark-3.0.3-bin-hadoop3.2.tgz` 放置于项目根目录中, ![](./images/pom.png) 使用如下命令进行构建: ```bash mvn clean package \ -B -V -e \ -Pspark-3.0 \ -Pthriftserver \ -DskipTests \ -DskipITs \ -Dmaven.javadoc.skip=true ``` 构建完成后生成 `assembly/target/apache-livy-<版本>-bin.zip` ### 2. Docker 镜像 项目中提供了 Dockerfile, 可以将源码打包为镜像. ```bash # 开始构建 Livy 测试镜像 DOCKER_BUILDKIT=1 docker build -f Dockerfile.dev --build-arg BUILDKIT_INLINE_CACHE=1 --target image-test -t livy:test . # 开始构建 Livy 生产镜像 DOCKER_BUILDKIT=1 docker build -f Dockerfile.dev --build-arg BUILDKIT_INLINE_CACHE=1 --target image-prod -t livy:prod . ``` 通过构建好的 Livy 镜像运行服务 ``` docker run -d \ --name ylproj-livy \ --network ylproj \ -p 8998:8998 \ -p 31100-31103:31100-31103 \ -v :/etc/krb5.conf:ro \ -v :/opt/cluster/conf:ro \ -e LIVY_SERVER_JAVA_OPTS=-Dlivy.rsc.launcher.address=livy \ ylproj-livy ``` 运行参数说明: - 文件夹 /opt/cluster/conf 中保存 Hadoop 和 Livy 的配置文件以及 Kerberos 的 keytab - /etc/krb5.conf 是 Kerberos 的配置文件 - 端口 8998 是 Livy 的 RESTful 服务,与 livy.conf 配置文件中一致 - 端口 31100-31103 是 Livy 与 Hadoop 集群中的 driver 程序通信的 RPC 端口,与 livy-client.conf 中的配置一致 - 环境变量 `LIVY_SERVER_JAVA_OPTS` 中填入 Livy 服务的域名或 IP 地址 (Hadoop 集群中的 driver 程序要通过该地址访问 Livy) ## 配置文件说明 在镜像中挂载的配置目录结构如下: ``` / ├─ etc/ │ └─ krb5.conf └─ opt/ └─ cluster/ └─ conf/ ├─ core-site.xml ├─ hdfs-site.xml ├─ yarn-site.xml ├─ mapred-site.xml ├─ hive-site.xml ├─ livy-client.conf ├─ livy.conf ├─ log4j.properties ├─ spark-defaults.conf └─ user.keytab ``` - krb5.conf 是 Kerberos 配置文件 - core-site.xml, hdfs-site.xml, yarn-site.xml, mapred-site.xml 是 Hadoop 的配置文件 - hive-site.xml 是 Hive 的配置文件 - livy-client.conf 和 livy.conf 是 Livy 服务的配置文件 - log4j.properties 是日志配置 - spark-defaults.conf 是 spark 的配置文件 - user.keytab 是 Livy 服务的 keytab ### 关于 Kerberos 如果需要 Kerberos 认证的话, 就要把 KDC 配置放到 /etc/krb5.conf 这里 在 livy.conf 中配置 ``` livy.server.launch.kerberos.principal = livy.server.launch.kerberos.keytab = /opt/cluster/conf/user.keytab ``` 对应于 principal 的 keytab 文件请放在 /opt/cluster/conf/user.keytab 如果本地测试不用 Kerberos 的话, 就删除上述配置 ### 关于 Livy 的 conf 文件配置 TODO ## 测试 livy ### code ```shell curl --request POST \ --url http://172.23.7.140:30998/sessions \ --header 'content-type: application/json' \ --data '{ "kind": "spark" }' | jq curl --request GET \ --url http://172.23.7.140:30998/sessions/0 \ --header 'content-type: application/json' \ --data '{ "kind": "spark" }' | jq curl -XPOST 'http://172.23.7.140:30998/sessions/0/statements' \ -H 'Content-Type: application/json' \ -d '{"code": "spark.range(1000 * 1000 * 1000).count()"}' | jq curl --request GET \ --url http://172.23.7.140:30998/sessions/0/statements/0 | jq ## pyspark curl --request POST \ --url http://10.138.143.16:8998/sessions \ --header 'content-type: application/json' \ --data '{ "kind": "pyspark" }' | jq # 查看session curl --request GET \ --url http://10.138.143.16:8998/sessions/0 \ --header 'content-type: application/json' \ --data '{ "kind": "pyspark" }' | jq # 提交任务 curl -XPOST 'http://10.138.143.16:8998/sessions/0/statements' \ -H 'Content-Type: application/json' \ -d '{"code": "sc.range(5).collect()"}' # 查看结果 curl --request GET \ --url http://10.138.143.16:8998/sessions/0/statements/0 | jq curl -X DELETE \ --url http://10.138.143.16:8998/sessions/0 | jq ```