2015-01-26 2 views
2


Я выполняю sqoop job from Oozie workflow. Я могу создать целевой каталог со статическими именами в команде sqoop следующим образом.
Oozie: Sqoop dynamic target directory

<action name="table1" cred=""> 
     <sqoop xmlns="uri:oozie:sqoop-action:0.2"> 
     <job-tracker>${jobTracker}</job-tracker> 
     <name-node>${nameNode}</name-node> 
     <command>job --exec EMPLOYEE --meta-connect jdbc:hsqldb:hsql://<host>:<port>/sqoop -- --target-dir /user/test/Employee/20150126</command> 
     </sqoop> 
     <ok to="end" /> 
     <error to="kill" /> 
</action> 

Мне нужно создать динамический целевой каталог с датой. Я пробовал со следующим, но не работал.

<action name="table1" cred=""> 
     <sqoop xmlns="uri:oozie:sqoop-action:0.2"> 
     <job-tracker>${jobTracker}</job-tracker> 
     <name-node>${nameNode}</name-node> 
     <command>job --exec EMPLOYEE --meta-connect jdbc:hsqldb:hsql://<host>:<port>/sqoop -- --target-dir /user/test/Employee/$(date +%Y%m%d)</command> 
     </sqoop> 
     <ok to="end" /> 
     <error to="kill" /> 
</action> 

во время работы отображается нижеследующая ошибка.

3622 [main] INFO org.apache.sqoop.Sqoop - Running Sqoop version: 1.4.5-cdh5.2.0 
    3957 [main] ERROR org.apache.sqoop.tool.BaseSqoopTool - Error parsing arguments for import: 
    3957 [main] ERROR org.apache.sqoop.tool.BaseSqoopTool - Unrecognized argument: +%Y%m%d) 
    Intercepting System.exit(1) 
+1

Я думаю, вам нужно будет создать свойство job, например '$ {today}, а затем включить его в действие scoop. Команда sqoop action не является вызовом bash, поэтому '$ (date +% Y% m% d)' не будет работать – owen79

ответ

0

Вы можете использовать действие оболочки для присвоения env-var в качестве даты следующим способом.

"variable.sh"

#!/bin/sh 
outputDir =$(date +%Y%m%d) 

Workflow.xml

<action name='shell1'> 
     <shell xmlns="uri:oozie:shell-action:0.1"> 
      <job-tracker>${jobTracker}</job-tracker> 
      <name-node>${nameNode}</name-node> 
      <exec>variable.sh</exec> 
         (or) 
      <env-var>[outputDir=$(date +%Y%m%d)]</env-var> 
     </shell> 
     <ok to="table1" /> 
     <error to="fail" /> 
</action> 
<action name="table1" cred=""> 
     <sqoop xmlns="uri:oozie:sqoop-action:0.2"> 
     <job-tracker>${jobTracker}</job-tracker> 
     <name-node>${nameNode}</name-node> 
     <command>job --exec EMPLOYEE --meta-connect jdbc:hsqldb:hsql://<host>:<port>/sqoop -- --target-dir /user/test/Employee/$(outputDir)</command> 
     </sqoop> 
     <ok to="end" /> 
     <error to="kill" /> 
</action> 
+0

Я пробовал с кодом выше, но он создает каталог с именем '$ (outputDir)' – Ramakrishna

+0

Tyr like ниже вместо ...., работы - Exec СОТРУДНИК - мета - подключить --target-Dir JDBC: HSQLDB: HSQL: // : /sqoop --target-dir "$ (outputDir)"

1

Вы можете передать coordina время от coordinator.xml до workflow.xml. Таким образом, в рабочем процессе вы можете иметь Лик этого

/user/test/Employee/${timePassedFromCoordinator} 
0

В координатору вы можете получить дату и формат в требуемом формате, как при

<action> 
     <workflow> 
      <app-path>${WF_Maig_1}</app-path> 
      <configuration> 

       <property><name>currentbatchtime</name><value>${coord:formatTime(coord:dateOffset(coord:nominalTime(),0,'DAY'),"yyyy-MM-dd")}</value></property> 
       <property><name>nextbatchtime</name><value>${coord:formatTime(coord:dateOffset(coord:nominalTime(),1,'DAY'),"yyyy-MM-dd")}</value></property> 
      </configuration> 
     </workflow> 
    </action> 

Теперь вы можете использовать/пользователь/тест/Employee/$ {currentbatchtime } в файле workflow.xml и в файле свойств

0

захват-вывод помог мне !.

<action name='custom-var'> 
    <shell xmlns="uri:oozie:shell-action:0.1"> 
     ... 
    <exec>set_variable.sh</exec> 
    <file>set_variable.sh</file> 
    <capture-output/> 
    </shell> 
</action> 

<action name='sqoop-test'> 
    <sqoop xmlns="uri:oozie:sqoop-action:0.2"> 
    ... 
    <command> --target-dir /test/${wf:actionData('custom-var')['var1']} --m 1 </command> 
    </sqoop> 
</action> 

set_variable.sh 
echo "var1=$(date +%Y/%m/%d)" 
Смежные вопросы