Я конвертирую некоторые свои собственные файлы в файлы последовательности hadoop, используя Java API.
Я читаю байтовые массивы из локального файла и добавляю их в файл последовательности в виде пар индекса (целое число)- Данные (байт []):
InputStream in = new BufferedInputStream(new FileInputStream(localSource));
FileSystem fs = FileSystem.get(URI.create(hDFSDestinationDirectory),conf);
Path sequenceFilePath = new Path(hDFSDestinationDirectory + "/"+ "data.seq");
IntWritable key = new IntWritable();
BytesWritable value = new BytesWritable();
SequenceFile.Writer writer = SequenceFile.createWriter(fs, conf,
sequenceFilePath, key.getClass(), value.getClass());
for (int i = 1; i <= nz; i++) {
byte[] imageData = new byte[nx * ny * 2];
in.read(imageData);
key.set(i);
value.set(imageData, 0, imageData.length);
writer.append(key, value);
}
IOUtils.closeStream(writer);
in.close();
Я делаю все наоборот, когда хочу вернуть файлы в исходный формат:
for (int i = 1; i <= nz; i++) {
reader.next(key, value);
int byteLength = value.getLength();
byte[] tempValue = value.getBytes();
out.write(tempValue, 0, byteLength);
out.flush();
}
Я заметил, чтозапись в SequenceFile занимает почти на порядок больше, чем чтение. Я ожидаю, что запись будет медленнее, чем чтение, но нормально ли это различие?Почему?
Подробнее: Чтение байтовых массивов размером 2 МБ (nx = ny = 1024 и nz = 128)
Я тестирую в псевдораспределенном режиме.