Моя текущая задача — реализовать логику загрузки большого файла (скажем, >1 ГБ) в Hadoop без буферизации, чтобы данные передавались в него потоковым способом.
Я нашел интерфейс org.apache.hadoop.fs.MultipartUploader, описание которого выглядит именно так, как мне нужно. Но в официальной документации нет какого-либо руководства по его использованию, только текстовое описание и порядок операций по загрузке (start, putPart, Complete).
Javadoc имеет аналогичное описание.
Я пытался использовать этот интерфейс следующим образом:
согласно документации, я создал экземпляр MultipartUploader (FileSystemMultipartUploader — это реализация, которая мне нужна):
Код: Выделить всё
FileSystemMultipartUploader mu =
(FileSystemMultipartUploader) fs.createMultipartUploader(new Path("base/path/for/uploading/to/hdfs"));
Path targetPath = new Path("base/path/plus/result/filename");
Код: Выделить всё
/**
* Initialize a multipart upload.
* @param filePath Target path for upload.
* @return unique identifier associating part uploads.
* @throws IOException IO failure
*/
CompletableFuture startUpload(Path filePath)
throws IOException;
Код: Выделить всё
UploadHandle uh = mu.startUpload(targetPath).get();Код: Выделить всё
/**
* Put part as part of a multipart upload.
* It is possible to have parts uploaded in any order (or in parallel).
* @param uploadId Identifier from {@link #startUpload(Path)}.
* @param partNumber Index of the part relative to others.
* @param filePath Target path for upload (as {@link #startUpload(Path)}).
* @param inputStream Data for this part. Implementations MUST close this
* stream after reading in the data.
* @param lengthInBytes Target length to read from the stream.
* @return unique PartHandle identifier for the uploaded part.
* @throws IOException IO failure
*/
CompletableFuture
putPart(
UploadHandle uploadId,
int partNumber,
Path filePath,
InputStream inputStream,
long lengthInBytes)
throws IOException;
ок, у нас есть uploadId из первого шага и result filePath, но у нас есть понятия не имею, что это за partNumber, inputStream и lengthInBytes!
Я думаю, предполагается, что partNumber — это упорядоченный номер фрагмента загружаемого файла, а inputStream с lengthInBytes — это входной поток и длина в байтах чанка соответственно.
Но я не понимаю, откуда брать эти три параметра. Я думал, этот MultipartUploader сам "нарежет" файл, под капотом.
В официальной документации Hadoop нет информации об этом, и мне также не удалось найти ни одного примера использования MultipartUploader ни в stackoverflow, ни где-либо еще.
Пожалуйста, может ли кто-нибудь объяснить, как использовать или поделиться каким-нибудь примером, если он у вас есть?
Подробнее здесь: https://stackoverflow.com/questions/791 ... rtuploader