Project

General

Profile

Lib-nest » History » Version 1

Herve Caumont, 2013-06-19 18:05

1 1 Herve Caumont
h1. NEST tutorial
2
3
{{>toc}}
4
5
h2. Sandbox per-requisites
6
7
*We assume that you have already a Sandbox ready and the following items are completed:*
8
* *You have accessed your sandbox as described in the Getting Started guide*
9
10
> It is not mandatory but strongly recommended to follow the [[Getting started]] tutorial before starting this one.
11
12
h2. 1. Application concepts and terminology
13
14
In order to ease the execution of the tutorial, it is important to understand the concept of an application and its terminology. This section describes the example application used all along this guide. When a word is put in *+underlined bold+*, it is an terminology keyword always designating the same concept.
15
16
h3. 1.1 The application workflow
17
18
Our example in this tutorial is an application that processes ECMWF data (TIGGE Data). It is composed of 6 steps that run independently but in a specific order and produce results that are inputs for the other remaining steps.
19
20
The following figure illustrates the *+Workflow+* of our application as a directed acyclic graph (DAG). This is also how the Developer Cloud Sandbox service handles the execution of processes in terms of parallel computing and orchestration of the processing steps.
21
22
!! _<<insert here the DAG that represent the workflow >>_
23
24
Each box represents a *+Job+* which is a step of our application process. The arrows represents the data flow between the *+jobs+*. When a *+job+* is connected to another, it means that the *+output+* of this *+job+* is passed as *+input+* for the other.
25
26
It is important to keep in mind that in the Sandbox framework, *+input+* and *+ouput+* are text references (e.g. to data). Indeed, when a *+job+* process *+input+*, it actually reads *line by line* the reference workflow as described in the next figure
27
28
!https://ciop.eo.esa.int/attachments/40/focus-align.png!
29
30
It is therefore important to define precisely the inter- *+job+* references.
31
32
h3. 1.2 The job
33
34
Each *+job+* has a set of basic characteristics:
35
36
* a unique *+Job name+* in the workflow. (e.g. 'PreProc')
37
* zero, 1 or several *+sources+* that define the *+jobs+* interdependency. In the example, the *+job+* 'Interfere' has 2 dependencies: 'AlignSlave' and 'MakeTropo'.
38
* a maximum number of simultaneous *+tasks+* in which it can be forked. This is further explained in section [[Sandbox Application Integration Tutorial#1.3 The processing task|1.3 The processing task]].
39
* a *+processing trigger*+ which is a software executable of the *+job template+* that handles *+input+*/*+output+* streaming process. Practically, the executable that reads the *+input+* lines and writes the *+output+* lines.
40
41
The job characteristics above are mandatory in the *+workflow+* definition. 
42
If incomplete, the Sandbox framework reports error in the workflow.
43
44
45
h3. 1.3 The processing task
46
47
To exploit the parallelism offered by the Sandbox framework, a *+job+* may process its *+input+* in several *+tasks+*. In principle, the Sandbox framework will run those *+tasks+* in parallel. This is an important and sometimes complex paradigm that can be addressed in different ways. 
48
The following questions & answers describe the parallelism paradigm of the Sandbox framework.
49
50
* Is it *+task+* parallelism or *+job+* parallelism?
51
52
> In this section, we definitely speak about task parallelism. Job parallelism is at level !+1. 
53
54
* How to divide a *+job+* into *+tasks+*?
55
56
> It is actually the application developer who chooses the granularity of the *+job+* division. The computing framework will simply divide the *+input+* flow (*k* lines) in to the *n* *+tasks+*. In the example provided in this tutorial, if the *+job+* 'PreProc' produces *+output+* of 11 lines and the computing resources divide the *+job+* 'AlignSlave' into 4 *+tasks+* and the following division is done:
57
58
!https://ciop.eo.esa.int/attachments/41/parallelism.png!
59
60
Where stands the processing loop?
61
62
> The processing loop stands in the +*processing trigger*+. As shown in this tutorial with the example, the *+processing triggers+* implements a loop that reads *line by line* the *+task*+ input.
63
64
h2. 2. Home Directory
65
66
The *+home+* directory of your sandbox is attached to a separate savable disk and thus persistent. This disk is mounted on the /home/{USERNAME} folder. In this folder you may upload, compile, test manually, etc. all your data. This is a free space where you can do anything BUT:
67
68
> *+Be careful to never link any element (e.g. executable, auxiliary data) from the application directory to the home directory which is critical for the application+*. Indeed, the *+home+* directory is not present when using CIOP in Runtime Environment mode and therefore any linked elements won't be available and cause the processing phase to fail.
69
70
h2. 3. Application Directory
71
72
The *+application directory+* of your sandbox is attached to a separate savable disk and thus persistent. This disk is mounted on the /application folder.
73
The application directory is the place where integrated application resides. 
74
It should be a clean environment and thus +*SHOULD NOT*+ contain any temporary files or used to do compilations and/or manual testing. Instead, it is used for the simulation the application *+jobs+* and +*workflow*+.
75
76
At the instantiation of your sandbox, the *+application directory+* contains this sample application example unless you configured the sandbox with one of your application disk previously saved in your application library.
77
In the next sections the elements of the application directory are described.
78
79
h3. 3.1 Files and folders structure
80
81
The application directory follows some best practices in its folders and files structure to ease the subsequent deployment of the application to the Runtime Environment.
82
The folder structure of the application example with the description of each item is shown below:
83
84
!https://ciop.eo.esa.int/attachments/44/application_folder.png!
85
86
87
> Even if the names are quite similar in the our tutorial example, *+job+* and +*job template*+ are not the same concept. _A *job* is an instance of a +*job template*+ in a given +*workflow*+. This paradigm allows to have several *+jobs+* in a +*workflow*+ that point to the same *+job template+*. This is explained in more detail in the next section.
88
89
h3. 3.2 The Application XML definition file
90
91
The Application XML definition file is the reference of your application for the CIOP computing framework. It contains all the characteristics of the *+job templates+* and the *+workflows+*.
92
93
The Application XML definition file is is described in the page [[Application XML definition file]].
94
95
h2. 4 -- Using sample datasets -- (section under revision)
96
97
This section guides you through the tutorial example to introduce the data manipulation tools. 
98
99
There are mainly two command line tools to discover and access data previously selected in your sandbox ([[Getting_Started#2.1 Sandbox EO Data Services|see here]]):
100
* *ciop-catquery* to query the sandbox catalogue containing all the metadata of the selected sample dataset
101
* *ciop-copy* to copy the data from logical of physical location to a local directory of the sandbox
102
103
Use
104
<pre>ciop-<command> -h</pre>
105
to display the CLI reference
106
107
These commands can be used in the processing triggers of a +*job*+.
108
109
h3. 4.1 Query sandbox catalogue
110
111
For the tutorial purpose, the first test is to ensure the test dataset needed for the Application integration and testing is complete.
112
113
(to be updated)
114
115
h3. 4.2 Copy data
116
117
To copy data from a reference link as displayed in the previous section, just use the following command:
118
119
<pre><code class="ruby">[user@sb ~]$ ciop-copy http://localhost/catalogue/sandbox/ASA_IM__0P/ASA_IM__0CNPDE20040602_091147_000000152027_00222_11799_1335.N1/rdf</code></pre>
120
121
output:
122
123
<pre>
124
[INFO   ][ciop-copy][starting] url 'http://localhost/catalogue/sandbox/ASA_IM__0P/ASA_IM__0CNPDE20040602_091147_000000152027_00222_11799_1335.N1/rdf' > local '/application/'
125
[INFO   ][ciop-copy][success] got URIs 'https://eo-virtual-archive4.esa.int/supersites/ASA_IM__0CNPDE20040602_091147_000000152027_00222_11799_1335.N1 '
126
[INFO   ][ciop-copy][starting] url 'https://eo-virtual-archive4.esa.int/supersites/ASA_IM__0CNPDE20040602_091147_000000152027_00222_11799_1335.N1' > local '/application/'
127
[INFO   ][ciop-copy][success] url 'https://eo-virtual-archive4.esa.int/supersites/ASA_IM__0CNPDE20040602_091147_000000152027_00222_11799_1335.N1' > local '/application/ASA_IM__0CNPDE20040602_091147_000000152027_00222_11799_1335.N1'
128
/home/user/ASA_IM__0CNPDE20040602_091147_000000152027_00222_11799_1335.N1
129
</pre>
130
131
The command displays information on the _stderr_ by default and returns on _stdout_ the path of the copied data.
132
133
Many other data schemas are supported by the ciop-copy CLI such as http, https, hdfs, etc. 
134
There are also many other options to specify the output directory or to unpack compressed data. 
135
The complete reference is available here [[ciop-copy CLI reference|ciop-copy usage]] or by using the inline help typing:
136
<pre><code class="ruby">[user@sb ~]$ciop-copy -h</code></pre>
137
138
h3. 4.3 Using other sources of data in a job
139
140
So far we have introduced two types of data sources:
141
* data coming from a catalogue series
142
* data coming from a previous job in the workflow.
143
144
In the first case, we define the workflow for the job imager:
145
146
<pre><code class="xml"><workflow id="testVomir">							<!-- Sample workflow -->
147
		<workflowVersion>1.0</workflowVersion>
148
		<node id="Vimage">							<!-- workflow node unique id -->
149
			<job id="imager"></job>					<!-- job defined above -->
150
			<sources>
151
				<source refid="cas:serie" >ATS_TOA_1P</source>
152
			</sources>
153
			<parameters>							<!-- parameters of the job -->
154
				<parameter id="volcano_db"></parameter>
155
			</parameters>
156
		</node>
157
		<node id="Quarc">
158
			<job id="quarcXML"/>
159
			<sources>
160
				<source refid="wf:node" >Vimage</source>
161
			</sources>
162
		</node></code></pre>
163
164
In the second case, we define the workflow for the Quarc job:
165
166
<pre><code class="xml"><workflow id="testVomir">							<!-- Sample workflow -->
167
		<workflowVersion>1.0</workflowVersion>
168
		<node id="Vimage">							<!-- workflow node unique id -->
169
			<job id="imager"></job>					<!-- job defined above -->
170
			<sources>
171
				<source refid="cas:serie" >ATS_TOA_1P</source>
172
			</sources>
173
			<parameters>							<!-- parameters of the job -->
174
				<parameter id="volcano_db"></parameter>
175
			</parameters>
176
		</node>
177
		<node id="Quarc">
178
			<job id="quarcXML"/>
179
			<sources>
180
				<source refid="wf:node" >Vimage</source>
181
			</sources>
182
		</node></code></pre>
183
184
It may be the case where the input data does not come from EO catalogues and thus there is the need to define another source of data.
185
186
<pre><code class="xml"><workflow id="someworkflow">							<!-- Sample workflow -->
187
		<workflowVersion>1.0</workflowVersion>
188
		<node id="somenode">							<!-- workflow node unique id -->
189
			<job id="somejobid"></job>					<!-- job defined above -->
190
			<sources>
191
				<source refid="file:urls" >/application/test.urls</source>
192
			</sources>
193
		</node>
194
</code></pre>
195
196
where the file test.urls contains the input lines that will be pipped to the processing trigger executable
197
198
h2. 5. Job integration
199
200
In this section, the +*job template+* 'align' and its instance the *+job+* 'AlignSlave' is integrated using the tools previously introduced in this tutorial.
201
202
h3. 5.1 Installation and configuration of the GMTSAR toolbox on the Sandbox
203
204
The steps below install the GMTSAR toolbox on the sandbox. These are specific but it shows the common approach to follow when installing software on the sandbox.
205
> The steps below are done in the +*home directory*+
206
207
* Step - Download the GMTSAR
208
209
GMTSAR software is available on the University of California web server:
210
211
<pre><code class="ruby">
212
[user@sb ~]$ wget http://topex.ucsd.edu/gmtsar/tar/GMTSAR.tar
213
</code></pre>
214
 
215
Then the GMTSAR.tar archive is unpacked
216
217
<pre><code class="ruby">
218
[user@sb ~]$ tar xvf GMTSAR.tar 
219
</code></pre>
220
221
GMTSAR relies on GMT with the dependencies netCDF, GMT is installed via yum:
222
223
<pre><code class="ruby">
224
[user@sb ~]$ cd GMTSAR
225
[user@sb GMTSAR]$ sudo yum search gmt
226
[user@sb GMTSAR]$ sudo yum install GMT-devel
227
[user@sb GMTSAR]$ sudo yum install netcdf-devel
228
[user@sb GMTSAR]$ make
229
</code></pre>
230
231
The steps above compile GMTSAR in the +*home directory*+. The required files (binaries, libraries, etc.) are copied to the /Application environment (remember that the +*home directory*+ is only available in the CIOP Sandbox mode and not in the Runtime Environment).
232
233
h3. 5.2 Job template definition in the application.xml
234
235
The application.xml file has two main blocks: the job template section and the workflow template section.
236
237
The first part is to define the *+job templates+* in the workflow XML application definition file.
238
Each processing block of the GMTSAR workflow needs a *+job template+*.
239
240
Here is the *+job template+* for the 'align'
241
242
<pre><code class="xml">
243
<jobTemplate id="preproc">
244
	<streamingExecutable>/application/preproc/run</streamingExecutable> <!-- processing trigger -->		
245
	<defaultParameters> <!-- default parameters of the job -->
246
		<!-- Default values are specified here -->
247
		<parameter id="SAT"></parameter>	<!-- no default value -->
248
		<parameter id="master"></parameter>
249
		<parameter id="num_patches"></parameter>	<!-- no default value -->
250
		<parameter id="near_range"></parameter>	<!-- no default value -->
251
		<parameter id="earth_radius"></parameter>	<!-- no default value -->
252
		<parameter id="fd1">1</parameter>	<!-- no default value -->
253
		<parameter id="stop_on_error">false</parameter>	<!-- dont stop on error by default -->
254
	</defaultParameters>
255
	<defaultJobconf>
256
		<property id="ciop.job.max.tasks">1</property>	<!-- Maximum number of parallel tasks -->
257
		</defaultJobconf>
258
</jobTemplate>
259
</code></pre>
260
261
To test this +*job*+ with the +*ciop-symjob*+, we need to fill the second part of the +*application.xml*+ to add a *+node+*:
262
263
<pre><code class="xml">
264
<node id="PreProc">	<!-- workflow node unique id -->
265
	<job id="preproc"></job> <!-- job template defined before -->
266
	<sources>
267
		<!-- Source is the series of data selection -->
268
		<source refid="cas:serie">ASA_IM__0P</source>
269
	</sources>
270
	<parameters>	<!-- parameters of the job -->
271
		<parameter id="SAT">ENV</parameter>
272
		<parameter id="master">http://localhost/catalogue/sandbox/ASA_IM__0P/ASA_IM__0CNPDE20040602_091147_000000152027_00222_11799_1335.N1/rdf</parameter>
273
		<parameter id="near">978992.922</parameter>
274
		<parameter id="radius">6378000</parameter>
275
		<parameter id="stop_on_error">true</parameter>	<!-- during integration, preferably stop on error -->	
276
	</parameters>
277
</node>
278
</code></pre>
279
280
> The complete application.xml is available here: TBW
281
> The application.xml and all its elements are described in details in the page [[Application XML definition file]].
282
283
Since this processing is the first in the *+workflow+* chain, it has a special source which is the serie 'ASA_IM__0P'. Practically, it means that when the *+job+* is submitted for execution, the computing framework will query the sandbox catalogue for the data ASA_IM__0P registered as sample dataset and will prepare a list of data reference as *+input+* for the job 'PreProc'. In our example, the resulting list is:
284
285
<pre>
286
http://localhost/catalogue/sandbox/ASA_IM__0P/ASA_IM__0CNPDE20090412_092436_000000162078_00079_37207_1556.N1/rdf
287
http://localhost/catalogue/sandbox/ASA_IM__0P/ASA_IM__0CNPAM20080427_092430_000000172068_00079_32197_3368.N1/rdf
288
</pre>
289
290
h3. 5.3 Processing trigger script 
291
292
In section 1.2, we have seen that each +*job*+ must have a processing trigger which is specified in <streamingExecutable> element of the +*job template*+. In our example, this executable shall be a shell script:
293
294
<pre><code class="ruby">
295
# FIRST OF ALL, LOAD CIOP INCLUDES
296
source ${ciop_job_include}
297
298
# If you want to have a complete debug information during implementation
299
ciop-enable-debug
300
301
# All return codes are predefined
302
SUCCESS=0
303
ERR_BADARG=2
304
ERR_MISSING_PREPROC_BIN=3
305
ERR_MISSING_NEAR_PARAM=4
306
ERR_MISSING_RADIUS_PARAM=5
307
ERR_MISSING_MASTER_PARAM=6
308
ERR_MISSING_SAT_PARAM=7
309
ERR_MISSING_FD1_PARAM=8
310
ERR_MISSING_NUMPATCH_PARAM=9
311
ERR_INPUT_DATA_COPY=18
312
ERR_PREPROC_ERROR=19
313
ERR_NOOUTPUT=20
314
DEBUG_EXIT=66
315
316
# This functions handle the exit of the executable
317
# with the corresponding error codes and will return a short message
318
# with the termination reason. It is important to have a synthetic and brief
319
# message because it will be raised to many upper level of the computing framework
320
# up to the user interface
321
function cleanExit ()
322
{
323
   local retval=$?
324
   local msg=""
325
   case "$retval" in
326
		$SUCCESS)
327
    		msg="Processing successfully concluded";;
328
		$ERR_BADARG)
329
    		msg="function checklibs called with non-directory parameter, returning $res";;
330
		$ERR_MISSING_PREPROC_BIN)
331
    		msg="binary 'pre_proc' not found in path, returning $res";;
332
		$ERR_MISSING_NEAR_PARAM)
333
    		msg="parameter 'near_range' missing or empty, returning $res";;
334
		$ERR_MISSING_RADIUS_PARAM)
335
    		msg="parameter 'earth_radius' missing or empty, returning $res";;
336
        $ERR_MISSING_MASTER_PARAM)
337
            msg="parameter 'master' missing or empty, returning $res";;
338
        $ERR_MISSING_FD1_PARAM)
339
            msg="parameter 'fd1' missing or empty, returning $res";;
340
        $ERR_MISSING_SAT_PARAM)
341
            msg="parameter 'sat' missing or empty, returning $res";;
342
        $ERR_MISSING_NUMPATCH_PARAM)
343
            msg="parameter 'num_patch' missing or empty, returning $res";;
344
        $ERR_INPUT_DATA_COPY)
345
            msg="Unable to retrieve an input file";;
346
        $ERR_PREPROC_ERROR)
347
            msg="Error during processing, aborting task [$res]";;
348
        $ERR_NOOUTPUT)
349
            msg="No output results";;
350
		$DEBUG_EXIT)
351
    		msg="Breaking at debug exit";;
352
   *)
353
      msg="Unknown error";;
354
   esac
355
   [ "$retval" != 0 ] && ciop-log "ERROR" "Error $retval - $msg, processing aborted" || ciop-log "INFO" "$msg"
356
   exit "$retval"
357
}
358
359
# trap an exit signal to exit properly
360
trap cleanExit EXIT
361
362
# Use ciop-log to log message at different level : INFO, WARN, DEBUG
363
ciop-log "DEBUG" '##########################################################'
364
ciop-log "DEBUG" '# Set of useful environment variables                    #'
365
ciop-log "DEBUG" '##########################################################'
366
ciop-log "DEBUG" "TMPDIR                  = $TMPDIR"                  # The temporary directory for the task.
367
ciop-log "DEBUG" "_JOB_ID                 = ${_JOB_ID}"               # The job id
368
ciop-log "DEBUG" "_JOB_LOCAL_DIR          = ${_JOB_LOCAL_DIR}" 		  # The job specific shared scratch space 
369
ciop-log "DEBUG" "_TASK_ID                = ${_TASK_ID}"              # The task id
370
ciop-log "DEBUG" "_TASK_LOCAL_DIR         = ${_TASK_LOCAL_DIR}"       # The task specific scratch space
371
ciop-log "DEBUG" "_TASK_NUM               = ${_TASK_NUM}"             # The number of tasks
372
ciop-log "DEBUG" "_TASK_INDEX             = ${_TASK_INDEX}"           # The id of the task within the job
373
374
# Get the processing trigger directory to link binaries and libraries
375
PREPROC_BASE_DIR=`dirname $0`
376
export PATH=$PREPROC_BASE_DIR/bin:$PATH
377
export LD_LIBRARY_PATH=$PREPROC_BASE_DIR/lib:$LD_LIBRARY_PATH
378
379
${_CIOP_APPLICATION_PATH}/GMTSAR/gmtsar_config
380
381
# Test that all my necessary binaries are accessible
382
# if not, exit with the corresponding error.
383
PREPROC_BIN=`which pre_proc_batch.csh`
384
[ -z "$PREPROC_BIN" ] && exit $ERR_MISSING_PREPROC_BIN
385
386
# Processor Environment
387
# definition and creation of input/output directory
388
OUTPUTDIR="$_TASK_LOCAL_DIR/output"		    # results directory
389
INPUTDIR="$_TASK_LOCAL_DIR/input"		    # data input directory
390
MASTERDIR="$_TASK_LOCAL_DIR/master"
391
mkdir -p $OUTPUTDIR $INPUTDIR
392
393
# Processing Variables
394
# Retrieve the near variable
395
NUMPATCH=`ciop-getparam num_patches`
396
[ $? != 0 ] && exit $ERR_MISSING_NUMPATCH_PARAM
397
NEAR=`ciop-getparam near_range`
398
[ $? != 0 ] && exit $ERR_MISSING_NEAR_PARAM
399
RADIUS=`ciop-getparam earth_radius`
400
[ $? != 0 ] && exit $ERR_MISSING_RADIUS_PARAM
401
FD1=`ciop-getparam fd1`
402
[ $? != 0 ] && exit $ERR_MISSING_FD1_PARAM
403
SAT=`ciop-getparam SAT`
404
[ $? != 0 ] && exit $ERR_MISSING_SAT_PARAM
405
MASTER=`ciop-getparam master`
406
[ $? != 0 ] && exit $ERR_MISSING_MASTER_PARAM
407
STOPONERROR=`ciop-getparam stop_on_error`
408
[ $? != 0 ] && STOPONERROR=false
409
410
# Create the batch.config parameter file
411
cat >${_TASK_LOCAL_DIR}/batch.config << EOF
412
413
num_patches = $NUMPATCH
414
earth_radius = $RADIUS
415
near_range = $NEAR
416
fd1 = $FD1
417
 
418
EOF
419
420
# the parameter 'master' is a reference to a data file
421
# we need to copy it for the rest of our processing
422
# This parameter is at job level so if another prallel task on the same
423
# computing resource has already copied it, we save a useless copy
424
masterFile=`ciop-copy -c -o "$MASTERDIR" -r 10 "$MASTER"`
425
[[ -s $masterFile ]] || { 
426
	ciop-log "ERROR" "Unable to retrieve master input at $url" ; exit $ERR_INPUT_DATA_COPY ; 
427
}
428
ciop-log "INFO" "Retrieved master input at $masterFile"
429
430
echo $masterFile >${_TASK_LOCAL_DIR}/data.in
431
432
# Begin processing loop
433
# Read line by line the input in url variable
434
while read url
435
do
436
		# First we copy the data in the INPUT dire
437
		ciop-log "INFO" "Copying data $url" "preproc"
438
		# ciop-copy $url in $INPUTDIR and retry 10 times in case of failure
439
		# local path of the copied file is returned in the $tmpFile variable
440
        tmpFile=`ciop-copy -o "$INPUTDIR" -r 10 "$url"`
441
        [[ -s $tmpFile ]] || { 
442
			ciop-log "ERROR" "Unable to retrieve inputfile at $url" ; 
443
			[[ $STOPONERROR == true ]] && exit $ERR_INPUT_DATA_COPY ; 
444
		}
445
        ciop-log "INFO" "Retrieved inputfile $tmpFile"
446
	
447
		echo $tmpFile >${_TASK_LOCAL_DIR}/data.in
448
449
done
450
451
# here we start the processing of the stack of data
452
ciop-log "INFO" "Processing stack of data" "preproc"
453
ciop-log "DEBUG" "$PREPROC_BIN $SAT data.in batch.config"
454
455
$PREPROC_BIN $SAT ${_TASK_LOCAL_DIR}/data.in ${_TASK_LOCAL_DIR}/batch.config >$OUTPUTDIR/preproc.log 2>&1
456
rcpp=$?
457
        
458
if [ "$rcpp" != 0 ]; then
459
	ciop-log "ERROR" "$PREPROC_BIN failed to process, return code $?" "preproc"
460
	cat $OUTPUTDIR/preproc.log >&2
461
	exit $ERR_PREPROC_ERROR
462
fi
463
464
ciop-log "INFO" "Processing complete" "preproc"
465
466
# The the results are "published" for next job
467
# Practically, the output shall be published to a job shared space
468
# and the directory referenced as an url for next job
469
ciop-publish $OUTPUTDIR/
470
471
exit 0
472
473
</code></pre>
474
475
> /\ !!! Keep in mind that the execution shall take place in a non-interactive environment so +error catching+ and +logging+ are very important. They enforce the robustness of your application and avoid loosing time later in debugging !!!
476
477
Here is a summary of the framework tools used in this script with their eventual online help:
478
* *source ${ciop_job_include}* --> include library for many functions such as ciop-log, ciop-enable-debug and ciop-getparam
479
* *ciop-enable-debug* --> this enable the DEBUG level for logging system, otherwise just INFO and WARN message are displayed
480
* *ciop-log* --> log message both in interactive computing framework and in processing stdout/err files. [[ciop-log CLI reference|ciop-log usage]]
481
* *ciop-getparam* --> retrieve job parameter. [[ciop-getparam CLI reference|ciop-getparam usage]]
482
* *ciop-catquery* --> query the EO Catalogue of the sandbox. [[ciop-catquery CLI reference|ciop-catquery usage]]
483
* *ciop-copy* --> copy remote file to local directory. [[ciop-copy CLI reference|ciop-copy usage]]
484
* *ciop-publish* --> copy *+task+* result files in +*workflow*+ shared space. [[ciop-publish CLI reference|ciop-publish usage]]
485
486
h3. 5.4 Simulating a single job of the workflow
487
488
*ciop-simjob* --> simulates the execution of one processing +*job*+ of the +*work=flow*+. [[ciop-simjob CLI reference|ciop-simjob usage]]
489
490
We will use it to test the first processing block of GMTSAR:
491
492
<pre><code class="ruby">ciop-simjob -f PreProc</code></pre>
493
494
This will output to _stdout_ the URL of the Hadoop Map/Reduce job. Open the link to check if the processing is correctly executed. 
495
The command will show the progress messages:
496
497
<pre>
498
Deleted hdfs://sb-10-10-14-24.lab14.sandbox.ciop.int:8020/tmp/sandbox/sample/input.0
499
rmr: cannot remove /tmp/sandbox/sample/PreProc/logs: No such file or directory.
500
mkdir: cannot create directory /tmp/sandbox/sample/PreProc: File exists
501
Deleted hdfs://sb-10-10-14-24.lab14.sandbox.ciop.int:8020/tmp/sandbox/sample/workflow-params.xml
502
Submitting job 25764 ...
503
12/11/21 12:26:56 WARN streaming.StreamJob: -jobconf option is deprecated, please use -D instead.
504
packageJobJar: [/var/lib/hadoop-0.20/cache/emathot/hadoop-unjar5187515757952179540/] [] /tmp/streamjob7738227981987732817.jar tmpDir=null
505
12/11/21 12:26:58 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
506
12/11/21 12:26:58 WARN snappy.LoadSnappy: Snappy native library not loaded
507
12/11/21 12:26:58 INFO mapred.FileInputFormat: Total input paths to process : 1
508
12/11/21 12:26:58 INFO streaming.StreamJob: getLocalDirs(): [/var/lib/hadoop-0.20/cache/emathot/mapred/local]
509
12/11/21 12:26:58 INFO streaming.StreamJob: Running job: job_201211101342_0045
510
12/11/21 12:26:58 INFO streaming.StreamJob: To kill this job, run:
511
12/11/21 12:26:58 INFO streaming.StreamJob: /usr/lib/hadoop-0.20/bin/hadoop job  -Dmapred.job.tracker=sb-10-10-14-24.lab14.sandbox.ciop.int:8021 -kill job_201211101342_0045
512
12/11/21 12:26:58 INFO streaming.StreamJob: Tracking URL: http://sb-10-10-14-24.lab14.sandbox.ciop.int:50030/jobdetails.jsp?jobid=job_201211101342_0045
513
12/11/21 12:26:59 INFO streaming.StreamJob:  map 0%  reduce 0%
514
12/11/21 12:27:06 INFO streaming.StreamJob:  map 17%  reduce 0%
515
12/11/21 12:27:07 INFO streaming.StreamJob:  map 33%  reduce 0%
516
12/11/21 12:27:13 INFO streaming.StreamJob:  map 67%  reduce 0%
517
12/11/21 12:27:18 INFO streaming.StreamJob:  map 83%  reduce 0%
518
12/11/21 12:27:19 INFO streaming.StreamJob:  map 100%  reduce 0%
519
12/11/21 12:27:24 INFO streaming.StreamJob:  map 100%  reduce 33%
520
12/11/21 12:27:27 INFO streaming.StreamJob:  map 100%  reduce 100%
521
^@12/11/21 12:28:02 INFO streaming.StreamJob:  map 100%  reduce 0%
522
12/11/21 12:28:05 INFO streaming.StreamJob:  map 100%  reduce 100%
523
12/11/21 12:28:05 INFO streaming.StreamJob: To kill this job, run:
524
12/11/21 12:28:05 INFO streaming.StreamJob: /usr/lib/hadoop-0.20/bin/hadoop job  -Dmapred.job.tracker=sb-10-10-14-24.lab14.sandbox.ciop.int:8021 -kill job_201211101342_0045
525
12/11/21 12:28:05 INFO streaming.StreamJob: Tracking URL: http://sb-10-10-14-24.lab14.sandbox.ciop.int:50030/jobdetails.jsp?jobid=job_201211101342_0045
526
12/11/21 12:28:05 ERROR streaming.StreamJob: Job not successful. Error: NA
527
12/11/21 12:28:05 INFO streaming.StreamJob: killJob...
528
Streaming Command Failed!
529
[INFO   ][log] All data, output and logs available at /share//tmp/sandbox/sample/PreProc
530
</pre>
531
532
At this point you can use your browser to display the URL of the _*Traking URL*_
533
534
!https://ciop.eo.esa.int/attachments/46/single_job_debug_1.png!
535
536
This is a single thread job, see the reduce in the table
537
You can click on the kill job in the reduce line. The page shows the task attempt, usually one.
538
539
!https://ciop.eo.esa.int/attachments/47/single_job_debug_2.png!
540
541
In this case, the job ended with exit code 19
542
543
Click on the task link, the same info as before is shown but there are more details (e.g. log in the last column)
544
545
You can click on _*all*_
546
547
_stout_ and _stderr_ appears, you can debug the processing job with this information.
548
549
h3. 5.6 -- Simulating a complete workflow -- (Section under revision)
550
551
h2. 6. -- Application deployment -- (section under revision)
552
553
This section describes the procedure to deploy your application once ready and successfully integrated.
554
555
h3. 6.1 Deploy as a service
556
557
h3. 6.2 Test application in pre-operation
558
559
h3. 6.3 Plan the production