Запись в HDFS: файл перезаписывается

Я пишу в файловую систему hadoop. Но каждый раз, когда я что-то добавляю, он перезаписывает данные, а не добавляет их в существующие данные/файл. Код, который это делает, приведен ниже. Этот код вызывается снова и снова для разных данных. Является ли открытие нового SequenceFile.Writer каждый раз проблемой?

Каждый раз, когда я получаю путь как новый Path("someDir");

  public void writeToHDFS(Path path, long uniqueId, String data){
      FileSystem fs = path.getFileSystem(conf);
      SequenceFile.Writer inputWriter = new SequenceFile.Writer(fs, conf,
          path, LongWritable.class, MyWritable.class);
      inputWriter.append(new LongWritable(uniqueId++), new MyWritable(data));
      inputWriter.close();
  }

person TheHat    schedule 01.11.2011    source источник
comment
Я не вижу смысла в файле последовательности, когда вы просто помещаете в него запись и сразу закрываете ее. Держите файл открытым и постоянно добавляйте.   -  person Thomas Jungblut    schedule 01.11.2011


Ответы (1)


В настоящее время нет возможности добавить к существующему файлу SequenceFile через API. Когда вы создаете новый объект SequenceFile.Writer, он не будет присоединяться к существующему файлу в этом Path, а вместо этого перезапишет его. См. мой предыдущий вопрос.

Как указывает Томас, если вы сохраните тот же объект SequenceFile.Writer, вы сможете добавлять в файл до тех пор, пока не вызовете close().

person Matt D    schedule 01.11.2011
comment
Что делать, если у меня слишком много путей для произвольной записи? Могу ли я оставить открытым много файлов SequenceFile.Writer? - person TheHat; 01.11.2011
comment
Так как SequenceFile.Writer не имеет метода сброса, все его содержимое будет находиться в памяти, пока вы их не закроете. Таким образом, сохранение большого количества Writer открытым не будет масштабироваться. Может иметь смысл создать задание MapReduce с использованием SequenceFileOutputFormat для создания файлов SequenceFiles, если проблема связана с MapReduce. - person Matt D; 01.11.2011
comment
Можно ли использовать FSDataOutputStream для записи значения ключа? Будет ли запись key.getBytes{space}value.getBytes{newline} похожа на добавление SequenceFile.Writer? - person TheHat; 01.11.2011
comment
Я не уверен, но кажется возможным. Вы можете посмотреть исходный код SequenceFile.java, чтобы увидеть, как он использует FSDataOutputStream. - person Matt D; 01.11.2011
comment
Я сделал это, не закрывая писатель, пока запись не была сделана. Спасибо. - person TheHat; 22.11.2011