2016-12-15 2 views
0

J'ai un tas de petits fichiers texte (1KB à 1MB) stockés dans Amazon S3 que je voudrais traiter en utilisant Hadoop d'Amazon EMR.EMR Hadoop traitement fichier S3 entier

Chaque enregistrement donné au mappeur doit contenir tout le contenu d'un fichier texte ainsi qu'un moyen de déterminer le nom de fichier, donc je ne peux pas utiliser le TextInputFormat par défaut.

Quelle est la meilleure façon d'y parvenir? Y a-t-il autre chose que je puisse faire (comme copier des fichiers de S3 vers hdfs) pour augmenter les performances?

Répondre

0

J'ai eu le même problème. S'il vous plaît se référer aux questions suivantes.

Si vous ne disposez pas de gros fichiers, mais ont beaucoup de fichiers, il suffit d'utiliser la commande s3cmd get --recursive s3://<url> .. Après avoir récupéré les fichiers dans l'instance EMR, vous pouvez créer des tables avec Hive. Par exemple, vous pouvez charger des fichiers entiers avec l'instruction LOAD DATA avec partition.

échantillon

C'est un exemple de code

#!/bin/bash 

s3cmd get --recursive s3://your.s3.name . 

# create table with partitions 
hive -e "SET mapred.input.dir.recursive=true; DROP TABLE IF EXISTS import_s3_data;" 
hive -e "CREATE TABLE import_s3_data(rawdata string) 
     PARTITIONED BY (tier1 string, tier2, string, tier3 string);" 

LOAD_SQL="" 

# collect files as array 
FILES=(`find . -name \*.txt -print`) 

for FILE in ${FILES[@]} 
do 
    DIR_INFO=(`echo ${FILE##./} | tr -s '/' ' '`) 
    T1=${DIR_INFO[0]} 
    T2=${DIR_INFO[1]} 
    T3=${DIR_INFO[2]} 
    LOAD_SQL="${LOAD_SQL} LOAD DATA LOCAL INPATH '${FILE}' INTO TABLE 
       import_s3_data PARTITION (tier1 = '${T1}', tier2 = '${T2}', tier3 = '${T3}');" 
done 
hive -e "${LOAD_SQL}" 

une autre option

Je pense qu'il ya quelques autres options pour récupérer les petites données S3

  • S3DistCp ... il va fusionner un petit fichier aussi grand pour faire face à Hadoop
  • Hive - External Tables ... il va créer une table externe référençant les stockages s3. Cependant, il a presque la même performance par rapport à l'affaire à utiliser s3cmd get. Il pourrait être plus efficace dans un tel cas, il y a beaucoup de gros fichiers bruts ou gzipés sur S3.