我正在研究用于调用Sqoop codegen和导入作业的shell脚本,我需要一种方法来遍历数据库中所有表的列表并并行运行作业,但只能批量运行,所以我不要使数据库或我的服务器过载。
例如,当指定为所有表运行时,我获取数据库中所有表的列表,并将它们的名称放入一个数组中,迭代它并为每个表创建一个后台作业。
main(){
if [[ $table_name = "all" ]]; then
for table in "${_tablesList_[@]}"; do
if [[ $job = "codegen" ]]; then
codegen $schema_name ${schema_name^^}.${table^^} $CODEGEN_HOME/${schema_name^^}/${table^^} $CODEGEN_HOME/${schema_name^^}/${table^^} &> $LOGS_HOME/${schema_name^^}/codegen/$table/$_timestamp_ &
fi
done
fi
}
codegen() {
schema_name=$1
table_name=$2
outdir=$3
bindir=$4
sqoop job --exec ${schema_name}_codegen -- --table $table_name --outdir $outdir --bindir $bindir &
PID=$!
wait PID
... some more logic to run after the sqoop job ...
}
问题是,从一小部分表中可以有任何地方,最多400个或更多。
我的想法是批量遍历列表,一次说10个,然后等待所有这些完成,然后执行下一个10,依此类推,直到所有表都已运行。
一次存储10个PID的最佳方法是什么,等待它们全部完成,然后在main()中继续循环接下来的10个表,依此类推?
我有一个想法是将我拥有的表数除以10,然后创建许多其他列表,并逐个迭代每个单独的列表。