J'exécute Hive sur EMR et j'ai besoin de copier certains fichiers dans toutes les instances EMR.
Si je comprends bien, une façon consiste simplement à copier des fichiers sur le système de fichiers local sur chaque nœud, l'autre consiste à copier les fichiers sur le HDFS, mais je n'ai pas trouvé de moyen simple de copier directement de S3 vers HDFS.
Quelle est la meilleure manière de s'occuper de ça?
la meilleure façon de le faire est d'utiliser la commande distcp de Hadoop. Exemple (sur l'un des nœuds du cluster):
% ${HADOOP_HOME}/bin/hadoop distcp s3n://mybucket/myfile /root/myfile
Cela copierait un fichier appelé monfichier d'un compartiment S3 nommé mybucket vers /root/myfile
dans HDFS. Notez que cet exemple suppose que vous utilisez le système de fichiers S3 en mode "natif"; cela signifie que Hadoop voit chaque objet dans S3 comme un fichier. Si vous utilisez S3 en mode bloc à la place, vous remplaceriez s3n par s3 dans l'exemple ci-dessus. Pour plus d'informations sur les différences entre le mode natif S3 et le mode bloc, ainsi qu'une élaboration sur l'exemple ci-dessus, voir http://wiki.Apache.org/hadoop/AmazonS .
J'ai trouvé que distcp est un outil très puissant. En plus de pouvoir l'utiliser pour copier une grande quantité de fichiers dans et hors de S3, vous pouvez également effectuer des copies rapides de cluster à cluster avec de grands ensembles de données. Au lieu de pousser toutes les données via un seul nœud, distcp utilise plusieurs nœuds en parallèle pour effectuer le transfert. Cela rend distcp considérablement plus rapide lors du transfert de grandes quantités de données, par rapport à l'alternative de tout copier dans le système de fichiers local en tant qu'intermédiaire.
Maintenant, Amazon lui-même a un wrapper implémenté sur distcp, à savoir: s3distcp.
S3DistCp est une extension de DistCp qui est optimisée pour fonctionner avec Amazon Web Services (AWS), en particulier Amazon Simple Storage Service (Amazon S3). Vous utilisez S3DistCp en l'ajoutant en tant qu'étape dans un flux de travaux. À l'aide de S3DistCp, vous pouvez copier efficacement de grandes quantités de données d'Amazon S3 vers HDFS où elles peuvent être traitées par les étapes suivantes de votre flux de travail Amazon Elastic MapReduce (Amazon EMR). Vous pouvez également utiliser S3DistCp pour copier des données entre des compartiments Amazon S3 ou de HDFS vers Amazon S3
Exemple Copier des fichiers journaux d'Amazon S3 vers HDFS
Cet exemple suivant illustre comment copier des fichiers journaux stockés dans un compartiment Amazon S3 dans HDFS. Dans cet exemple, l'option --srcPattern est utilisée pour limiter les données copiées dans les journaux du démon.
elastic-mapreduce --jobflow j-3GY8JC4179IOJ --jar \
s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar \
--args '--src,s3://myawsbucket/logs/j-3GY8JC4179IOJ/node/,\
--dest,hdfs:///output,\
--srcPattern,.*daemons.*-hadoop-.*'
Notez que selon Amazon, à http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/FileSystemConfig.html "Amazon Elastic MapReduce - Configuration du système de fichiers", le S3 Block FileSystem est obsolète et son préfixe URI est maintenant s3bfs: // et ils déconseillent spécifiquement son utilisation car "il peut déclencher une condition de concurrence critique qui pourrait entraîner l'échec de votre flux de travaux".
Selon la même page, HDFS est désormais un système de fichiers de première classe sous S3 bien qu'il soit éphémère (disparaît lorsque les travaux Hadoop se terminent).