根据建议更新 shell 脚本代码:需要知道 "sed" 的命令以替换值
updated shell script code as suggested: Need to know command for "sed" in replacing values
我正在创建一个包装器,用于使用 sqoop 通过 Oozie 从 shellscript 将数据从 mysql 移动到 hdfs。
我有一个 "InputFile" 包含源数据库、要导入的表和 hdfs 输出目录,"Shell_Script.sh" 中的 'while-loop' 从中读取它并检查 sourceDB,如果它是 'Mysql',然后在 'if-loop' 内部,它将相应的 Mysql 参数分配给 ShellScript.sh 文件中提到的变量。
我有 "Sqoop_job.property file",其中我提到了通用的数据库参数,"Oozie workflow" 从中获取执行值。为了以通用方式执行我的数据摄取,我没有在 Sqoop_job.property 文件中直接提及数据库参数。
因此我应该通过 "Shell_Script.sh" 文件替换它。因此,我尝试使用 "sed-command" 替换 InputFile(SourceDB,db_name,Mysql_table,hdfsdir) 中的数据库参数值以及 [=49= 中分配的变量](驱动程序、jdbcUri、用户名、密码)
在执行 "Shell_Script.sh" 文件时,我的 oozie 作业抛出 Error:java。lang.RuntimeException:无法加载数据库驱动程序 class:通用
InputFile.txt:这是一个包含数据库详细信息以及输入和输出路径的文本文件。
# SourceDB|db_name|Mysql_table|hdfsdir
Mysql|sqoop_check|WrapperTbl|/root/SqoopWrapper2/output1
Mysql|sqoop_check|WrapperTbl2|/root/SqoopWrapper2/output2
Sqoop_job.property: "包含 hadoop 和 mysql 参数的文件作为通用"
oozie.wf.application.path=/root/SqoopWrapper2/sqoop_workflow.xml
SourceDB=generic
db_name=generic
Mysql_table=generic
driver=generic
jdbcUri=generic
UserName=generic
Password=generic
hdfsdir=generic
SqoopScript.sh : "这是一个脚本文件,用于读取输入文件,它检查数据库源并从 InputFile 获取值,并从 'if-loop' 分配值并创建一个新的 Scoop_job.property 文件并执行 oozie workflow.xml "
# Assigned path of input file and reading it thro' while loop
input=/root/SqoopWrapper2/InputFile.txt
IFS='|'
while read -r SourceDB db_name Mysql_table hdfsdir
do
# 在读取输入文件时检查源数据库并分配相应的数据库参数。
if [ "$SourceDB" = "Mysql" ]
then
driver=com.mysql.jdbc.Driver
jdbcUri=jdbc:mysql://edgenode:3306
UserName=****
Password=*****
# SourceDB,db_name,Mysql_table,hdfsdir,driver,jdbcUri,UserName, Password 的值应该替换成 Scoop_job.property 文件中的 "generic" 和应该创建一个新的 Scoop_job.property 文件,以便在调用 属性 文件时执行 oozie workflow.xml。
sed -e 's/SourceDB=generic/SourceDB="$SourceDB"/' > sqoop_job.properties
sed -e 's/db_name=generic/db_name="$db_name"/' > sqoop_job.properties
sed -e 's/Mysql_table=generic/Mysql_table="$Mysql_table"/' > sqoop_job.properties
sed -e 's/hdfsdir=generic/hdfsdir="$hdfsdir"/' > sqoop_job.properties
sed -e 's/jdbcUri=generic/jdbcUri="$jdbcUri"/' > sqoop_job.properties
sed -e 's/driver=generic/driver="$driver"/' > sqoop_job.properties
sed -e 's/UserName=generic/UserName="$Username"/' > sqoop_job.properties
sed -e 's/Password=generic/Password="$Password"/' > sqoop_job.properties
fi
# Oozie 作业在调用 sqoop_job.property 文件时执行。
ooziejob=$(oozie job -oozie http://oozieserver/oozie -config /root/SqoopWrapper2/prop/sqoop_job.properties -run);
echo $ooziejob;
done < "$input"
exit 0
Oozie worflow.xml: "consist of sqoop actions to import data from mysql table to hdfs directory by getting values from Sqoop_job.property file"
<workflow-app name="sqoop-wf" xmlns="uri:oozie:workflow:0.4">
<global>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
</global>
<start to ="SqoopJob" />
<action name="SqoopJob">
<sqoop xmlns="uri:oozie:sqoop-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<arg> import </arg>
<arg> --connect </arg>
<arg> ${jdbcUri} </arg>
<arg> --username </arg>
<arg> ${UserName}</arg>
<arg> --password </arg>
<arg> ${Password}</arg>
<arg> --table </arg>
<arg> ${Mysql_table} </arg>
<arg> --target-dir </arg>
<arg> ${hdfsdir} </arg>
<arg> --driver </arg>
<arg> &{driver} </arg>
<arg>-m</arg>
<arg>1</arg>
</sqoop>
<ok to="end" />
<error to="kill"/>
</action>
<kill name='kill'>
<message>Something went wrong</message>
</kill>
<end name='end' />
</workflow-app>
这里有几个问题:
1- 您缺少最后一个 sed
分隔符“|”。
例如:
sed -e 's|SourceDB=generic|sourceDB=$SourceDB|'
2- 您必须告诉 sed
您要在何处应用命令(文件或变量),例如:
sed -e 's/SourceDB=generic/sourceDB=$SourceDB/' filename.txt
或
echo $variable | sed -e 's/SourceDB=generic/sourceDB=$SourceDB/'
3- 使用“>”运算符,您将始终覆盖输出文件。如果你想追加新行,你必须使用“>>”。例如:
sed -e 's/SourceDB=generic/sourceDB=$SourceDB/' filename.txt >> outputfile.txt
我正在创建一个包装器,用于使用 sqoop 通过 Oozie 从 shellscript 将数据从 mysql 移动到 hdfs。
我有一个 "InputFile" 包含源数据库、要导入的表和 hdfs 输出目录,"Shell_Script.sh" 中的 'while-loop' 从中读取它并检查 sourceDB,如果它是 'Mysql',然后在 'if-loop' 内部,它将相应的 Mysql 参数分配给 ShellScript.sh 文件中提到的变量。
我有 "Sqoop_job.property file",其中我提到了通用的数据库参数,"Oozie workflow" 从中获取执行值。为了以通用方式执行我的数据摄取,我没有在 Sqoop_job.property 文件中直接提及数据库参数。
因此我应该通过 "Shell_Script.sh" 文件替换它。因此,我尝试使用 "sed-command" 替换 InputFile(SourceDB,db_name,Mysql_table,hdfsdir) 中的数据库参数值以及 [=49= 中分配的变量](驱动程序、jdbcUri、用户名、密码)
在执行 "Shell_Script.sh" 文件时,我的 oozie 作业抛出 Error:java。lang.RuntimeException:无法加载数据库驱动程序 class:通用
InputFile.txt:这是一个包含数据库详细信息以及输入和输出路径的文本文件。
# SourceDB|db_name|Mysql_table|hdfsdir
Mysql|sqoop_check|WrapperTbl|/root/SqoopWrapper2/output1
Mysql|sqoop_check|WrapperTbl2|/root/SqoopWrapper2/output2
Sqoop_job.property: "包含 hadoop 和 mysql 参数的文件作为通用"
oozie.wf.application.path=/root/SqoopWrapper2/sqoop_workflow.xml
SourceDB=generic
db_name=generic
Mysql_table=generic
driver=generic
jdbcUri=generic
UserName=generic
Password=generic
hdfsdir=generic
SqoopScript.sh : "这是一个脚本文件,用于读取输入文件,它检查数据库源并从 InputFile 获取值,并从 'if-loop' 分配值并创建一个新的 Scoop_job.property 文件并执行 oozie workflow.xml "
# Assigned path of input file and reading it thro' while loop
input=/root/SqoopWrapper2/InputFile.txt
IFS='|'
while read -r SourceDB db_name Mysql_table hdfsdir
do
# 在读取输入文件时检查源数据库并分配相应的数据库参数。
if [ "$SourceDB" = "Mysql" ]
then
driver=com.mysql.jdbc.Driver
jdbcUri=jdbc:mysql://edgenode:3306
UserName=****
Password=*****
# SourceDB,db_name,Mysql_table,hdfsdir,driver,jdbcUri,UserName, Password 的值应该替换成 Scoop_job.property 文件中的 "generic" 和应该创建一个新的 Scoop_job.property 文件,以便在调用 属性 文件时执行 oozie workflow.xml。
sed -e 's/SourceDB=generic/SourceDB="$SourceDB"/' > sqoop_job.properties
sed -e 's/db_name=generic/db_name="$db_name"/' > sqoop_job.properties
sed -e 's/Mysql_table=generic/Mysql_table="$Mysql_table"/' > sqoop_job.properties
sed -e 's/hdfsdir=generic/hdfsdir="$hdfsdir"/' > sqoop_job.properties
sed -e 's/jdbcUri=generic/jdbcUri="$jdbcUri"/' > sqoop_job.properties
sed -e 's/driver=generic/driver="$driver"/' > sqoop_job.properties
sed -e 's/UserName=generic/UserName="$Username"/' > sqoop_job.properties
sed -e 's/Password=generic/Password="$Password"/' > sqoop_job.properties
fi
# Oozie 作业在调用 sqoop_job.property 文件时执行。
ooziejob=$(oozie job -oozie http://oozieserver/oozie -config /root/SqoopWrapper2/prop/sqoop_job.properties -run);
echo $ooziejob;
done < "$input"
exit 0
Oozie worflow.xml: "consist of sqoop actions to import data from mysql table to hdfs directory by getting values from Sqoop_job.property file"
<workflow-app name="sqoop-wf" xmlns="uri:oozie:workflow:0.4">
<global>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
</global>
<start to ="SqoopJob" />
<action name="SqoopJob">
<sqoop xmlns="uri:oozie:sqoop-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<arg> import </arg>
<arg> --connect </arg>
<arg> ${jdbcUri} </arg>
<arg> --username </arg>
<arg> ${UserName}</arg>
<arg> --password </arg>
<arg> ${Password}</arg>
<arg> --table </arg>
<arg> ${Mysql_table} </arg>
<arg> --target-dir </arg>
<arg> ${hdfsdir} </arg>
<arg> --driver </arg>
<arg> &{driver} </arg>
<arg>-m</arg>
<arg>1</arg>
</sqoop>
<ok to="end" />
<error to="kill"/>
</action>
<kill name='kill'>
<message>Something went wrong</message>
</kill>
<end name='end' />
</workflow-app>
这里有几个问题:
1- 您缺少最后一个 sed
分隔符“|”。
例如:
sed -e 's|SourceDB=generic|sourceDB=$SourceDB|'
2- 您必须告诉 sed
您要在何处应用命令(文件或变量),例如:
sed -e 's/SourceDB=generic/sourceDB=$SourceDB/' filename.txt
或
echo $variable | sed -e 's/SourceDB=generic/sourceDB=$SourceDB/'
3- 使用“>”运算符,您将始终覆盖输出文件。如果你想追加新行,你必须使用“>>”。例如:
sed -e 's/SourceDB=generic/sourceDB=$SourceDB/' filename.txt >> outputfile.txt