snapshot脚本一 一个完整项目的运行脚本

一个处理数据的脚本命令,将其注释也一起记录下。尤其是下面的hadoop启动部分

#!/usr/bin/env bash
##################################################
# @author: gaoxiang@staff.xxx.com.cn
# @date:   20200106
# @desc:   snapshot day main pipeline
##################################################
cd $(dirname `ls -l $0 | awk '{print $NF;}'`)/..
## s上面这行命令整体的含义是保证进入当前脚本文件的父目录的父目录中。是个固定的习惯写法,保证路径正确。实际到的位置,其里面有的文件是当前脚本文件的父亲的兄弟们
#其中 $0的含义是 应该是为包括执行文件路径在内文件名。比如 sh  /tmp/test_self.sh   其中的$0是包括了/tmp/test_self.sh在内的内容,
#s  $1是执行文件名后的第一个参数。
#上面的 awk '{print $NF;}':为输出最后一个Field(列)
# dirname的含义是? dirname其实就是获取某个目录或文件的路径,如dirname /etc/hosts,则结果会返回文件hosts的上一层路径: /etc;如果是目录 /usr/bin/,则同理返回上一层路径 /usr。
#但如果当前已经处于该目录下了,例如 /etc,则dirname则会返回一个点 “."表示正处于该目录。
# 最后的/..是当前目录的上一级目录 就是linux命令啊

WK_DIR=`pwd`
#s上面这行的含义是运行pwd这个linux命令的结果赋值给新建变量WK_DIR是的。`command`是执行command命令。
#s 优先使用绝对路径 (借助 $PWD),就是借助上面两行。另外 总用 ./ 来修饰相对路径.

WK_PRI_DIR=${WK_DIR}

##################################################
DEFAULT_CONF=${WK_PRI_DIR}/conf/default.conf
MONITOR_CONF=${WK_PRI_DIR}/conf/monitor.conf
ALERT_DIR=${WK_PRI_DIR}/alert
LIB_DIR=${WK_PRI_DIR}/lib
FLAG_DIR=${WK_DIR}/flag
LOG_DIR=${WK_DIR}/log
SCRIPT_DIR=${WK_DIR}/script
SRC_DIR=${WK_DIR}/src
HQL_DIR=${WK_DIR}/hql
DATA_DIR=${WK_DIR}/data
BIN_DIR=${WK_DIR}/bin

##################################################
#default config
source ${DEFAULT_CONF}
#s上面的source是指引用文件变量中的内容,可以包含其中的变量等内容,也就是说下面的变量可能是来自这些引用文件中定义的

#hive lib
source ${LIB_DIR}/.hive_config.sh
source ${LIB_DIR}/source $0 $1
source ${LIB_DIR}/my_hive_lib.sh
source ${ALERT_DIR}/ad_algo_fun_trap.sh
##################################################
# date_arg
if [ $# -eq 1 ]; then
#s上面代码的含义是传递到脚本的参数个数如果等于1,则
    dt=$1
else
    WARNING "uncorrent param: $@"
    exit 255
fi
##s上面标示应该正常情况下只要传一个dt日期参数就可以了


##################################################
# flag file
FLAG_DOING_FILE=${FLAG_DIR}/day_v1.${dt}.flag
FLAG_DONE_FILE=${FLAG_DIR}/day_v1.${dt}.done.flag

#s 疑惑? 这个目录FLAG_DOING_FILE(./flag/下面都没有day_v1.${dt}.flag的文件啊? --这个只是变量赋值。用作后面的重定向到的文件。

##################################################
set -o pipefail
#s  用 set -eo pipefail. 失败了就检查退出状态(exit codes). 如果不去 set -o pipefail,脚本中可能有指令失败了,然而脚本运行完毕之后仍然显示成功。
#s set -o pipefail用来解决这种情况,只要一个子命令失败,整个管道命令就失败,脚本就会终止执行
#set -o errexit
# 是否开启日志
source ${LIB_DIR}/execute_modular.sh $LOG_DIR
[ $open_log == true ] && exec &>>$LOG_FILE


## 保留N天日志 & flag文件
LOG_AND_EXECUTE "find ${LOG_DIR}/* -mtime +${KEEP_LOG} -delete || true"
#s  上面这行中的LOG_AND_EXECUTE函数、KEEP_LOG变量在source引用的conf/default.conf文件中设置了数值KEEP_LOG=30。行中的linux的find命令,其中参数 -mtime +n 表示表示文件更改时间距现在n天以前;
#s find里面没有查到-delete的参数,猜测含义应该就是删除命令。
#s 整体含义应该就是查找LOG_DIR目录下,将三十天以前的内容删除。即保留30天的日志信息。
# sss 明星后面加上 || true 这个是用来做什么的? 下面的hadoop命令也有加上了 || true  ???---解决:使用command || true,使得该命令即使执行失败,脚本也不会终止执行。

LOG_AND_EXECUTE "find ${FLAG_DIR}/* -mtime +${KEEP_FLAG} -delete || true"
LOG_AND_EXECUTE "find ${DATA_DIR}/* -mtime +${KEEP_FLAG} -delete || true"

##################################################
# 打开监控
source ${ALERT_DIR}/${shell_trap}
#s 其中的shell_trap=ad_algo_fun_trap.sh 在conf/default.conf
# 开启监控
#`$PROCESS --conf=${MONITOR_CONF} --state=L`
#trap 'traperror $? $LINENO $BASH_LINENO "<snapshot-plus> - <$dt> - ${BASH_COMMAND}"  "$(printf "::%s" ${FUNCNAME[@]})" "${ALERT_DIR}/${send_alert}"' ERR
function SUCCESS(){
    traperror 0 0 "null" "<data dt:$1> - <feed数据预处理:SUCCESS> - <$(basename $0)>" "null" "${ALERT_DIR}/${send_alert}"
}
#s 上面的traperror 是在 alert/ad_algo_fun_trap.sh定义的报警函数,具体如何弄的,暂时不看

##################################################
##################  数据预处理 ###################
##################################################

## 获取json格式数据
hdfs_tmp_dir="${HDFS_ROOT_PATH_SP_DAY}/tmp/dt=$dt/"
hdfs_etl_dir="${HDFS_ROOT_PATH_SP_DAY}/etl/dt=$dt/"
#HIVE_ROOT_PATH_SP_DAY="/user_ext/xxx_recmd_fe/video/feed_snapshot_v1/day"



## delete and mkdir
function PREPARE_DIR(){
    LOG_AND_EXECUTE "$HADOOP fs -rmr $1 || true"
    LOG_AND_EXECUTE "$HADOOP fs -mkdir -p $1"
    LOG_AND_EXECUTE "$HADOOP fs -chmod -R 777 $1"
}

## main etl
##SNAPSHOT_HIVE_PROCESS()里hive 执行的语句后生成数据(如何处理生成数据的是重点),给下面的SNAPSHOT_ETL_PROCESS里MapReduce阶段Map和Reduce去处理数据(map和reduce如何处理的是重点)
function SNAPSHOT_HIVE_PROCESS()
{
    LOG_AND_EXECUTE "PREPARE_DIR $hdfs_tmp_dir"
    #上面的function prepare_dir(){
    #    EXECUTE "hadoop fs -rmr $1 || true"
    #    EXECUTE "hadoop fs -mkdir -p $1"
##?? $hdfs_tmp_dir的定义没有找到,数据是放在那儿?
    local dt_playtime=`date -d "$dt" +"%Y-%m-%d"` #此处是为了将dt改为2020-07-16这样的格式给dt_playtime

    local hive_cmd="
        hive -f ${HQL_DIR}/feed_etl_day_v1.sql \
            --hiveconf output_dir=$hdfs_tmp_dir \
            --hiveconf dt_playtime=$dt_playtime \
            --hiveconf dt=$dt
    "
    LOG_AND_EXECUTE "$hive_cmd"
}

function SNAPSHOT_ETL_PROCESS()
{
    LOG_AND_EXECUTE "$HADOOP fs -rmr $hdfs_etl_dir || true"

    # -D stream.num.map.output.key.fields=4 \

    local hadoop_streaming="
        $HADOOP jar $HADOOP_STREAMING_JAR \
        -archives \"viewfs://c9/user_ext/zeus/VR/tools_python/Python.zip#Python\" \
        -files ${BIN_DIR}/common.py,${BIN_DIR}/config.py,${BIN_DIR}/operators.py,${BIN_DIR}/standarders.py,${BIN_DIR}/sign64.py,${BIN_DIR}/snapshot_etl_mapper.py,${BIN_DIR}/snapshot_etl_reducer.py \
        -D mapreduce.output.fileoutputformat.compress=true \
        -D mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec \
        -D yarn.scheduler.maximum-allocation-mb=10000 \
        -D mapred.reduce.slowstart.completed.maps=1.0 \
        -D mapreduce.job.reduces=1200 \
        -D mapreduce.job.name=feed_snapshot_etl_$dt \
        -D mapreduce.input.fileinputformat.split.minsize=3000000000 \
        -cmdenv PYTHONPATH=. \
        -input ${hdfs_tmp_dir} \
        -output ${hdfs_etl_dir} \
        -mapper \"Python/bin/python snapshot_etl_mapper.py\" \
        -reducer \"Python/bin/python snapshot_etl_reducer.py\"
        "
    LOG_AND_EXECUTE "${hadoop_streaming}"
    LOG_AND_EXECUTE "$HADOOP fs -rmr $hdfs_tmp_dir || true"
}
#上面hadoop Streaming参数的详解:
#$HADOOP jar $HADOOP_STREAMING_JAR \
#-archives \"viewfs://c9/user_ext/zeus/VR/tools_python/Python.zip#Python\" \    ####注释,此处是将我们自己的python解释器压缩包上传到服务器,
#-files ${BIN_DIR}/common.py,${BIN_DIR}/config.py,${BIN_DIR}/operators.py,${BIN_DIR}/standarders.py,${BIN_DIR}/sign64.py,${BIN_DIR}/snapshot_etl_mapper.py,${BIN_DIR}/snapshot_etl_reducer.py \
#                                                        ### 注释: -files参数 A command-separated list of files to be copied to the MapReduce cluster,
#-D mapreduce.output.fileoutputformat.compress=true \    ### 注释:此处是对输出的结果数据看是否进行压缩
#-D mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec \     ### 注释:此处是对输出的结果进行怎样的压缩
#-D yarn.scheduler.maximum-allocation-mb=10000 \   ### 注释  此处是分配给单个容器可申请的最大内存10
#-D mapred.reduce.slowstart.completed.maps=1.0 \   ### 注释 : 此处1.0是100%,命令含义是值待所有的maps任务执行结束后再启动reduce的任务
#-D mapreduce.job.reduces=1200 \                   ###注释:此处是设置reduce的节点个数为1200.(reduce的个数和输出文件的个数是一样的)
#-D mapreduce.job.name=feed_snapshot_etl_$dt \     ### 给启动的mapReduce任务起个名字,监控表中以此名字作为标示
#-D mapreduce.input.fileinputformat.split.minsize=3000000000 \    ####注释 每个map的最小split的大小为300M ,default为0,此参数影响启动的map个数。了解即可
#                                                                #####当小文件太多的时候需要设置这个,但如果设置太大将导致输入切分较少,影响并行度。若minSize大于blockSize(block<min<max),则按照minSize切分文件(多个block组成一个split)
#-cmdenv PYTHONPATH=. \
#-input ${hdfs_tmp_dir} \                                ####注释 参数-input  The DFS input path for the Map step
#-output ${hdfs_etl_dir} \                                ####注释 参数-output  The DFS output directory for the Reduce step。启动执行的脚本里定义了路径,hdfs_etl_dir="${HDFS_ROOT_PATH_SP_DAY}/etl/dt=$dt/"
#-mapper \"Python/bin/python snapshot_etl_mapper.py\" \   ###注释:The command to be run as the mapper ,用python 运行自己写的mappe.py文件
#-reducer \"Python/bin/python snapshot_etl_reducer.py\"   ###注释: The command to be run as the reducer,用python 运行自己写的reducer.py文件
#"


##################################################
################## 运行主脚本 ####################
##################################################
LOG "##################################################"

## 生成flag doing文件
LOG_AND_EXECUTE "touch $FLAG_DOING_FILE"
#s  touch命令用于修改文件或者目录的时间属性 ,上面是修改为当前系统时间。

## 主函数
SNAPSHOT_HIVE_PROCESS
SNAPSHOT_ETL_PROCESS
## 生成flag done文件
LOG_AND_EXECUTE "touch $FLAG_DONE_FILE"
LOG_AND_EXECUTE "rm -f $FLAG_DOING_FILE"
## 发送邮件(根据自己需要设置)
# SUCCESS $dt
# LOG "pipline feed-snapshot-etl-day <dt:$dt> is done!"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值