如下是各種數據分析的工做流pipeline管道模型的框架和庫包,包含特定科學等業務領域行業或者通用領域,結合大數據big data分析的各類開放源碼項目。包括下一代測序技術(NGS)打開了數據分析的空間,生物學成爲數據密集領域,愈來愈多的生物數據須要經過複雜的計算工具(集羣、雲端和網格計算)進行NGS處理和分析。html
工做流開源系統 | 網址 | 現類 |
---|---|---|
Arvados | http://arvados.org | 產品級的數據科學平臺,能處理大數據集,由兩個主要系統組成以及涵蓋不少相關服務與組件,包括API SDK和虛擬化工具。 |
Taverna | http://www.taverna.org.uk/ | 一個與具體領域無關的獨立的工做流管理系統,包括一系列工具用於設計和科學工做流程的實現。 |
Galaxy | http://galaxyproject.org/ | 基於web用於數據密集的生物醫學研究 |
SHIWA | http://www.erflow.eu/ | 跨國的歐洲工做流用戶社區推出的用於科學研究的工做流。 |
Oozie | https://oozie.apache.org/ | 是一個用於管理Apache Hadoop job的工做流調度系統。 |
DNANexus | https://wiki.dnanexus.com/API-Specification-v1.0.0/IO-and-Run | 不只能在雲端存儲和分析文件,也有助於協助 註釋和虛擬化你的數據。 |
BioDT | http://www.biodatomics.com/ | 下一代生物信息學工具 |
Agave | http://agaveapi.co/live-docs/ | 一個Science-as-a-Service API平臺 |
DiscoveryEnvironment | http://www.iplantcollaborative.org/ci/discovery-environment | iPlant 的信息基礎平臺 |
Wings | http://www.wings-workflows.org/ | 是一個語義工做流系統,輔助科學家進行計算體驗設計。 |
Knime | https://www.knime.org/ | 強大的大數據分析和挖掘能力。 |
Drake | https://github.com/Factual/drake | 易於使用可擴展 基於文本的數據工做流工具,組織圍繞數據的命令行執行,相似GNU的 Make |
Snakemake | https://bitbucket.org/johanneskoester/snakemake | 是一個工做流管理系統,下降建立工做流的難度複雜性,提供快速舒服的執行環境。 |
BPipe | http://bpipe.org | 用於生物學領域的任務運行,用以替代各類腳本任務。 |
Ruffus | https://code.google.com/p/ruffus/ | Python可計算的Pipeline,用於生物信息學在並行流程中管理依賴。 |
NextFlow | http://nextflow.io | 借鑑Unix管道模型,提供一個流暢的DSL,容許你處理複雜的流交互。 |
Luigi | http://github.com/spotify/luigi | Luigi是一個Python (2.7, 3.3, 3.4, 3.5)庫包,幫助你創建複雜的批工做的管道模型pipeline,它處理依賴問題,工做流管理,虛擬化,處理失敗,集成命令行等不少功能。 |
SciLuigi. | http://github.com/samuell/sciluigi | |
GATK Queue | https://www.broadinstitute.org/gatk/guide/topic?name=queue | 創建一個分析管道模型有效率運行GATK和其餘工具 |
Yabi | https://ccg.murdoch.edu.au/yabi | |
seqware | https://seqware.github.io/ | https://seqware.github.io/docs/6-pipeline/ |
Ketrew | https://github.com/hammerlab/ketrew | 一個提供EDSL API的OCaml庫 |
Pegasus | http://pegasus.isi.edu/ | 工做流管理系統,自動恢復和調式科學計算。 |
Airflow | https://github.com/airbnb/airflow(重複) | |
Cosmos/ Cosmos2: | https://github.com/LPM-HMS/COSMOS2 | 主流的並行工做流Python庫包,生物科學領域下一代序列流管道模型,提供命令行工具自動利用計算集羣能力,提供Web儀表板監視,調試,分析你的job。 |
Pinball | https://github.com/pinterest/pinball | Pinball是個可伸縮擴展的工做流管理器,基於組件,狀態以可讀格式保存,可靠,管理友好。 |
bcbio | https://bcbio-nextgen.readthedocs.org/en/latest/ | 提供高吞吐量數據序列流分析,只要編寫高層配置指定輸入和分析參數,輸入會驅動並行管道模型處理被分發的執行任務,冪等處理可從新啓動,透明的事務步驟。 |
Chronos | https://github.com/mesos/chronos | Chronos是一個linux cron的替代,它是分佈式的失敗容錯的調度器,運行在 Apache Mesos之上,支持定製優化Mesos執行器做爲默認的命令執行器。 |
Azkaban | https://azkaban.github.io/ | 是一個批工做流任務調度器,由LinkedIn建立,用於運行Hadoop job,解決了job的依賴順序,提供易於使用的Web用戶界面維護和跟蹤你的處理流程。 |
Apache NiFi | https://nifi.apache.org/docs/nifi-docs/html/overview.html | 系統之間數據流程的自動化,當數據流使用在各類場合,使用它自動化和管理系統之間信息流動。 |
flowr (R-based) | http://docs.flowr.space/ | Flowr讓你設計和實現複雜的管道模型,部署在你的計算集羣,知足生物信息學須要。 |
Mistral | https://github.com/arteria-project | 從主流並行序列流中處理序列數據,提供組件實現自動分析和數據管理任務做爲下一代序列流中心,平衡微服務架構,使用StackStorm建立一個事件驅動的自動化系統。靈活可伸縮。 |
nipype | http://nipy.org/nipype/ | |
End of Day | https://github.com/joestubbs/endofday | docker 容器的可執行工做流,可使用yaml文件定義。 |
BioDSL | https://github.com/maasha/BioDSL | 用於生物學的領域特定語言。 |
BigDataScript | http://pcingola.github.io/BigDataScript/ | 在筆記本上開發的數據分析管道模型能夠運行在大數據幾千節點集羣上。 |
Omics Pipe: | http://sulab.scripps.edu/omicspipe/ | 開源模塊計算平臺,自動化multi-omics數據分析管道模型的最佳實踐。 |
Ensembl Hive | https://github.com/Ensembl/ensembl-hive | eHive是一個在分佈式計算資源運行計算管道模型的系統。 |
QuickNGS | http://bifacility.uni-koeln.de/quickngs/web | 下一代測序數據的高吞吐量的數據分析。 |
GenePattern | http://www.broadinstitute.org/cancer/software/genepattern/ | 提供數百個分析工具,分析 gene expression (RNA-seq 和 microarray), sequence variation and copy number, proteomic, flow cytometry, 和網絡分析 |
Chipster | http://chipster.csc.fi/ | 新一代測序(NGS),提供超過350分析工具 |
The Genome Modeling System | https://github.com/genome/gms | |
Cuneiform, | https://github.com/joergen7/cuneiform | 函數式工做流語言 |
Anvaya | http://www.ncbi.nlm.nih.gov/pubmed/22809419 | 自動化基因分析的工做流環境 |
Makeflow | http://ccl.cse.nd.edu/software/makeflow/ | 在集羣 雲端和網格之上執行大型複雜工做流引擎 |
Airavata | http://airavata.apache.org/ | 基於集羣,雲端和網格之上組合,管理,執行和監視大規模可伸縮應用和工做流引擎 |
Pyflow | https://github.com/Illumina/pyflow | 一個輕量的並行任務引擎 |
Clusterflow | https://github.com/ewels/clusterflow | 一個管道模型工具,在集羣環境自動化和標準化生物分析。 |
Unipro UGENE | http://ugene.net/ | https://dx.doi.org/10.7717/peerj.644 |
CloudSlang | http://www.cloudslang.io/ | 管理協調Docker和CoreOS應用,快速化自動DevOps |
Stacks | http://catchenlab.life.illinois.edu/stacks/ | 用於構建Ioci的軟件管道模型 |
Leaf | http://www.francesconapolitano.it/leaf/index.html | 用於數據流Bioinformatic Protocol的設計和管理的Python工具 |
omictools | http://omictools.com/ | 提供11573 種分析工具 |
Job 描述語言 | https://edms.cern.ch/ui/file/590869/1/WMS-JDL.pdf | |
YAWL | http://www.yawlfoundation.org/ | 一個BPM/工做流系統,基於簡明和強大的模型語言,處理複雜數據轉換,徹底集成各類Web服務。 |
Triquetrum | https://github.com/eclipse/triquetrum/ | 科學工做流的管理和執行。 |
Kronos | https://github.com/jtaghiyar/kronos | 癌症和腫瘤信息分析 |
qsubsec | https://github.com/alastair-droop/qsubsec | 基於SGE grid system的模板語言,產生用於提交任務的腳本語言。 |
YesWorkflow | http://yesworkflow.org | 將工做流模型帶到腳本語言中 |
GWF - Grid WorkFlow | https://github.com/mailund/gwf | 小的相似make的經過qsub提交工做流的工具。 |
Fireworks | https://pythonhosted.org/FireWorks/ | 是一個定義 管理和執行工做流的框架,能使用 Python, JSON, 或 YAML定義複雜工做流,存儲在MongoDB中,可以經過Web界面監視,工做流執行能自動跨無數個計算資源執行。 |
NGLess | https://github.com/luispedro/ngless | 是下一代測序NGS 的領域特定語言。 |
Drake--易於使用可擴展 基於文本的數據工做流工具,組織圍繞數據的命令行執行,相似GNU的 Make java
【項目地址】https://github.com/Factual/drake
【項目簡介】清理髒數據,輸入輸出更可控一些。
【入門例子】https://github.com/Factual/drake/wiki/Tutorialpython
ruichao-factual編輯這個頁面on 25 Nov 2013 ·linux
本教程是一項正在進行中的工做。 若是有一個特定的話題你想覆蓋,請經過 Google Group for Drake.讓咱們知道。git
你工程所寫的Drake workflow文件將指定運行哪些步驟。 通常來講,每個step都依賴於一個或多個輸入源,並將建立一個或多個輸出組件。github
Drake workflow文件經過step來組織。 除了指定輸入和輸出,一個step一般會包含明確的命令,可能還有額外的選項。web
這裏有一個案例是一個簡單的step:docker
; we only like lines with lowercase "i" in them out.csv <- in.csv [shell] grep i $INPUT > $OUTPUT
上面的步驟使用drake的「shell」協議,這意味着命令爲shell命令。 (也能夠有其餘的協議,必須顯式地指定。 但在本教程中,咱們將主要關注如何使用shell協議。)shell
讓咱們逐步的分解上述步驟的特定參數:express
基本的依賴關係管理
一個Drake workflow可能會有不少的step,他們可能會以各類方式相互依賴。 當咱們考慮了這個額外的狀況事,上面的例子將被增長:
; produce an extraordinarily fancy report count.txt <- out.csv wc $INPUT > $OUTPUT
這一步取決於out.csv
(也就是說,它使用out.csv
做爲它的輸入文件),併產生count.txt
。 由於依賴out.csv
,Drake將默認狀況下肯定out.csv
是最新的。 這意味着若是有必要的話,Drake將運行所需的step(s)建立out.csv
)。 (這種行爲是基本依賴關係管理的宗旨,這很像咱們知道的也喜歡使用的工具--Make。)
Drake的命令行接口容許咱們首先執行哪一個特定的step,也有其餘各類命令選項。 可是,默認狀況下,Drake將嘗試在您的workflow運行的全部steps。
有關Drake命令行選項的更多細節,包括選項,請參閱完整的用戶手冊。
可是咱們要提早。 讓咱們經過如下例子來學習……
Drake是創建工做流運行數據。 默認狀況下,它在尋找工做流程文件在路徑./Drakefile
。 這就是爲何若是你運行它在沒有./Drakefile
文件的地方時,Drake有時會報錯找不到工做流程文件。
讓咱們開始一個新的工做流程,在一個新目錄:
$ mkdir /myworkflow $ cd /myworkflow
如今建立一個簡單的工做流。 建立一個文件命名workflow.d
和把這個(前面示例拷貝便可):
; we only like lines with lowercase "i" in them out.csv <- in.csv grep i $INPUT > $OUTPUT
這是一個很是簡單的Drake workflow,只有一個步驟。 這個step運行一個shell命令,使用in.csv
輸入文件和輸出寫入output.csv
。
咱們尚未一個輸入文件,因此讓咱們建立它。 建立一個文件命名in.csv
和而後發那個放入一些測試數據,以下所示:
Artem,Boytsov,artem Aaron,Crow,aaron Alvin,Chyan,alvin Maverick,Lou,maverick Vinnie,Pepi,vinnie Will,Lao,will
酷,如今咱們有一個Drake workflow和一個簡單的輸入文件運行工做流。 讓咱們運行它!
$ drake -w workflow.d
讓咱們檢查輸出:
$ more out.csv Alvin,Chyan,alvin Maverick,Lou,maverick Vinnie,Pepi,vinnie Will,Lao,will
; load the plugin defination %include $[PROFILE] ; script plugin_version="1.0" plugin_home=/var/weiboyi/azkaban/UnifiedDataProcessing/douyuCrawlParser plugin_user_info_generator=$[plugin_home]/app/$[plugin_version]/bin/douyu_account_info_generator.sh plugin_media_info_generator=$[plugin_home]/app/$[plugin_version]/bin/douyu_media_info_generator.sh plugin_user_info_config_generator=$[plugin_home]/app/$[plugin_version]/config/douyu_account_generator_pig.params plugin_media_info_config_generator=$[plugin_home]/app/$[plugin_version]/config/douyu_media_generator_pig.params ; hdfs crawled data path hdfs_douyu_crawled_info_path=/tech/azkaban/data_processing/crawler2/douyu ; [account_input_data] hdfs crawled account data path hdfs_account_info_path=$[hdfs_douyu_crawled_info_path]/account_info hdfs_account_info_data_tag=$[hdfs_account_info_path]/data/douyu_account_info ; [media_input_data] hdfs crawled media data path hdfs_media_info_path=$[hdfs_douyu_crawled_info_path]/media hdfs_media_info_data_tag=$[hdfs_media_info_path]/data/douyu_media account_info_latest_path=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_account_info_data_tag] --item_count=1 --data_hdfs_path_list) account_info_latest_date=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_account_info_data_tag] --item_count=1 --valid_time) account_info_schema_path=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_account_info_data_tag] --item_count=1 --schema_hdfs_path) media_info_latest_path=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_media_info_data_tag] --item_count=1 --data_hdfs_path_list) media_info_latest_date=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_media_info_data_tag] --item_count=1 --valid_time) media_info_schema_path=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_media_info_data_tag] --item_count=1 --schema_hdfs_path) ; schema version account_info_schema_version=1.0 media_info_schema_version=1.0 ; hdfs output data path hdfs_feature_data_path=/tech/azkaban/data_processing/feature_generator/douyu/data hdfs_account_info_snapshot_path=$[hdfs_feature_data_path]/account_info_snapshot hdfs_account_info_snapshot_schema_path=$[hdfs_account_info_snapshot_path]/schema hdfs_account_info_snapshot_data_tag=$[hdfs_account_info_snapshot_path]/data/douyu_account_info_snapshot hdfs_media_snapshot_path=$[hdfs_feature_data_path]/media_info_snapshot hdfs_media_snapshot_schema_path=$[hdfs_media_snapshot_path]/schema hdfs_media_snapshot_data_tag=$[hdfs_media_snapshot_path]/data/douyu_media_info_snapshot account_info_snapshot_latest_path=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_account_info_snapshot_data_tag] --item_count=1 --data_hdfs_path_list) account_info_snapshot_latest_date=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_account_info_snapshot_data_tag] --item_count=1 --valid_time) account_info_snapshot_schema_path=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_account_info_snapshot_data_tag] --item_count=1 --schema_hdfs_path) media_snapshot_latest_path=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_media_snapshot_data_tag] --item_count=1 --data_hdfs_path_list) media_snapshot_latest_date=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_media_snapshot_data_tag] --item_count=1 --valid_time) media_snapshot_schema_path=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_media_snapshot_data_tag] --item_count=1 --schema_hdfs_path) ; douyu account info snapshot hdfs:$[hdfs_account_info_snapshot_data_tag]_v$[account_info_schema_version]_$[account_info_latest_date], hdfs:$[hdfs_account_info_snapshot_schema_path]/schema_douyu_account_info_snapshot_v$[account_info_schema_version] <- hdfs:$[account_info_latest_path], hdfs:$[account_info_schema_path] hdfs_crawl_account_data=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_account_info_data_tag] --start_time=$[account_info_snapshot_latest_date] --end_time=$[account_info_latest_date] --data_hdfs_path_list) cmd="/bin/bash $[plugin_user_info_generator] --account_info_data_path ${hdfs_crawl_account_data} --account_info_schema_path $INPUT1 --last_account_info_snapshot_data_path $[account_info_snapshot_latest_path] --last_account_info_snapshot_schema_path $[account_info_snapshot_schema_path] --cur_account_info_snapshot_data_path $OUTPUT0 --account_info_snapshot_schema_path $OUTPUT1 --account_info_config_path $[plugin_user_info_config_generator]" echo "$cmd" eval "$cmd" if [ $? -eq 0 ]; then hadoop fs -touchz $[hdfs_account_info_snapshot_path]/data/available_$[account_info_latest_date] else echo "$cmd is failed,please check!" >> ${send_emails_file} fi ; douyu media info snapshot hdfs:$[hdfs_media_snapshot_data_tag]_v$[media_info_schema_version]_$[media_info_latest_date], hdfs:$[hdfs_media_snapshot_schema_path]/schema_douyu_media_info_snapshot_v$[media_info_schema_version] <- hdfs:$[media_info_latest_path], hdfs:$[media_info_schema_path] hdfs_crawl_media_data=$($[plugin_utils_hdfs_interaction_with_local_file] --interaction_mode=print --data_hdfs_path=$[hdfs_media_info_data_tag] --start_time=$[media_snapshot_latest_date] --end_time=$[media_info_latest_date] --data_hdfs_path_list) cmd="/bin/bash $[plugin_media_info_generator] --media_info_data_path ${hdfs_crawl_media_data} --media_info_schema_path $INPUT1 --last_media_info_snapshot_data_path $[media_snapshot_latest_path] --last_media_info_snapshot_schema_path $[media_snapshot_schema_path] --cur_media_info_snapshot_data_path $OUTPUT0 --media_info_snapshot_schema_path $OUTPUT1 --media_info_pig_config_path $[plugin_media_info_config_generator]" echo "$cmd" eval "$cmd" if [ $? -eq 0 ]; then hadoop fs -touchz $[hdfs_media_snapshot_path]/data/available_$[media_info_latest_date] else echo "$cmd is failed,please check!" >> ${send_emails_file} fi
#!/usr/bin/env bash source '/var/weiboyi/azkaban/big_data/Common/workflow_environment_config.sh' source '/var/weiboyi/azkaban/big_data/Common/workflow_plugin_definition.sh' export PROFILE='/var/weiboyi/azkaban/big_data/Common/workflow_drake_profile' export workflow_home=/var/weiboyi/azkaban/UnifiedDataProcessing/WorkFlow/Douyu/CrawledDataParser/trunk data_folder='/data0/weiboyi/azkaban/UnifiedDataProcessing/WorkFlow/Douyu/CrawledDataParser/data' workflow_name='douyuDataGenerator' workflow_owner='yuanyihan@weiboyi.com' today=`date +"%Y%m%d"` drake_base_folder=${data_folder}/${today} mkdir ${drake_base_folder} statistic_result=${drake_base_folder}/statistic_result if [ -f ${statistic_result} ]; then rm ${statistic_result} fi send_emails_file=${drake_base_folder}/send_emails_result if [ -f ${send_emails_result} ]; then rm ${send_emails_file} fi # clear the expired data in data folder find ${data_folder} -type d -mtime +30 -exec rm -rf {} \; echo '#############################################################' valid_date=$1 douyu_account_info_path=/tech/azkaban/data_processing/crawler2/douyu/account_info douyu_account_info_tag=${douyu_account_info_path}/data/douyu_account_info douyu_account_latest_date=$(${plugin_utils_hdfs_interaction_with_local_file} --interaction_mode=print --data_hdfs_path=${douyu_account_info_tag} --item_count=1 --valid_time) echo "douyu_account_latest_date: ${douyu_account_latest_date}" douyu_media_info_path=/tech/azkaban/data_processing/crawler2/douyu/media douyu_media_info_tag=${douyu_media_info_path}/data/douyu_media douyu_media_latest_date=$(${plugin_utils_hdfs_interaction_with_local_file} --interaction_mode=print --data_hdfs_path=${douyu_media_info_tag} --item_count=1 --valid_time) echo "douyu_media_latest_date: ${douyu_media_latest_date}" flag="false" unset douyu_account_feature_valid_date if [ ! ${valid_date} ];then douyu_account_feature_valid_date=${douyu_media_latest_date} flag="true" elif [ "${valid_date}" -gt "${douyu_account_latest_date}" ] && [ "${valid_date}" -gt "${douyu_media_latest_date}" ]; then echo "valid_date ${valid_date} is greater than douyu_account_latest_date ${douyu_account_latest_date}, exit" >> ${send_emails_file} else douyu_account_feature_valid_date=${valid_date} flag="true" fi echo "douyu_account_feature_valid_date: ${douyu_account_feature_valid_date}" echo "##########################################################" # call the drake workflow if [ ${flag} == "true" ]; then cmd="${drake_cmd_env} --auto --workflow=${workflow_home}/workflow_douyu_data.d --base=${drake_base_folder} --logfile=${drake_base_folder}/drake_${today}.log --tmpdir=${drake_base_folder}/drake_tmp -v statistic_result=${statistic_result},send_emails_file=${send_emails_file}" echo "$cmd" eval "$cmd" fi echo '############################### upload hbase start ##############################' #upload DB plugin_version="2.0" plugin_home=/var/weiboyi/azkaban/UnifiedDataProcessing/AccountFeatureUpload plugin_upload_hbase_generator=${plugin_home}/app/${plugin_version}/bin/account_feature_upload_hbase_java_generator.sh plugin_upload_douyu_data_path=/tech/azkaban/data_processing/feature_generator/douyu/data/media_info_snapshot hdfs_upload_douyu_schema_path=${plugin_upload_douyu_data_path}/schema hdfs_upload_douyu_data_tag=${plugin_upload_douyu_data_path}/data/douyu_media_info_snapshot plugin_upload_douyu_given_data_path=$(${plugin_utils_hdfs_interaction_with_local_file} --interaction_mode=print --data_hdfs_path=${hdfs_upload_douyu_data_tag} --start_time=${valid_date} --end_time=${valid_date} --data_hdfs_path_list) echo "plugin_upload_douyu_given_data_path: ${plugin_upload_douyu_given_data_path}" hdfs_upload_douyu_schema_path=$(${plugin_utils_hdfs_interaction_with_local_file} --interaction_mode=print --data_hdfs_path=${hdfs_upload_douyu_data_tag} --item_count=1 --schema_hdfs_path) echo "hdfs_upload_douyu_schema_path: ${hdfs_upload_douyu_schema_path}" data_folder='${plugin_home}/data' workflow_home='/var/weiboyi/azkaban/UnifiedDataProcessing/WorkFlow/Douyu/CrawledDataParser' config_folder='${workflow_home}/config' if [ ${plugin_upload_douyu_given_data_path} ];then cmd="/bin/bash ${plugin_upload_hbase_generator} --input_data_path ${plugin_upload_douyu_given_data_path} --input_schema_path ${hdfs_upload_douyu_schema_path} --config_file ${config_folder}/account_douyu_upload_hbase.yaml --tableName pinggu_dw:media_douyu --isCreateHbaseTable false" echo "$cmd" eval "$cmd" if [ $? -ne 0 ];then echo "${valid_date}_${today}:exe douyu media snapshot upload hbase error,please check!">>${send_emails_file} fi fi echo '############################### upload hbase end ##############################' echo "##########################################################" if [ -f ${send_emails_file} ];then cmd="mail -s 鬥魚爬蟲數據處理:${valid_date}_${today} ${workflow_owner} < ${send_emails_file}" echo "$cmd" eval "$cmd" fi echo "##########################################################"