2016-09-21 8 views
1

С hadoop я могу использовать s3 в качестве URL-адреса хранилища. Но в настоящее время у меня много приложений, использующих hdfs://..., и я хотел бы перенести весь кластер и приложения в EMR и s3. мне нужно изменить URL-адрес в каждом приложении от hdfs://... до s3://... или можно каким-то образом сообщить EMR для хранения содержимого hdfs на s3, чтобы каждое приложение все еще могло использовать hdfs://..., но на самом деле оно укажет на s3? если да, то как?EMR hdfs прозрачно с поддержкой s3

ответ

0

Это очень хороший вопрос. есть ли такая вещь, как протокольная подмена? не могли бы вы повлиять на это поведение, написав что-то, что переопределяет порядок обработки протоколов? Честно говоря, такое решение дает мне хеби-джеи, потому что, если кто-то не знает, что происходит, а затем неожиданно развивается, и он не может действительно диагностировать или исправлять его, это хуже, чем исходная проблема.

Если бы я был вами, я бы заменил все мои приложения, чтобы просто обновить протокол.

допустим у вас все ваши приложения в каталоге:

-- 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://

Не так ли?

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.