使用hadoop我可以使用s3作为存储网址。但目前我有很多应用程序使用hdfs://...
,我想将整个群集和应用程序迁移到EMR和s3。我是否必须将每个应用程序中的url从hdfs://...
更改为s3://...
或者是否可以通过某种方式告诉EMR在s3上存储hdfs内容,以便每个应用程序仍然可以使用hdfs://...
但实际上它会指向s3?如果是这样,怎么样?EMR hdfs透明地支持s3
1
A
回答
0
这是一个非常好的问题。协议欺骗是否有这样的事情?你真的可以通过写一些重写协议处理的东西来影响这种行为吗?老实说,这样的解决方案给了我heeby-jeebies,因为如果有人不知道发生了什么,然后意想不到的路径,并且不能真正诊断或修复它,那比原始问题更糟糕。
如果我是你,我会在我所有的应用程序上进行查找替换以更新协议。
让我们说你有你所有的应用程序目录中:
-- myApps
|-- app1.txt
|-- app2.txt
,你想找到,并在所有这些应用程序与s3://
取代hdfs://
,我只是做这样的事情:
sed -i .original 's/hdfs/s3/h' *
其产生:
-- myApps
|-- app1.txt
|-- app1.txt.original
|-- app2.txt
|-- app2.txt.original
和现在的应用1.txt有s3://
到处都是,而不是hdfs://
这还不够吗?
0
应用程序应重构,以便输入和输出路径不是硬编码的。相反,在从某些配置文件读取或从命令行参数解析之后,它们将被注入到应用程序中。
看看下面的猪脚本,例如:
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之间切换。