转自:
https://mp.weixin.qq.com/s/mXXJmDqtv7PyqglN9ekvNQ
本文针对有初级sql及python人工智能开发基础,需要执行定时任务的初学人员。
假设在工作中,要执行一个任务,大致要求如下:
一、每月执行一次定时任务;
二、用hive处理数据,并下载;
三、用python读取数据,送入机器学习算法训练,预测结果,保存结果;
四、读取预测结果,上传到数据库指定位置,并按月分区
(一)、关于定时任务crontab,命令网上可以搜到很多用法。在这里有一个坑需要注意,就是直接执行shell脚本时用到的python环境路径,可能与定时任务的python路径不同,导致执行脚本时报错,找不到模块。这里有一个小方法,写一个python程序test.py。
import sys
print(sys.path)
python test.py与crontab -e各执行一次,就可以看到两次路径是否相同了。还有一点,就是关于注册信息的问题,
kinit -kt /home/accunt/cluster_keytab/accunt.keytab accunt中的accunt是你自己的账户,没有这句话,程序也会报错。所以建议专门写一个定时任务,每隔几个小时执行一次该命令。
(二)、程序中经常会涉及到变量,比较常见的是时间变量,这样才能做到自动化,train_month_t=$(date +%Y%m -d '-1 month')这句话意思是,获取执行程序时的月份的前一个月,‘$’是定义一个变量,用$train_month_t传入sql语句中。exportHIVE_SKIP_SPARK_ASSEMBLY=true; 这句话的作用是在下载数据时,保证数据能够下载齐全。
(三)、为了降低shell脚本的篇幅,可以将python部分以子文件形式执行。这里为了防止在定时任务时,python路径不统一,使用python的环境路径执行程序。通过sys.argv[1]将参数$py_month传进去。这里的月份形式是'201808',传进去是字符串格式。
(四)、在数据库里建表,并将通过人工智能预测好的数据,上传到指定分区。
下面是模板内容:
#!/bin/bash
kinit -kt /home/accunt/cluster_keytab/accunt.keytab accunt
echo "***************************"
train_month_t=$(date +%Y%m -d '-1 month')
echo $train_month_t
echo "*************start*************"
sql_train="
create table if not exists test.t_test
(a string,
b string)
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as textfile;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table test.t_test
select a,b
from product.t_test
where day=concat('$train_month_t','01');
"
echo $sql_train >./train.sql
kinit -kt /home/accunt/cluster_keytab/accunt.keytab accunt
hive -f ./train.sql
export HIVE_SKIP_SPARK_ASSEMBLY=true;
hive -e "set hive.cli.print.header=true;
select distinct a,b from test.t_test;" >./train.csv
echo "*************train sql successful************"
kinit -kt /home/accunt/cluster_keytab/accunt.keytab accunt
./python ./train_pred.py $py_month
echo "*************py successful************"
load_sql="
create table if not exists test.result
(a string,
b string)
partitioned by (month string)
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as textfile
tblproperties('skip.header.line.count'='1');
LOAD DATA LOCAL INPATH './preds_$load_month.csv'
into table test.result PARTITION (month='$load_month');
"
echo $load_sql>./load.sql
kinit -kt /home/accunt/cluster_keytab/accunt.keytab accunt
hive -f ./load.sql
echo "*************load_sql successful************"
echo "*************successful************"
至此,一个简单的大数据人工智能预测分析脚本模板完成了,希望能有所帮助,并指出不足之处,共同进步!
转自:
https://mp.weixin.qq.com/s/mXXJmDqtv7PyqglN9ekvNQ