根据建议更新 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