У меня есть два процесса. Один из них записывает файлы в HDFS, а другой загружает эти файлы.чтение файла из HDFS только после его полной записи и закрытия
Первый процесс (тот, который записывает файл) используется:
private void writeFileToHdfs(byte[] sourceStream, Path outFilePath) {
FSDataOutputStream out = null;
try {
// create the file
out = getFileSystem().create(outFilePath);
out.write(sourceStream);
} catch (Exception e) {
LOG.error("Error while trying to write a file to hdfs", e);
} finally {
try {
if (null != out)
out.close();
} catch (IOException e) {
LOG.error("Could not close output stream to hdfs", e);
}
}
}
Второй процесс читает эти файлы для дальнейшей обработки. При создании файла он сначала создается, а затем заполняется содержимым. Этот процесс требует времени (несколько миллисекунд, но все же), и в течение этого времени второй процесс может забрать файл, прежде чем он будет полностью написан и закрыт.
Обратите внимание, что HDFS не сохраняет информацию о блокировке в namenode - так что там нет демона, который может проверить, заблокирован ли файл перед его доступом.
Интересно, как лучше всего решить эту проблему.
Вот мои мысли:
- Копирование файлов в новую папку, как только они полностью написаны и закрыты, то второй процесс будет читать эту новую папку.
- Переименование файла в соответствии с каким-либо соглашением об именах, когда оно полностью написано и закрыто, тогда второй процесс будет читать в соответствии с этим соглашением об именах.
У меня такое чувство, что я пытаюсь решить хорошо известную проблему, и я что-то пропустил. Существует ли наилучшая практика для такой проблемы?
Замечание: если вы используете Java 7, вам не нужно все это делать, просто попробуйте с ресурсами –
Почему бы вам не использовать сокеты для связи между вашими процессами? P1 может связываться с P2 и в то же время выгружать файл таким образом, чтобы, если он не подключен одновременно, P2 все равно может забрать позже ... – UmNyobe
@RossDrew Я использую java7, но новичок в нем. Я проверю это, спасибо. – forhas