crontab shell調用spark-sql,實現週期性動態SQL批量自動執行

對於熟悉Scala開發的人來說,對於spark-sql的使用,直接jar包中寫入代碼處理就能輕鬆實現動態語句的執行。
但是對於我,不打算學習Scala和Java語言,但是又想定時執行時間推延的週期、定時任務,該腫麼辦?

spark-sql CLI幾個參數,完全滿足我等非專業人員。

CLI options:
 -d,--define <key=value>          Variable subsitution to apply to hive
                                  commands. e.g. -d A=B or --define A=B
    --database <databasename>     Specify the database to use
 -e <quoted-query-string>         SQL from command line
 -f <filename>                    SQL from files
 -H,--help                        Print help information
    --hiveconf <property=value>   Use value for given property
    --hivevar <key=value>         Variable subsitution to apply to hive
                                  commands. e.g. --hivevar A=B
 -i <filename>                    Initialization SQL file
 -S,--silent                      Silent mode in interactive shell
 -v,--verbose                     Verbose mode (echo executed SQL to the
                                  console)
###########################
-e 可以在命令中帶sql語句,但是明顯不適合大量的sql。小量語句可以考慮。
-f sql文件,只要把sql寫入文件,直接批量提交,全部語句一次性任務,如果週期變化了,怎麼辦?
--hiveconf 主角登場,可以把參數帶入sql語句中替換,在shell中賦值,實現動態sql。

測試前提:預先pcp2表是存在的,這裏不錯複雜判斷表格是否存在後再查詢。
###########################################################
測試一:
#簡單替換SQL中的參數 -hiveconf 把2個參數替代sql文件裏面的動態參數
spark-sql -S -hiveconf table_name='pcp2' -hiveconf row_limit='10' -f /opt/hadoop/sql/spark-test.sql

#########################
--這個SQL文件中,查詢的表名字,返回的條目數,由外部輸入。
spark-test.sql  內容如下:

show tables;
select * from ${hiveconf:table_name} limit ${hiveconf:row_limit};

插圖1

#########################
[root@snn sql]# spark-sql -S -hiveconf table_name='pcp2' -hiveconf row_limit='10' -f /opt/hadoop/sql/spark-test.sql
15/12/18 11:41:59 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
15/12/18 11:42:09 WARN MetricsSystem: Using default name DAGScheduler for source because spark.app.id is not set.
SET hive.support.sql11.reserved.keywords=false
15/12/18 11:43:23 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
SET spark.sql.hive.version=1.2.1
SET spark.sql.hive.version=1.2.1
15/12/18 11:43:39 WARN YarnScheduler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
external_2000w  false
external_2000w_new      false
external_bz2_tbl_6005   false
external_tar_gz_tbl_6005        false
external_tbl_6005       false
hive_user_info  false
pcp     false
pcp2    false
sqoop_test      false
tbl_6005        false
test_table_16538        false
test_table_16539        false
浙江    杭州    300
浙江    寧波    150
浙江    溫州    200
浙江    嘉興    100
江蘇    南京    270
江蘇    蘇州    299
江蘇    某市    200
江蘇    某某市  100
[root@snn sql]#

###########################################################
測試二:
#shell外部傳入參數SQL執行。
/bin/bash ./spark-parameter.sh pcp2 10

#################
spark-parameter.sh  內容如下:

#!/bin/bash
sh_table_name=$1
sh_row_limit=$2
$SPARK_HOME/bin/spark-sql -S -hiveconf table_name=$sh_table_name -hiveconf row_limit=$sh_row_limit -f /opt/hadoop/sql/spark-test.sql

插圖2

#########################
[root@snn sql]# /bin/bash ./spark-parameter.sh pcp2 10
15/12/18 11:52:32 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
15/12/18 11:52:43 WARN MetricsSystem: Using default name DAGScheduler for source because spark.app.id is not set.
SET hive.support.sql11.reserved.keywords=false
15/12/18 11:53:52 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
SET spark.sql.hive.version=1.2.1
SET spark.sql.hive.version=1.2.1
15/12/18 11:54:09 WARN YarnScheduler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
external_2000w  false
external_2000w_new      false
external_bz2_tbl_6005   false
external_tar_gz_tbl_6005        false
external_tbl_6005       false
hive_user_info  false
pcp     false
pcp2    false
sqoop_test      false
tbl_6005        false
test_table_16538        false
test_table_16539        false
浙江    杭州    300
浙江    寧波    150
浙江    溫州    200
浙江    嘉興    100
江蘇    南京    270
江蘇    蘇州    299
江蘇    某市    200
江蘇    某某市  100
[root@snn sql]#

###########################################################
測試三:
#小量SQL測試需要,固定2個參數,可以根據需要調整一下。
#方便crontab自動觸發shell,shell可以浮動生成日期後綴。
/bin/bash ./spark-autoparameter.sh pcp2 10

##############
spark-autoparameter.sh 內容如下:(注意shell文件中*星號這個通配符,後面引用需要引號,否則做文件匹配)

#!/bin/bash
sh_table_name=$1
sh_row_limit=$2
#seconds from 1970-01-01
date_seconds=`date +%s`
echo $date_seconds
sh_table_date=`expr $date_seconds / 86400`
echo $sh_table_date
#Statment_create
creat_sql="create table ${sh_table_name}_$sh_table_date as select * from ${sh_table_name} limit ${sh_row_limit};"
echo "${creat_sql}"
$SPARK_HOME/bin/spark-sql -e "${creat_sql}"

插圖3

#########################
[root@snn sql]# /bin/bash ./spark-autoparameter.sh pcp2 10
1450413019
16787
create table pcp2_16787 as select * from pcp2 limit 10;
15/12/18 12:30:45 WARN MetricsSystem: Using default name DAGScheduler for source because spark.app.id is not set.
SET hive.support.sql11.reserved.keywords=false
15/12/18 12:31:54 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
SET spark.sql.hive.version=1.2.1
SET spark.sql.hive.version=1.2.1
Time taken: 21.701 seconds
[root@snn sql]#

##############  檢查新表是否生成?
[root@snn sql]# spark-sql
15/12/18 12:33:06 WARN MetricsSystem: Using default name DAGScheduler for source because spark.app.id is not set.
SET hive.support.sql11.reserved.keywords=false
15/12/18 12:34:13 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
SET spark.sql.hive.version=1.2.1
SET spark.sql.hive.version=1.2.1
spark-sql> select * from pcp2_16787;
浙江    杭州    300
浙江    寧波    150
浙江    溫州    200
浙江    嘉興    100
江蘇    南京    270
江蘇    蘇州    299
江蘇    某市    200
江蘇    某某市  100
Time taken: 19.368 seconds, Fetched 8 row(s)
spark-sql>

###########################################################
測試四:
#方便crontab自動觸發shell,shell可以浮動生成日期後綴。
#代碼量很大,-e 不適合處理時,可以shell調用sql文件
/bin/bash ./spark-autoparameter_sql_file.sh pcp2

## spark-autoparameter_sql_file.sh ,如下:

#!/bin/bash
sh_table_name=$1
#seconds from 1970-01-01
date_seconds=`date +%s`
echo $date_seconds
sh_table_date=`expr $date_seconds / 86400`
echo $sh_table_date
#Statment_create
$SPARK_HOME/bin/spark-sql -S -hiveconf table_name="another_${sh_table_name}_${sh_table_date}" -hiveconf org_table_name="${sh_table_name}" -f /opt/hadoop/sql/spark-create.sql

##需要執行的sql語句集合,如下:
spark-create.sql

create table ${hiveconf:table_name} as select * from ${hiveconf:org_table_name};
show tables;

插圖4

#########################
[root@snn sql]# vi spark-autoparameter_sql_file.sh
[root@snn sql]# /bin/bash ./spark-autoparameter_sql_file.sh pcp2
1450414909
16787
15/12/18 13:02:15 WARN MetricsSystem: Using default name DAGScheduler for source because spark.app.id is not set.
SET hive.support.sql11.reserved.keywords=false
15/12/18 13:03:23 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
SET spark.sql.hive.version=1.2.1
SET spark.sql.hive.version=1.2.1
another_pcp2_16787      false             -------------生成的表
external_2000w  false
external_2000w_new      false
external_bz2_tbl_6005   false
external_tar_gz_tbl_6005        false
external_tbl_6005       false
hive_user_info  false
pcp     false
pcp2    false
pcp2_16787      false
sqoop_test      false
tbl_6005        false
test_table_16538        false
test_table_16539        false
[root@snn sql]#

##############  檢查新表

[root@snn sql]# spark-sql
15/12/18 13:07:03 WARN MetricsSystem: Using default name DAGScheduler for source because spark.app.id is not set.
SET hive.support.sql11.reserved.keywords=false
15/12/18 13:08:12 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
SET spark.sql.hive.version=1.2.1
SET spark.sql.hive.version=1.2.1
spark-sql> select * from another_pcp2_16787;
浙江    杭州    300
浙江    寧波    150
浙江    溫州    200
浙江    嘉興    100
江蘇    南京    270
江蘇    蘇州    299
江蘇    某市    200
江蘇    某某市  100
Time taken: 18.441 seconds, Fetched 8 row(s)

spark-sql>


至此,圓滿完成簡單的shell和spark-sql結合,只要根據需要修改sql文件裏面的內容,在crontab -e中加入需要的環境變量或者腳本即可實現自動化。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章