记录一下spark和pyspark在Zeppelin里面访问lzo文件报错的问题。

由于甲方全球500强极度抠门,死活不愿意加服务器,然后接入的数据源又多,小集群很快就会被撑满,所以没办法,原始日志均采用lzo压缩存储。hadoop和spark都是采用正版Cloudera Manager部署,这方面没有太大问题。在命令行方式下,spark-shell是完全可以直接读取lzo的。但是在Zeppelin里面,由于Zeppelin自己是一套独立的运行环境,不会去尝试获取系统中hadoop或spark的配置,所以,在Zeppelin里面读取lzo文件,YARN的执行container服务器一直报找不到:native-lzo library not available。

val data = sc.textFile("/user/xxx/xxx/ott/xxx_xxx_20170101131042_0000_ott.lzo")
data.take(3)


尝试思考了一下,由于zeppelin是自己独立的运行环境,所以应该是application master执行的命令里不包含spark-lzo的相关配置。于是尝试加入本地lzo库到zeppelin spark的配置里面,按照hadoop执行的原理,作业提交会将作业相关jar包及配置xml封装为container,通过AM分发给各NM执行,结果失败。(zeppelin服务器的hadoop和spark client使用rpm安装,集群使用parcels安装,所以两个环境里lzo库的位置是不同的。)


然后试着删除本地lzo路径,加入集群的lzo库路径进去,问题解决。所以其实执行并不会将本地的依赖库加入到执行container里面,必须指向到真实服务器的路径。而且即使写了真实路径,也不能写本地路径,否则还是会报找不到库文件。


真是个无聊的问题,spark和hadoop怎么配lzo没啥可说的。