Project

General

Profile

Lib-metview » History » Version 2

Herve Caumont, 2013-08-22 10:40

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