【问题标题】:EMR hdfs transparently backed by s3由 s3 透明支持的 EMR hdfs
【发布时间】:2017-11-22 04:05:39
【问题描述】:
有了 hadoop,我可以使用 s3 作为存储 url。但目前我有很多应用程序使用hdfs://...,我想将整个集群和应用程序迁移到 EMR 和 s3。我是否必须将每个应用程序中的 url 从 hdfs://... 更改为 s3://... 或者是否可以以某种方式告诉 EMR 将 hdfs 内容存储在 s3 上,以便每个应用程序仍然可以使用 hdfs://... 但实际上它会指向 s3?如果有,怎么做?
【问题讨论】:
标签:
amazon-web-services
hadoop
hdfs
emr
amazon-emr
【解决方案1】:
这是一个非常好的问题。是否存在协议欺骗之类的东西?你真的可以通过编写一些覆盖协议处理方式的东西来影响这种行为吗?老实说,这种解决方案让我大吃一惊,因为如果有人不知道这种情况正在发生,然后得到意想不到的路径,并且无法真正诊断或修复它,那比原来的问题更糟糕。
如果我是你,我会在我所有的应用程序上进行查找替换,以更新协议。
假设您将所有应用都放在一个目录中:
-- 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://
这还不够吗?
【解决方案2】:
应重构应用程序,使输入和输出路径不被硬编码。相反,它们应在从某些配置文件中读取或从命令行参数解析后注入到应用程序中。
以下面的 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 之间切换。