Help us understand the problem. What is going on with this article?

ジョブスケジューラーにdockerコマンドを実行させる

More than 1 year has passed since last update.

例えば、Rを使って、以下のような4×3の行列(testdata.csv)に対して、遺伝子ごとに平均値が0、分散が1になるようにスケーリングした結果を、新たにscaled_testdata.csvとして保存したいとする。

echo ",Gene1,Gene2,Gene3" > testdata.csv
echo "Cell1,2,1,3" >> testdata.csv
echo "Cell2,4,3,6" >> testdata.csv
echo "Cell3,5,4,7" >> testdata.csv
echo "Cell4,4,3,8" >> testdata.csv

Rで以下のように実行すれば、目的のものが手に入る。

input <- read.csv("testdata.csv")
scaled <- scale(input)
write.csv(scaled, "scaled_testdata.csv", quote=FALSE)

この作業を、Sun Grid Engineがある環境で、実行内容を書いたシェルスクリプトをqsubすることで行いたい。
また、特定のバージョンのRやパッケージを使うなどを想定して、dockerコマンドも使う。
手順は以下の通り。

Step.1 : Dockerコンテナを用意する

rockerを使うと、気軽にRがインストールされたLinux環境が手に入るので、プルして使う。

docker pull rocker/r-base
docker run -i -t rocker/r-base:latest /usr/bin/R -e 'sessionInfo()'

R version 3.5.1 (2018-07-02)がインストールされているもよう。

Step.2 : qsubするシェルスクリプトにdockerコマンドを書く

次に、以下のようなシェルスクリプト(Job.sh)を作成する。

#!/bin/bash

#$ -l nc=4
#$ -q node.q

# which dockerでは/bin/dockerにdockerコマンドあった
/bin/docker run --rm -v /home/antiplastics/Docker:/Docker \
rocker/r-base:latest sh \
-c "/usr/bin/R -e 'input <- read.csv(\"/Docker/testdata.csv\");\
scaled <- scale(input);\
write.csv(scaled, \"/Docker/scaled_testdata.csv\", quote=FALSE)'"

ここでは、作業環境が、/home/antiplastics/Dockerだったとして、コンテナ内に/Dockerというディレクトリを作成して、そこでtestdata.csvが触れるように-vオプションを使っている(重要)。

これをqsubすれば、scaled_testdata.csvが/home/antiplastics/Docker以下に出力される。

qsub Job.sh

Step.3 : アレイジョブで、3回同じ事をする

通し番号1,2,3を設定し、番号ごとに違うことをするべく、アレイジョブでqsubする。
ArrayJob.shというファイルを以下のように書いて、上記と同様、qsubした。

#!/bin/bash

#$ -l nc=4
#$ -t 1-3
#$ -q node.q

mkdir -p /home/antiplastics/Docker/$SGE_TASK_ID

/bin/docker run --rm -v /home/antiplastics/Docker:/Docker \
rocker/r-base:latest sh \
-c "/usr/bin/R -e 'input <- read.csv(\"/Docker/testdata.csv\");\
scaled <- scale(input);\
write.csv(scaled, \"/Docker/$SGE_TASK_ID/scaled_testdata.csv\", quote=FALSE)'"
qsub ArrayJob.sh

Step.2のJob.shと大体同じだが、
#$ -t 1-3
というqsubオプションにより、$SGE_TASK_IDに1から3までの値が格納され、各々別々のジョブとして実行される。
これにより、/home/antiplastics/Docker/{1..3}に、別々にscaled_testdata.csvが出力される。

antiplastics
書くぜーどんどん書くぜー(書いてない
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした