制作livy的parcel包和csd文件
Livy是一个基于Spark的开源REST服务,它能够通过REST的方式将代码片段或是序列化的二进制代码提交到Spark集群中去执行。Cloudera Manager 添加livy服务需要制作parcel包及csd文件。最新版本为0.7.0,github上3年没更新了
我的环境为CDH6.3.2,CM6.3.1平台。
官网:http://livy.incubator.apache.org/,
-
配置java,maven等环境 (略)
-
下载cm_ext工具。
可以不用下载,后面的 livy_zeppelin_cdh_csd_parcels,build脚本中含有下载的部分。
-
下载 livy_zeppelin_cdh_csd_parcels
[root@cdh1 cloudera]# cd /opt/soft/cloudera/ [root@cdh1 cloudera]#git clone https://github.com/alexjbush/livy_zeppelin_cdh_csd_parcels.git [root@cdh1 cloudera]# cd livy_zeppelin_cdh_csd_parcels/
4.修改build脚本:
因为默认的build livy版本为0.5.0,但是我想要用0.7.0的最新版本,而且不需要zepplin,所以对build脚本修改如下。
JAR_PATH:我在官网手动下载了apache-livy-0.7.0-incubating-bin.zip 所以不需要单独LIVY_URL在线下载。
LIVY_MD5:这个md加密的也是根据运行build后报错一次后填写的
其他的根据自己环境修改
# !/bin/bash
set -x
set -e
JAR_PATH=/opt/package/apache-livy-0.7.0-incubating-bin.zip
DEST_PATH=/opt/soft/cloudera/livy_zeppelin_cdh_csd_parcels
# CM_EXT_BRANCH=cm5-5.12.0
# LIVY_URL=http://apache.mirror.anlx.net/incubator/livy/0.5.0-incubating/livy-0.5.0-incubating-bin.zip
LIVY_URL=http://apache.mirror.anlx.net/incubator/livy/0.7.0-incubating/apache-livy-0.7.0-incubating-bin.zip
LIVY_MD5="2c5b63757414af16da308e63749e1ae6" #不知道哪来的加密,但是报错一次后就知道这填什么了
LIVY_VERSION=0.7.0
livy_service_name="LIVY"
livy_service_name_lower="$( echo $livy_service_name | tr '[:upper:]' '[:lower:]' )"
livy_archive="$( basename $LIVY_URL )"
livy_folder="$( basename $livy_archive .zip )"
livy_parcel_folder="${livy_service_name}-${LIVY_VERSION}"
livy_parcel_name="$livy_parcel_folder-el7.parcel"
livy_built_folder="${livy_parcel_folder}_build"
livy_csd_build_folder="livy_csd_build"
function build_cm_ext {
# Checkout if dir does not exist
if [ ! -d cm_ext ]; then
git clone https://github.com/cloudera/cm_ext.git
fi
if [ ! -f cm_ext/validator/target/validator.jar ]; then
cd cm_ext
#git checkout "$CM_EXT_BRANCH"
mvn package
cd ..
fi
}
function get_livy {
if [ ! -f "$livy_archive" ]; then
#wget $LIVY_URL
cp $JAR_PATH $DEST_PATH
fi
livy_md5="$( md5sum $livy_archive | cut -d' ' -f1 )"
if [ "$livy_md5" != "$LIVY_MD5" ]; then
echo ERROR: md5 of $livy_archive is not correct
exit 1
fi
if [ ! -d "$livy_folder" ]; then
unzip $livy_archive
fi
}
function build_livy_parcel {
if [ -f "$livy_built_folder/$livy_parcel_name" ] && [ -f "$livy_built_folder/manifest.json" ]; then
return
fi
if [ ! -d $livy_parcel_folder ]; then
get_livy
mv $livy_folder $livy_parcel_folder
fi
cp -r livy-parcel-src/meta $livy_parcel_folder
sed -i -e "s/%VERSION%/$LIVY_VERSION/" ./$livy_parcel_folder/meta/parcel.json
sed -i -e "s/%SERVICENAME%/$livy_service_name/" ./$livy_parcel_folder/meta/parcel.json
sed -i -e "s/%SERVICENAMELOWER%/$livy_service_name_lower/" ./$livy_parcel_folder/meta/parcel.json
java -jar cm_ext/validator/target/validator.jar -d ./$livy_parcel_folder
mkdir -p $livy_built_folder
tar zcvhf ./$livy_built_folder/$livy_parcel_name $livy_parcel_folder --owner=root --group=root
java -jar cm_ext/validator/target/validator.jar -f ./$livy_built_folder/$livy_parcel_name
python cm_ext/make_manifest/make_manifest.py ./$livy_built_folder
}
function build_livy_csd {
JARNAME=${livy_service_name}-${LIVY_VERSION}.jar
if [ -f "$JARNAME" ]; then
return
fi
rm -rf ${livy_csd_build_folder}
cp -rf ./livy-csd-src ${livy_csd_build_folder}
sed -i -e "s/%SERVICENAME%/$livy_service_name/" ${livy_csd_build_folder}/descriptor/service.sdl
sed -i -e "s/%SERVICENAMELOWER%/$livy_service_name_lower/" ${livy_csd_build_folder}/descriptor/service.sdl
sed -i -e "s/%SERVICENAMELOWER%/$livy_service_name_lower/" ${livy_csd_build_folder}/scripts/control.sh
java -jar cm_ext/validator/target/validator.jar -s ${livy_csd_build_folder}/descriptor/service.sdl -l "SPARK_ON_YARN SPARK2_ON_YARN"
jar -cvf ./$JARNAME -C ${livy_csd_build_folder} .
}
case $1 in
parcel)
build_cm_ext
build_livy_parcel
;;
csd)
build_livy_csd
;;
*)
echo "Usage: $0 [parcel|csd]"
;;
esac
5.build livy parcel
[root@cdh1 livy_zeppelin_cdh_csd_parcels]# ./build.sh parcel
6. build liby csd
[root@cdh1 livy_zeppelin_cdh_csd_parcels]# ./build.sh csd
build后生成livy的parcel,manifest 文件,csd文件如下
7.开启httpd情况下,移动parcel 到httpd 对应目录下
[root@cdh1 livy_zeppelin_cdh_csd_parcels]# mkdir /var/www/html/livy0.7.0
[root@cdh1 livy_zeppelin_cdh_csd_parcels]# cp LIVY-0.7.0_build/
LIVY-0.7.0-el7.parcel manifest.json
[root@cdh1 livy_zeppelin_cdh_csd_parcels]# cp LIVY-0.7.0_build/* /var/www/html/livy0.7.0/ -r
外部浏览器验证
- 移动csd到cloudera/csd下
[root@cdh1 livy_zeppelin_cdh_csd_parcels]# cp LIVY-0.7.0.jar /opt/cloudera/csd/
上面已经制作完成livy的parcel,及csd文件
8.CM部署livy0.7.0的服务参考
https://cloud.tencent.com/developer/article/1349537
错误1:启动livy报错
Error found before invoking supervisord: ‘getpwnam(): name not found: livy’
解决:
1.在Livy REST Server所在服务器上增加livy用户及用户组
[root@cdh3 ~]# groupadd livy
[root@cdh3 ~]# useradd livy -g livy
[root@cdh3 ~]# chown livy:livy /var/log/livy
chown: cannot access ‘/var/log/livy’: No such file or directory
[root@cdh3 ~]# mkdir /var/log/livy
[root@cdh3 ~]# chown livy:livy /var/log/livy
- 在HDFS的core-site.xml 中添加一下配置: