Merge branch 'master' into 6507-node-manager-azure
[arvados.git] / doc / install / install-crunch-dispatch.html.textile.liquid
1 ---
2 layout: default
3 navsection: installguide
4 title: Install the Crunch dispatcher
5
6 ...
7
8 The dispatcher normally runs on the same host/VM as the API server.
9
10 h2. Test the Arvados job queue
11
12 Crunch dispatches work from the job queue on the Arvados API server.  Before you start installing the Crunch dispatcher, now's a good time to check that the API server and Git server can coordinate to create job records.  Run these commands *on your shell server* to create a collection, and a job to calculate the MD5 checksum of every file in it:
13
14 <notextile>
15 <pre><code>~$ <span class="userinput">echo 'Hello, Crunch!' | arv-put --portable-data-hash -</span>
16 &hellip;
17 d40c7f35d80da669afb9db1896e760ad+49
18 ~$ <span class="userinput">read -rd $'\000' newjob &lt;&lt;EOF; arv job create --job "$newjob"
19 {"script_parameters":{"input":"d40c7f35d80da669afb9db1896e760ad+49"},
20  "script_version":"0988acb472849dc0",
21  "script":"hash",
22  "repository":"arvados"}
23 EOF</span>
24 </code></pre>
25 </notextile>
26
27 If you get the error
28
29 <pre>
30 ArgumentError: Specified script_version does not resolve to a commit
31 </pre>
32
33 it often means that the API server can't read the specified repository&mdash;either because it doesn't exist, or because the user running the API server doesn't have permission to read the repository files.  Check the API server's log (@/var/www/arvados-api/current/log/production.log@) for details, and double-check the instructions in the "Git server installation guide":install-arv-git-httpd.html.
34
35 If everything goes well, the API server should create a job record, and your @arv@ command will output the JSON for that record.  It should have state @Queued@ and script_version @0988acb472849dc08d576ee40493e70bde2132ca@.  If the job JSON includes those fields, you can proceed to install the Crunch dispatcher and a compute node.  This job will remain queued until you install those services.
36
37 h2. Perl SDK dependencies
38
39 Install the Perl SDK on the controller.
40
41 * See "Perl SDK":{{site.baseurl}}/sdk/perl/index.html page for details.
42
43 h2. Python SDK dependencies
44
45 Install the Python SDK and CLI tools on controller and all compute nodes.
46
47 * See "Python SDK":{{site.baseurl}}/sdk/python/sdk-python.html page for details.
48
49 h2(#slurm). Set up SLURM
50
51 On the API server, install SLURM and munge, and generate a munge key.
52
53 On Debian-based systems:
54
55 <notextile>
56 <pre><code>~$ <span class="userinput">sudo /usr/bin/apt-get install slurm-llnl munge</span>
57 ~$ <span class="userinput">sudo /usr/sbin/create-munge-key</span>
58 </code></pre>
59 </notextile>
60
61 On Red Hat-based systems, "install SLURM and munge from source following their installation guide":https://computing.llnl.gov/linux/slurm/quickstart_admin.html.
62
63 Now we need to give SLURM a configuration file in @/etc/slurm-llnl/slurm.conf@. Here's an example:
64
65 <notextile>
66 <pre>
67 ControlMachine=uuid_prefix.your.domain
68 SlurmctldPort=6817
69 SlurmdPort=6818
70 AuthType=auth/munge
71 StateSaveLocation=/tmp
72 SlurmdSpoolDir=/tmp/slurmd
73 SwitchType=switch/none
74 MpiDefault=none
75 SlurmctldPidFile=/var/run/slurmctld.pid
76 SlurmdPidFile=/var/run/slurmd.pid
77 ProctrackType=proctrack/pgid
78 CacheGroups=0
79 ReturnToService=2
80 TaskPlugin=task/affinity
81 #
82 # TIMERS
83 SlurmctldTimeout=300
84 SlurmdTimeout=300
85 InactiveLimit=0
86 MinJobAge=300
87 KillWait=30
88 Waittime=0
89 #
90 # SCHEDULING
91 SchedulerType=sched/backfill
92 SchedulerPort=7321
93 SelectType=select/cons_res
94 SelectTypeParameters=CR_CPU_Memory
95 FastSchedule=1
96 #
97 # LOGGING
98 SlurmctldDebug=3
99 #SlurmctldLogFile=
100 SlurmdDebug=3
101 #SlurmdLogFile=
102 JobCompType=jobcomp/none
103 #JobCompLoc=
104 JobAcctGatherType=jobacct_gather/none
105 #
106 # COMPUTE NODES
107 NodeName=DEFAULT
108 PartitionName=DEFAULT MaxTime=INFINITE State=UP
109
110 NodeName=compute[0-255]
111 PartitionName=compute Nodes=compute[0-255] Default=YES Shared=YES
112 </pre>
113 </notextile>
114
115 h3. SLURM configuration essentials
116
117 Whenever you change this file, you will need to update the copy _on every compute node_ as well as the controller node, and then run @sudo scontrol reconfigure@.
118
119 *@ControlMachine@* should be a DNS name that resolves to the SLURM controller (dispatch/API server). This must resolve correctly on all SLURM worker nodes as well as the controller itself. In general SLURM is very sensitive about all of the nodes being able to communicate with the controller _and one another_, all using the same DNS names.
120
121 *@NodeName=compute[0-255]@* establishes that the hostnames of the worker nodes will be compute0, compute1, etc. through compute255.
122 * There are several ways to compress sequences of names, like @compute[0-9,80,100-110]@. See the "hostlist" discussion in the @slurm.conf(5)@ and @scontrol(1)@ man pages for more information.
123 * It is not necessary for all of the nodes listed here to be alive in order for SLURM to work, although you should make sure the DNS entries exist. It is easiest to define lots of hostnames up front, assigning them to real nodes and updating your DNS records as the nodes appear. This minimizes the frequency of @slurm.conf@ updates and use of @scontrol reconfigure@.
124
125 Each hostname in @slurm.conf@ must also resolve correctly on all SLURM worker nodes as well as the controller itself. Furthermore, the hostnames used in the configuration file must match the hostnames reported by @hostname@ or @hostname -s@ on the nodes themselves. This applies to the ControlMachine as well as the worker nodes.
126
127 For example:
128 * In @/etc/slurm-llnl/slurm.conf@ on control and worker nodes: @ControlMachine=uuid_prefix.your.domain@
129 * In @/etc/slurm-llnl/slurm.conf@ on control and worker nodes: @NodeName=compute[0-255]@
130 * In @/etc/resolv.conf@ on control and worker nodes: @search uuid_prefix.your.domain@
131 * On the control node: @hostname@ reports @uuid_prefix.your.domain@
132 * On worker node 123: @hostname@ reports @compute123.uuid_prefix.your.domain@
133
134 h3. Automatic hostname assignment
135
136 If your worker node bootstrapping script (see "Installing a compute node":install-compute-node.html) does not send the worker's current hostname, the API server will choose an unused hostname from the set given in @application.yml@, which defaults to @compute[0-255]@.
137
138 If it is not feasible to give your compute nodes hostnames like compute0, compute1, etc., you can accommodate other naming schemes with a bit of extra configuration.
139
140 If you want Arvados to assign names to your nodes with a different consecutive numeric series like @{worker1-0000, worker1-0001, worker1-0002}@, add an entry to @application.yml@; see @/var/www/arvados-api/current/config/application.default.yml@ for details. Example:
141 * In @application.yml@: <code>assign_node_hostname: worker1-%<slot_number>04d</code>
142 * In @slurm.conf@: <code>NodeName=worker1-[0000-0255]</code>
143
144 If your worker hostnames are already assigned by other means, and the full set of names is known in advance, have your worker node bootstrapping script (see "Installing a compute node":install-compute-node.html) send its current hostname, rather than expect Arvados to assign one.
145 * In @application.yml@: <code>assign_node_hostname: false</code>
146 * In @slurm.conf@: <code>NodeName=alice,bob,clay,darlene</code>
147
148 If your worker hostnames are already assigned by other means, but the full set of names is _not_ known in advance, you can use the @slurm.conf@ and @application.yml@ settings in the previous example, but you must also update @slurm.conf@ (both on the controller and on all worker nodes) and run @sudo scontrol reconfigure@ whenever a new node comes online.
149
150 h2. Enable SLURM job dispatch
151
152 In your API server's @application.yml@ configuration file, add the line @crunch_job_wrapper: :slurm_immediate@ under the appropriate section.  (The second colon is not a typo.  It denotes a Ruby symbol.)
153
154 h2. Crunch user account
155
156 Run @sudo adduser crunch@.  The crunch user should have the same UID, GID, and home directory on all compute nodes and on the dispatcher (API server).
157
158 h2. Run the Crunch dispatcher service
159
160 To dispatch Arvados jobs:
161
162 * The API server script @crunch-dispatch.rb@ must be running.
163 * @crunch-job@ needs the installation path of the Perl SDK in its @PERLLIB@.
164 * @crunch-job@ needs the @ARVADOS_API_HOST@ (and, if necessary, @ARVADOS_API_HOST_INSECURE@) environment variable set.
165
166 We recommend you run @crunch-dispatch.rb@ under "runit":http://smarden.org/runit/ or a similar supervisor.  Here's an example runit service script:
167
168 <notextile>
169 <pre><code>#!/bin/sh
170 set -e
171
172 rvmexec=""
173 ## Uncomment this line if you use RVM:
174 #rvmexec="/usr/local/rvm/bin/rvm-exec default"
175
176 export ARVADOS_API_HOST=<span class="userinput">uuid_prefix.your.domain</span>
177 export CRUNCH_DISPATCH_LOCKFILE=/var/lock/crunch-dispatch
178 export RAILS_ENV=production
179
180 ## Uncomment this line if your cluster uses self-signed SSL certificates:
181 #export ARVADOS_API_HOST_INSECURE=yes
182
183 # This is the path to docker on your compute nodes. You might need to
184 # change it to "docker", "/opt/bin/docker", etc.
185 export CRUNCH_JOB_DOCKER_BIN=<span class="userinput">docker.io</span>
186
187 fuser -TERM -k $CRUNCH_DISPATCH_LOCKFILE || true
188 cd /var/www/arvados-api/services/api
189 exec $rvmexec bundle exec ./script/crunch-dispatch.rb 2>&1
190 </code></pre>
191 </notextile>