使用hadoop,我可以使用s3作为存储url。但目前我有很多应用程序使用 hdfs://... 我想把整个集群和应用程序迁移到emr和s3。我必须改变每个应用程序的网址吗 hdfs://... 至 s3://... 或者有没有可能告诉emr在s3上存储hdfs内容,这样每个应用程序仍然可以使用 hdfs://... 但事实上它会指向s3?如果是,怎么做?
hdfs://...
s3://...
ds97pgxw1#
应重构应用程序,以便输入和输出路径不被硬编码。相反,它们应该在从一些配置文件读取或从命令行参数解析后被注入到应用程序中。以下面的pig脚本为例:
loaded_records = LOAD '$input' USING PigStorage(); -- -- ... magic processing ... -- STORE processed_records INTO '$output' USING PigStorage();
然后我们可以有这样一个 Package 器脚本:
# !/usr/bin/env bash config_file=${1:?"Missing config_file"} [[ -f "$config_file" ]] && source "$config_file" || { echo "Failed to source config file $config_file"; exit 1; } pig -p input="${input_root:?'Missing parameter input_root in config_file'}/my_input_path" -p output="${output:?'Missing parameter output_root in config_file'}/my_output_path" the_pig_script.pig
在配置文件中:
input_root="s3://mybucket/input" output_root="s3://mybucket/output"
如果您有这种设置,您只需更改配置即可在hdfs和s3之间切换。
8ehkhllq2#
这是个很好的问题。有协议欺骗这回事吗?您是否真的可以通过编写覆盖协议处理方式的内容来影响这种行为?老实说,这种解决方案让我大吃一惊,因为如果有人不知道正在发生这种情况,然后得到意想不到的路径,并不能真正诊断或修复它,这比原来的问题更糟糕。如果我是你,我会对我所有的应用程序做一个查找替换来更新协议。假设您的所有应用程序都在一个目录中:
-- myApps |-- app1.txt |-- app2.txt
你想找到并替换 hdfs:// 与 s3:// 在所有这些应用程序中,我都会这样做:
hdfs://
s3://
sed -i .original 's/hdfs/s3/h' *
产生:
-- myApps |-- app1.txt |-- app1.txt.original |-- app2.txt |-- app2.txt.original
现在app1.txt s3:// 到处都是,而不是 hdfs:// 这还不够吗?
2条答案
按热度按时间ds97pgxw1#
应重构应用程序,以便输入和输出路径不被硬编码。相反,它们应该在从一些配置文件读取或从命令行参数解析后被注入到应用程序中。
以下面的pig脚本为例:
然后我们可以有这样一个 Package 器脚本:
在配置文件中:
如果您有这种设置,您只需更改配置即可在hdfs和s3之间切换。
8ehkhllq2#
这是个很好的问题。有协议欺骗这回事吗?您是否真的可以通过编写覆盖协议处理方式的内容来影响这种行为?老实说,这种解决方案让我大吃一惊,因为如果有人不知道正在发生这种情况,然后得到意想不到的路径,并不能真正诊断或修复它,这比原来的问题更糟糕。
如果我是你,我会对我所有的应用程序做一个查找替换来更新协议。
假设您的所有应用程序都在一个目录中:
你想找到并替换
hdfs://
与s3://
在所有这些应用程序中,我都会这样做:产生:
现在app1.txt
s3://
到处都是,而不是hdfs://
这还不够吗?