Как правильно (или хотя бы как-то) использовать org.apache.hadoop.fs.MultipartUploader? ⇐ JAVA

Программисты JAVA общаются здесь
Anonymous
Как правильно (или хотя бы как-то) использовать org.apache.hadoop.fs.MultipartUploader?

Сообщение Anonymous »

В моей среде есть Hadoop, и я использую его как S3.

Моя текущая задача — реализовать логику загрузки большого файла (скажем, >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");
Затем первый шаг интерфейса MultipartUploader:

Код: Выделить всё

  /**
* 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

Вернуться в «JAVA»