padluo avatar

Spark实战(6)_spark-sql -e -f -i命令的整合和spark-sql日常作业开发流程总结

padluo

Published: 24 May 2018 › Updated: 24 May 2018Spark实战(6)_spark-sql -e -f -i命令的整合和spark-sql日常作业开发流程总结

Spark实战(6)_spark-sql -e -f -i命令的整合和spark-sql日常作业开发流程总结

背景介绍

在日常工作中,我们可以在一个shell脚本里面利用spark-sql -e执行sql脚本,而且可以传参数,但是存在一个问题,shell脚本对格式要求严格,而且shell脚本和spark-sql的脚本混在一起,内容庞大凌乱,不好管理。而spark-sql -f可以执行一个hql文件,但是不能传参数进去,这就引出了一个问题,有没有一种方法,既可以把shell和hql脚本分开,shell负责调度hql脚本,并且可以在shell中把参数传递到hql中,hql脚本文件只负责写hql。

sparkF功能开发的思路

开发一个sparkF的功能,用法同spark-sql -f,但支持传参,使用格式:

  • sparkF aa.sql
  • sparkF aa.sql -date 2015-01-02
  • sparkF aa.sql -date 2015-01-02 -date1 2015-01-03

其中,aa.sql里通过${date}的方式对接替换为想传递的参数值。

sparkF开发思路

最终的使用方式,sparkF aa.sql -date 2015-01-02

  • 开发一个Java应用程序读出aa.sql内容存入一个String变量里。
  • 把里面的${date}替换为2015-01-02,并System.out.println出来。
  • 在shell脚本里,用str接收System.out.println的输出,执行spark-sql -e $str
cd /export/project
mkdir bin
cd bin
touch sparkF

难点,把Java程序的输出结果直接放到shell脚本里运行

例如,运行sparkF aa.sql -date 2015-01-02

首先,Java运行jar,把参数传进来,shell脚本里$*接收参数。参数是哪里传的呢?哪里传给sparkF的呢?是shell脚本aa.sh传过来的,sparkF ./aa.sql -dt $yestoday,交给java来处理,把sql脚本里的占位参数替换为传递的参数值后,打印的str由cmd来接收,再用spark-sql -e执行。

#!/bin/sh
. /etc/profile

cmd=`java -jar /export/project/lib/SparkF.jar $*`
echo $cmd
spark-sql -e "$cmd" -i /export/project/bin/init.hql

/export/project/lib/sparkF.jar,路径可以不写死,可以给它配一个环境变量。

/export/project/bin/init.hql,作为一个公共的UDF文件,在sparkF中通过spark-sql -i /export/project/bin/init.hql调用,在-e执行之前,用-i进行初始化。

chmod +x hiveF
# 加入环境变量
vi /etc/profile
export PATH=$PATH:/export/project/bin

source /etc/profile

添加maven插件,打包SparkF.jar。

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

执行验证结果,

sh /export/project/fct_session_info/fct_session_info.sh 2015-08-28

spark-sql日常作业开发流程

sparkF aa.hql -date 2015-01-02为例,

在aa.hql脚本中编写业务逻辑处理脚本,如果有参数,假设参数是dt,在脚本中用{dt}占位符代替(取决于开发SparkF.jar时的定义),然后通过aa.sh调度aa.hql,如sh aa.sh $yestoday,并且在aa.sh中利用我们开发的sparkF的功能,如sparkF ./aa.hql -dt $yestoday

这样,可以实现hql业务处理逻辑和shell脚本分离,并且可以把自定义的UDF统一放在一个hql文件中统一管理,在sparkF命令中通过spark -i init.hql统一引用。如:

add jar /export/project/lib/hive_udf.jar ;
create temporary function GetActID as 'com.padluo.hive.udf.GetActID';

本文首发于steem,感谢阅读,转载请注明。

https://steemit.com/@padluo


微信公众号「padluo」,分享数据科学家的自我修养,既然遇见,不如一起成长。

数据分析


读者交流电报群

https://t.me/sspadluo


知识星球交流群

知识星球读者交流群

Leave Spark实战(6)_spark-sql -e -f -i命令的整合和spark-sql日常作业开发流程总结 to:

Written by

Read more #cn posts


Best Posts From padluo

We have not curated any of padluo's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.

More Posts From padluo