gpt4 book ai didi

linux - 按照建议更新 shell 脚本代码 : Need to know command for "sed" in replacing values

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:17 25 4
gpt4 key购买 nike

我正在创建一个包装器,用于使用 sqoop 通过 Oozie 从 shellscript 将数据从 mysql 移动到 hdfs。

我有一个包含源数据库、要导入的表和 hdfs 输出目录的“InputFile”,“Shell_Script.sh”中的“while-loop”从中读取它并检查 sourceDB,如果它是“Mysql”然后在“if-loop”中,它将相应的 Mysql 参数分配给 ShellScript.sh 文件中提到的变量。

我有“Sqoop_job.property 文件”,其中我提到了通用的数据库参数,“Oozie 工作流”从中获取执行值。为了以通用方式执行我的数据摄取,我没有在 Sqoop_job.property 文件中直接提及数据库参数。

因此我应该通过“Shell_Script.sh”文件替换它。所以我尝试使用“sed-command”来替换 InputFile(SourceDB,db_name,Mysql_table,hdfsdir) 中的数据库参数值,以及从“if-condition”(driver,jdbcUri,UserName,密码)

在执行“Shell_Script.sh”文件时,我的 oozie 作业抛出错误:java.lang.RuntimeException:无法加载数据库驱动程序类:通用

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工作流.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 工作流.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:“包含通过从 Sqoop_job.property 文件获取值将数据从 mysql 表导入到 hdfs 目录的 sqoop 操作”

    <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

关于linux - 按照建议更新 shell 脚本代码 : Need to know command for "sed" in replacing values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42412944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com