С hadoop я могу использовать s3 в качестве URL-адреса хранилища. Но в настоящее время у меня много приложений, использующих hdfs://...
, и я хотел бы перенести весь кластер и приложения в EMR и s3. мне нужно изменить URL-адрес в каждом приложении от hdfs://...
до s3://...
или можно каким-то образом сообщить EMR для хранения содержимого hdfs на s3, чтобы каждое приложение все еще могло использовать hdfs://...
, но на самом деле оно укажет на s3? если да, то как?EMR hdfs прозрачно с поддержкой s3
ответ
Это очень хороший вопрос. есть ли такая вещь, как протокольная подмена? не могли бы вы повлиять на это поведение, написав что-то, что переопределяет порядок обработки протоколов? Честно говоря, такое решение дает мне хеби-джеи, потому что, если кто-то не знает, что происходит, а затем неожиданно развивается, и он не может действительно диагностировать или исправлять его, это хуже, чем исходная проблема.
Если бы я был вами, я бы заменил все мои приложения, чтобы просто обновить протокол.
допустим у вас все ваши приложения в каталоге:
-- 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
и теперь приложение 1.txt имеет s3://
везде, а не hdfs://
Не так ли?
Приложения должны быть реорганизованы таким образом, чтобы входные и выходные пути не были жестко закодированы. Вместо этого они должны быть введены в приложения, после чтения из некоторых файлов конфигурации или проанализированы из аргументов командной строки.
Возьмем следующий 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.