[Linux]shell多进程并发—详细版

业务背景

schedule.sh脚本负责调度用户轨迹工程脚本的执行,截取部分代码如下:

#!/bin/bash
source /etc/profile;

export userTrackPathCollectHome=/home/pms/bigDataEngine/analysis/script/usertrack/master/pathCollect

##############################
#
# 流程A
#
##############################

# 验证机器搭配的相关商品数据源是否存在
lines=`hadoop fs -ls /user/pms/recsys/algorithm/schedule/warehouse/ruleengine/artificial/product/$yesterday | wc -l`
if [ $lines -le 0 ] ;then
    echo ‘Error! artificial product is not exist‘
    exit 1
else
    echo ‘artificial product is ok!!!!!!‘
fi

# 验证机器搭配的相关商品数据源是否存在
lines=`hadoop fs -ls /user/pms/recsys/algorithm/schedule/warehouse/mix/artificial/product/$yesterday | wc -l`
if [ $lines -le 0 ] ;then
    echo ‘Error! mix product is not exist‘
    exit 1
else
    echo ‘mix product is ok!!!!!!‘
fi

##############################
#
# 流程B
#
##############################

# 生成团购信息表,目前只抓取团购ID、商品ID两项
sh $userTrackPathCollectHome/scripts/extract_groupon_info.sh
lines=`hadoop fs -ls /user/hive/pms/extract_groupon_info | wc -l `
if [ $lines -le 0 ] ;then
    echo ‘Error! groupon info is not exist‘
    exit 4
else
    echo ‘groupon info is ok!!!!!‘
fi

# 生成系列商品,总文件大小在320M左右
sh $userTrackPathCollectHome/scripts/extract_product_serial.sh
lines=`hadoop fs -ls /user/hive/pms/product_serial_id | wc -l `
if [ $lines -le 0 ] ;then
    echo ‘Error! product serial is not exist‘
    exit 5
else
    echo ‘product serial is ok!!!!!‘
fi

# 预处理生成extract_trfc_page_kpi表--用于按照pageId进行汇总统计所在页面的pv数、uv数
sh $userTrackPathCollectHome/scripts/extract_trfc_page_kpi.sh $date
lines=`hadoop fs -ls /user/hive/pms/extract_trfc_page_kpi/ds=$date | wc -l`
if [ $lines -le 0 ] ;then
    echo ‘Error! extract_trfc_page_kpi is not exist‘
    exit 6
else
    echo ‘extract_trfc_page_kpi is ok!!!!!!‘
fi

# 同步term_category到hive,并将前台类目转换为后台类目
sh $userTrackPathCollectHome/scripts/extract_term_category.sh
lines=`hadoop fs -ls /user/hive/pms/temp_term_category | wc -l`
if [ $lines -le 0 ] ;then
    echo ‘Error! temp_term_category is not exist‘
    exit 7
else
    echo ‘temp_term_category is ok!!!!!!‘
fi

##############################
#
# 流程C
#
##############################

# 生成extract_track_info表
sh $userTrackPathCollectHome/scripts/extract_track_info.sh
lines=`hadoop fs -ls /user/hive/warehouse/extract_track_info | wc -l `
if [ $lines -le 0 ] ;then
    echo ‘Error! extract_track_info is not exist‘
    exit 1
else
    echo ‘extract_track_info is ok!!!!!‘
fi
...

如上,整个预处理环节脚本执行完,需要耗时55分钟。

优化

上面的脚本执行流程可以分为三个流程:

流程A->流程B->流程C

考虑到流程B中的每个子任务都互不影响,因此没有必要顺序执行,优化的思路是将流程B中这些互不影响的子任务并行执行。

其实linux中并没有并发执行这一特定命令,上面所说的并发执行实际上是将这些子任务放到后台执行,这样就可以实现所谓的“并发执行”,脚本改造如下:

#!/bin/bash
source /etc/profile;

export userTrackPathCollectHome=/home/pms/bigDataEngine/analysis/script/usertrack/master/pathCollect

##############################
#
# 流程A
#
##############################

# 验证机器搭配的相关商品数据源是否存在
lines=`hadoop fs -ls /user/pms/recsys/algorithm/schedule/warehouse/ruleengine/artificial/product/$yesterday | wc -l`
if [ $lines -le 0 ] ;then
    echo ‘Error! artificial product is not exist‘
    exit 1
else
    echo ‘artificial product is ok!!!!!!‘
fi

# 验证机器搭配的相关商品数据源是否存在
lines=`hadoop fs -ls /user/pms/recsys/algorithm/schedule/warehouse/mix/artificial/product/$yesterday | wc -l`
if [ $lines -le 0 ] ;then
    echo ‘Error! mix product is not exist‘
    exit 1
else
    echo ‘mix product is ok!!!!!!‘
fi

##############################
#
# 流程B
#
##############################

# 并发进程,生成团购信息表,目前只抓取团购ID、商品ID两项
{
    sh $userTrackPathCollectHome/scripts/extract_groupon_info.sh
    lines=`hadoop fs -ls /user/hive/pms/extract_groupon_info | wc -l `
    if [ $lines -le 0 ] ;then
        echo ‘Error! groupon info is not exist‘
        exit 4
    else
        echo ‘groupon info is ok!!!!!‘
    fi
}&

# 并发进程,生成系列商品,总文件大小在320M左右
{
    sh $userTrackPathCollectHome/scripts/extract_product_serial.sh
    lines=`hadoop fs -ls /user/hive/pms/product_serial_id | wc -l `
    if [ $lines -le 0 ] ;then
        echo ‘Error! product serial is not exist‘
        exit 5
    else
        echo ‘product serial is ok!!!!!‘
    fi
}&

# 并发进程,预处理生成extract_trfc_page_kpi表--用于按照pageId进行汇总统计所在页面的pv数、uv数
{
    sh $userTrackPathCollectHome/scripts/extract_trfc_page_kpi.sh $date
    lines=`hadoop fs -ls /user/hive/pms/extract_trfc_page_kpi/ds=$date | wc -l`
    if [ $lines -le 0 ] ;then
        echo ‘Error! extract_trfc_page_kpi is not exist‘
        exit 6
    else
        echo ‘extract_trfc_page_kpi is ok!!!!!!‘
    fi
}&

# 并发进程,同步term_category到hive,并将前台类目转换为后台类目
{
    sh $userTrackPathCollectHome/scripts/extract_term_category.sh
    lines=`hadoop fs -ls /user/hive/pms/temp_term_category | wc -l`
    if [ $lines -le 0 ] ;then
        echo ‘Error! temp_term_category is not exist‘
        exit 7
    else
        echo ‘temp_term_category is ok!!!!!!‘
    fi
}&

##############################
#
# 流程C
#
##############################

# 等待上面所有的后台进程执行结束
wait
echo ‘end of backend jobs above!!!!!!!!!!!!!!!!!!!!!!!!!!!!‘

# 生成extract_track_info表
sh $userTrackPathCollectHome/scripts/extract_track_info.sh
lines=`hadoop fs -ls /user/hive/warehouse/extract_track_info | wc -l `
if [ $lines -le 0 ] ;then
    echo ‘Error! extract_track_info is not exist‘
    exit 1
else
    echo ‘extract_track_info is ok!!!!!‘
fi

上面的脚本中,将流程B中互不影响的子任务全部放到了后台执行,从而实现了“并发执行”,同时为了不破坏脚本的执行流程:

流程A->流程B->流程C

就需要在流程C执行之前加上:

# 等待上面所有的后台进程执行结束
wait 

其目的是等待流程B的所有后台进程全部执行完成,才执行流程C

结论

经过优化后,脚本的执行时间,从耗时55分钟,降到了耗时15分钟,效果很显著。

时间: 2024-10-19 08:04:21

[Linux]shell多进程并发—详细版的相关文章

Linux Shell多进程并发以及并发数控制

1. 基础知识准备 1.1. linux后台进程 Unix是一个多任务系统,允许多用户同时运行多个程序.shell的元字符&提供了在后台运行不需要键盘输入的程序的方法.输入命令后,其后紧跟&字符,该命令就会被送往到linux后台执行,而终端又可以继续输入下一个命令了. 比如: sh a.sh & sh b.sh & sh c.sh & 这三个命令就会被同时送往linux后台执行,在这个程度上,认为这三个命令并发执行了. 1.2. linux文件描述符 文件描述符(缩

linux shell 创建并发后台执行任务并等待任务执行完成

#!/bin/bash echo "i am main" for i in $(seq 1 5) do { sleep 10; echo "i am $i"; }& done wait http://www.cnblogs.com/dorothychai/archive/2012/10/19/2730374.html linux shell 创建并发后台执行任务并等待任务执行完成

Linux基础命令(详细版)

本博文包含以下命令的使用方法: locale(语言相关) date(日期相关) cal(日历) bc(计算机) --help(help命令帮助) man(man手册帮助) cd(切换目录) pwd(显示当前工作路径) mkdir(创建文件夹) rmdir(删除空文件夹) ls(查看目录下内容) cp(复制) rm(删除) mv(移动) cat(查看文件内容) head(查看文件开头几行) tail(查看文件末尾几行) touch(创建文件或目录) find(查找) grep(过滤) locale

shell多进程并发数控制

在批量执行任务是,单进程执行速度太慢,使用&不加数量控制,又担心资源占用过多,导致宕机等问题,因此我们需要控制并发进程的数量,保证效率的同时,保证资源占用不会太高. 其中一个解决思路是利用简单的生产者-消费者模型. 以下为范例脚本: #!/bin/bash fifo_file=a.pipe mkfifo $fifo_file #创建任务队列 exec 5<>$fifo_file rm $fifo_file process_num=10 #并发任务的数量 function task()

Shell多进程并发

业务背景: 让a.sh和b.sh同时执行,而不是顺序执行 解决方案: s.sh负责调度a.sh和b.sh 代码如下: s.sh #!/bin/bash source /etc/profile; date='2015-05-06' echo 'start s.sh' sh a.sh $date > a.log 2>&1 & sh b.sh $date > b.log 2>&1 & echo 'end s.sh' a.sh #!/bin/bash sou

Linux shell脚本基础学习详细介绍(完整版)一

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

Linux shell脚本基础学习详细介绍(完整版)二

详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续. Linux shell脚本基础已经被分成好几个部分了,这里对控制流程的内容也就马上讲完了,这是最后一部分关于here document,这里举例稍微有点复杂,我们慢慢来分析这个复杂Linux shell脚本. 6. Here documents 当要将几行文字传递给一个命令时,here docu

linux网络编程-----&gt;高并发---&gt;多进程并发服务器

在做网络服务的时候并发服务端程序的编写必不可少.前端客户端应用程序是否稳定一部分取决于客户端自身,而更多的取决于服务器是否相应时间够迅速,够稳定. 常见的linux并发服务器模型: 多进程并发服务器 多线程并发服务器 select多路I/O转接服务器 poll多路I/O转接服务器 epool多路I/O转接服务器. 本次主要讨论多线程并发服务器模型: 使用多进程并发服务器时要考虑以下几点: 父进程最大文件描述个数(父进程中需要close关闭accpet返回的新文件描述符) 系统内创建进程个数(与内

linux 多进程并发服务__关于子进程回收的方法

以TCPServ 服务程序来说: 1)父进程:负责系统初始化,以及监听(listen),接受连接请求(accept);其中accept 默认阻塞调用. 2)每接受一个连接请求,动态新建(fork)一个子进程,任务完成或客户端断开,服务子进程需要退 出并收回系统资源. 3)根据linux的设计子进程的收回需要父进程参与(wait调用),而此时附进程主要服务工作在监听 客户端连接请求,同时阻塞在(accept)调用,所以父进程自身是无法"分身"去做子进程回收调用. 4)现在的问题在于如何找到父进程的