- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在创建一个包装器,用于使用 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/
我正在从一个旧数据库中选择数据,该数据库有一个滥用状态列。状态列中包含多条信息。值如“新联系人 YYYY”、“在线 YYYY”、“更新 YYYY”、“撤回 YYYY”等……。您可能已经猜到了,YYYY
我想使用ant的replace任务替换这样的文件之一中的 token : 版本.txt version.number=${versionNumber} build.gradle task writeV
sorted_elems 列表中有一些元素将被更改为 str 例如: sorted_elems = ['[abc]', '[xyz]', ['qwe']] 我想删除定义的字符 - [, ], ' 并打
如果替换在变量中传递,第一次和第二次替换是否等效? #!/usr/bin/env perl6 use v6; my $foo = 'switch'; my $t1 = my $t2 = my $t3
我正在做一个本地测试来比较 C# 中 String 和 StringBuilder 的 Replace 操作性能,但是对于 String 我使用了以下代码: String str = "String
我看到了所有内容,没有看到使用“--replace”的方式的内容。 如何在 wkhtmltopdf 中使用“--replace”。 请给我一个例子,谢谢。:) 最佳答案 假设您有一个页脚 my_foo
我需要在 50 多个文件中进行大量搜索/替换,并且正在使用 Sublime Text 3。 有没有办法逐步执行并交互确认每个更改?我不想要只执行所有替换的一揽子“全部替换”操作。 我正在思考 vi/v
那么“replace ”属性如何与 composer 一起使用? ?我已经阅读了 Composer 文档,但仍然不明白。搜索更多信息并没有回答我的问题。 当我查看Laravel/Framework上的
我在玩 F# 句法。 在瑞典,我们有一个游戏叫做“Backslang”(谷歌翻译自“Rövarspråk”) 规则很简单。你说的所有话都必须以特定的方式说出来。虽然人声是相同的,但每个辅音都必须用“o
是否可以在Atom或Sublime Text中对“item”一词使用“查找和替换”并将其替换为“item [i]”,其中[i]是从1开始的数字? 我有一堆看起来像这样的物品: item1 item1
我不太确定如何解释,所以我将从输出开始。我需要返回这个: { replies: [ { type: 'text', content: 'one' } { type:
我是 C# 的新手,所以请原谅我的错误。 我想在每次调用该段代码时(每次调用 2-4 次)替换字符串的某些部分。我想知道哪种方法在性能方面更好:string.Replace 或 stringBuild
我了解.Replace() 和-replace 之间的区别,但是什么是-replace 和[Regex]: :替换()? 我测试了以下 2 个代码,但对我来说结果完全一样。 我还引用了 PowerSh
如果我正在做类似的事情: someString.Replace("abc","").Replace("def","").Replace(@"c:\Windows","") 我怎样才能把它替换成 Reg
我是 C# 的新手,所以请原谅我的错误。 我想在每次调用该段代码时(每次调用 2-4 次)替换字符串的某些部分。我想知道哪种方法在性能方面更好:string.Replace 或 stringBuild
当我使用 call() 或 apply() 时,我遇到了问题。 console.log(String.prototype.replace === String.replace);//false 我认为
在我使用 5-10 个替换的情况下是否有必要使用 stringbuilder。 String someData = "......"; someData = someData.replaceAll("
我有一个字符串,我需要用字典中的值替换其中的标记。它必须尽可能高效。使用 string.replace 进行循环只会消耗内存(记住,字符串是不可变的)。 StringBuilder.Replace()
我正在使用具有许多不同库依赖项的 gradle 项目并使用新的 list 合并。在我的 标签我已经这样设置了: .... 但我收到错误消息: /android/MyApp/app/src/main
我正在尝试从一个数据库中的表中提取模式并将其传输到另一个数据库。以下是执行此操作的函数的一部分。 当 Table( ... ) 时出错被称为。 功能示例: def transfer_data(self
我是一名优秀的程序员,十分优秀!