Pour utiliser efficacement les tâches de réduction de carte dans Hadoop , il faut que les données soient stockées au format de fichier de séquence de hadoop . Cependant, pour le moment, les données sont uniquement au format .txt. Quelqu'un peut-il suggérer un moyen de convertir un fichier .txt en fichier de séquence?
La réponse la plus simple est donc simplement un travail "d'identité" qui a une sortie SequenceFile.
Ressemble à ceci en Java:
public static void main(String[] args) throws IOException,
InterruptedException, ClassNotFoundException {
Configuration conf = new Configuration();
Job job = new Job(conf);
job.setJobName("Convert Text");
job.setJarByClass(Mapper.class);
job.setMapperClass(Mapper.class);
job.setReducerClass(Reducer.class);
// increase if you need sorting or a special number of files
job.setNumReduceTasks(0);
job.setOutputKeyClass(LongWritable.class);
job.setOutputValueClass(Text.class);
job.setOutputFormatClass(SequenceFileOutputFormat.class);
job.setInputFormatClass(TextInputFormat.class);
TextInputFormat.addInputPath(job, new Path("/lol"));
SequenceFileOutputFormat.setOutputPath(job, new Path("/lolz"));
// submit and wait for completion
job.waitForCompletion(true);
}
import Java.io.IOException;
import Java.net.URI;
import org.Apache.hadoop.conf.Configuration;
import org.Apache.hadoop.fs.FileSystem;
import org.Apache.hadoop.fs.Path;
import org.Apache.hadoop.io.IOUtils;
import org.Apache.hadoop.io.IntWritable;
import org.Apache.hadoop.io.SequenceFile;
import org.Apache.hadoop.io.Text;
//White, Tom (2012-05-10). Hadoop: The Definitive Guide (Kindle Locations 5375-5384). OReilly Media - A. Kindle Edition.
public class SequenceFileWriteDemo {
private static final String[] DATA = { "One, two, buckle my shoe", "Three, four, shut the door", "Five, six, pick up sticks", "Seven, eight, lay them straight", "Nine, ten, a big fat hen" };
public static void main( String[] args) throws IOException {
String uri = args[ 0];
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create( uri), conf);
Path path = new Path( uri);
IntWritable key = new IntWritable();
Text value = new Text();
SequenceFile.Writer writer = null;
try {
writer = SequenceFile.createWriter( fs, conf, path, key.getClass(), value.getClass());
for (int i = 0; i < 100; i ++) {
key.set( 100 - i);
value.set( DATA[ i % DATA.length]);
System.out.printf("[% s]\t% s\t% s\n", writer.getLength(), key, value);
writer.append( key, value); }
} finally
{ IOUtils.closeStream( writer);
}
}
}
Cela dépend du format du fichier TXT. Est-ce une ligne par enregistrement? Si c'est le cas, vous pouvez simplement utiliser TextInputFormat, qui crée un enregistrement pour chaque ligne. Dans votre mappeur, vous pouvez analyser cette ligne et l'utiliser de la manière que vous choisissez.
S'il ne s'agit pas d'une ligne par enregistrement, vous devrez peut-être écrire votre propre implémentation InputFormat. Jetez un coup d’œil à ce tutoriel pour plus d’informations.
Vous pouvez également simplement créer une table intermédiaire, LOAD DATA le contenu du fichier csv directement dans celle-ci, puis créer une seconde table en tant que séquencefile (partitionnée, en cluster, etc.) et l'insérer dans la sélection de la table intermédiaire. Vous pouvez également définir des options pour la compression, par exemple,
set Hive.exec.compress.output = true;
set io.seqfile.compression.type = BLOCK;
set mapred.output.compression.codec = org.Apache.hadoop.io.compress.SnappyCodec;
create table... stored as sequencefile;
insert overwrite table ... select * from ...;
Le framework MR prendra alors en charge le plus gros travail pour vous, vous évitant ainsi d'avoir à écrire du code Java.
Soyez vigilant avec le spécificateur de format :
.
Par exemple (notez l'espace entre %
et s
), System.out.printf("[% s]\t% s\t% s\n", writer.getLength(), key, value);
nous donnera Java.util.FormatFlagsConversionMismatchException: Conversion = s, Flags =
Au lieu de cela, nous devrions utiliser:
System.out.printf("[%s]\t%s\t%s\n", writer.getLength(), key, value);
si vous avez installé Mahout - il a quelque chose appelé: seqdirectory - qui peut le faire
Si vos données ne sont pas sur HDFS, vous devez les télécharger sur HDFS. Deux options:
i) hdfs -put sur votre fichier .txt et une fois que vous l’obtenez sur HDFS, vous pouvez le convertir en fichier seq.
ii) Vous prenez un fichier texte comme entrée sur votre zone client HDFS et le convertissez en SeqFile à l'aide des API de fichier de séquence en créant un fichier SequenceFile.Writer et en lui ajoutant (clé, valeurs).
Si vous ne vous souciez pas de la clé, vous pouvez définir le numéro de ligne comme clé et compléter le texte comme valeur.