spark的定位是是替换掉hive和storm,企业里面hive百分之八十的命令都是通过hive-cli命令来调的,sparksql的作用等同于hive-cli。hive-cli是跑在mapreduce,sparksql是运行在spark上,通过sparksql --help可以看cli,比如指定内存,核数,以及执行cli的命令,他是完全仿造hive的。
比如在hive上执行:hive -e "select * from daily_visit",同样在spark中可以直接执行spark-sql -e "select * from daily_visit",这两个都可以执行hive的语句,如果我们想指定一些资源的话,可以这样写,spark-sql -e "select * from daily_visit" --master yarn --driver-cores 2 --driver-memory 1g或者spark-sql -f aa.sql --master yarn --driver-cores 2 --driver-memory 1g对应hive -f也是一样的。
然而必须能传参数,比如时间,才能推广使用,但是-f不支持,比如说spark-sql -f aa.sql 2015-05-08不支持,但是有很多方式进行封装,让他支持。-i通常用于初始化hive udf上,initialize hive file。
hive在企业里面就是写sql。无论什么作业,都是用shell脚本写。
比如一个shell脚本执行:sh rpt_sale_daily.sh 2015-01-01
more rpt_sale_daily.sh会出现:
#!/bin/sh
if [ $# = "1 " ]: then
date=$1
else
date='date -d -1days '+%Y-%m-%d'
fi
echo $date
cd /opt/cloudy/program/rpt_sale_daily
hiveF ./rpt_sale_daily.hql -date $date
if test $? -ne 0
then
exit 11
fi
hive2mysql ./aa.property -date $date
if test $? -ne 0
then
exit 21
fi
echo "123"
====
需求:开发一个命令,叫sparkF 比如sparkF ./aa.sql -date $date
val date = "2015-08-28" //通常通过参数传过来 val sqlStr = s""" |insert overwrite into daily_visit partition (date='$date') //日期,通常是通过参数传进来的 |select count(distinct guid) uv,sum(pv) pv, |count(case when pv>=2 then sessionid else null end) second_num, |count(sessionid) visits from |(select ds date, sessionid, max(guid) guid, count(url) pv from tracklog and hour='18' |and length(url) > 0 |group by ds,sessionid) a |group by date """.stripMargin
需要有sparkF这样一个命令,现在上千个hiveF这个命令,我只需要把她们换成sparkF即可。那整个hive的运行就可以都迁移到我们的spark上来了。