但是對於我,不打算學習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中加入需要的環境變量或者腳本即可實現自動化。