使用hadoop我可以使用s3作为存储URL。但是目前我有很多使用hdfs://...
的应用程序,我想将整个集群和应用程序迁移到EMR和s3。我是否必须在hdfs://...
到s3://...
的每个应用中更改网址,或者是否有可能告诉EMR在s3上存储hdfs内容,以便每个应用仍然可以使用hdfs://...
但事实上它会指向s3?如果是这样,怎么样?
答案 0 :(得分:0)
这是一个非常好的问题。是否存在协议欺骗这样的问题?您是否可以通过编写覆盖协议处理方式的内容来实际影响此行为?老实说,这种解决方案给了我heeby-jeebies,因为如果有人不知道发生了什么然后意外的路径,并且无法真正诊断或修复它,那就是比原来的问题更糟糕。
如果我是你,我会对我的所有应用进行查找替换,以便更新协议。
让我们假设您已将所有应用程序放在目录中:
-- myApps
|-- app1.txt
|-- app2.txt
并且您希望在所有这些应用中找到并替换hdfs://
s3://
,我只是做这样的事情:
sed -i .original 's/hdfs/s3/h' *
产生:
-- myApps
|-- app1.txt
|-- app1.txt.original
|-- app2.txt
|-- app2.txt.original
现在app1.txt到处都有s3://
而不是hdfs://
不够吗?
答案 1 :(得分:0)
应重构应用程序,以使输入和输出路径不是硬编码的。相反,它们应在从一些配置文件中读取或从命令行参数解析后注入应用程序。
以以下Pig脚本为例:
loaded_records =
LOAD '$input'
USING PigStorage();
--
-- ... magic processing ...
--
STORE processed_records
INTO '$output'
USING PigStorage();
然后我们可以有一个这样的包装脚本:
#!/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之间切换。