2016-09-21 65 views
1

使用hadoop我可以使用s3作为存储网址。但目前我有很多应用程序使用hdfs://...,我想将整个群集和应用程序迁移到EMR和s3。我是否必须将每个应用程序中的url从hdfs://...更改为s3://...或者是否可以通过某种方式告诉EMR在s3上存储hdfs内容,以便每个应用程序仍然可以使用hdfs://...但实际上它会指向s3?如果是这样,怎么样?EMR hdfs透明地支持s3

回答

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之间切换。