FileSystem Client API

Slack Docker Pulls GitHub edit source

Alluxio fornece um acesso ao dado através de uma interface de FileSystem. Os arquivos no Alluxio oferecem uma lógica de escrita única: estes tornam-se imutáveis depois que forem escritos por completo e não podem ser lidos enquanto não estiverem completos. Alluxio fornece duas diferentes FileSystem APIs, uma nativa API e outra compatível com a Hadoop API. A nativa oferece melhor performance enquanto que a possui compatibilidade com o Hadoop concede aos usuários uma maior flexibilidade ao Alluxio pois não requer modificação do código existente que utiliza a Hadoop API.

API Nativa

O Alluxio fornece um API estilo Java para acessar e modificar os arquivos dentro do Alluxio. Todos os recursos são especificados através de uma AlluxioURI que representa o caminho para o recurso.

Obtendo um File System Client

Para obter um Alluxio client file system em código Java, execute:

FileSystem fs = FileSystem.Factory.get();

Criando um Arquivo

Todas as operações de metadados assim como a abertura de um arquivo para leitura ou criação de um arquivo para escrita, são operações executadas através do objeto FileSystem. Já que os arquivos no Alluxio são imutáveis depois de escritos, a forma idiomática para criar arquivos é com a utilização de FileSystem#createFile(AlluxioURI), que retorna um objeto stream e este pode ser utilizado para escrever o arquivo. Por exemplo:

FileSystem fs = FileSystem.Factory.get();
AlluxioURI path = new AlluxioURI("/myFile");
// Create a file and get its output stream
FileOutStream out = fs.createFile(path);
// Write data
out.write(...);
// Close and complete file
out.close();

Especificando Opções de Operações

Para todas as operações de FileSystem, campos de opções adicionais podem ser especificados, que permitem usuários mencionar configurações fora do padrão para a operação. Por exemplo:

FileSystem fs = FileSystem.Factory.get();
AlluxioURI path = new AlluxioURI("/myFile");
// Generate options to set a custom blocksize of 128 MB
CreateFileOptions options = CreateFileOptions.defaults().setBlockSize(128 * Constants.MB);
FileOutStream out = fs.createFile(path, options);

Opções de I/O

Os usuários do Aluuxio utilizam dois tipos diferentes de armazenamento: o armazenamento gerenciado pelo Alluxio e o armazenamento inferior (under storage). O armazenamento do Alluxio é a memória, SSD e/ou o HDD alocado para os Alluxio workers. O Under Storage é o recurso de armazenamento gerenciado pelo sistema da camada inferior de armazenamento, como um: S3; Swift ou HDFS. Os usuários podem especificar a interação do armazenamento do Alluxio com o armazenamento inferior através do ReadType e do WriteType. O ReadType especifica o comportamento da leitura do dado quando estiver lendo um novo arquivo, exemplo, quando o dado deve ser guardado no armazenamento do Alluxio. E o WriteType especifica o comportamento de escrita do dado quando um arquivo é escrito, exemplo, se um dado for escrito no armazenamento do Alluxio.

Segue abaixo uma tabela com os comportamentos esperados do ReadType. As leituras irão sempre tomar preferência no armazenamento do Alluxio do que no under storage system.

Read TypeBehavior
CACHE_PROMOTE Data is moved to the highest tier in the worker where the data was read. If the data was not in the Alluxio storage of the local worker, a replica will be added to the local Alluxio worker. If there is no local Alluxio worker, a replica will be added to a remote Alluxio worker if the data was fetched from the under storage system.
CACHE If the data was not in the Alluxio storage of the local worker, a replica will be added to the local Alluxio worker. If there is no local Alluxio worker, a replica will be added to a remote Alluxio worker if the data was fetched from the under storage system.
NO_CACHE Data is read without storing a replica in Alluxio. Note that a replica may already exist in Alluxio.

Segue abaixo uma tabela com os comportamentos esperados do WriteType.

Write TypeBehavior
CACHE_THROUGH Data is written synchronously to a Alluxio worker and the under storage system.
MUST_CACHE Data is written synchronously to a Alluxio worker. No data will be written to the under storage. This is the default write type.
THROUGH Data is written synchronously to the under storage. No data will be written to Alluxio.
ASYNC_THROUGH Data is written synchronously to a Alluxio worker and asynchronously to the under storage system. Experimental.

Política de Localização

O Alluxio fornece uma política de localização para onde os workers devam armazenar os blocos de um arquivo. O usuário pode definir a política em CreateFileOptions para escrita de arquivos e em OpenFileOptions para a leitura de arquivos no Alluxio. O Alluxio suporta uma política customizada e as políticas embutidas incluídas são:

Alluxio provides location policy to choose which workers to store the blocks of a file. User can set the policy in CreateFileOptions for writing files and OpenFileOptions for reading files into Alluxio. Alluxio supports custom location policy, and the built-in polices include:

  • LocalFirstPolicy

    Retorna o primeiro servidor local e se o worker local não possuir capacidade suficiente para armazenar um bloco, será escolhido um worker aleatoriamente a partir da lista ativa de workers. Esta é a política padrão.

  • MostAvailableFirstPolicy

    Retorna o worker com maior quantidade de bytes disponíveis.

  • RoundRobinPolicy

    A escolha pelo worker para o próximo bloco ocorre como round-robin e os workers que não possuem capacidade são omitidos.

  • SpecificHostPolicy

    Retorna um worker com o nome do servidor específico. Esta política não pode ser definida como padrão.

O Alluxio suporta políticas customizadas, você pode também desenvolver a sua própria política apropriada para a sua carga de trabalho. Atente que a política padrão deve ter um construtor vazio e para utilizar a escrita do tipo ASYNC_THROUGH, todos os blocos de um arquivo devem estar no mesmo worker.

Acessando um Arquivo Existente no Alluxio

Todas as operações em arquivos ou diretórios existentes exigem que o usuário especifique o AlluxioURI. Com o AlluxioURI, o usuário pode utilizar qualquer um dos métodos do FileSystem para acessar o recurso.

Lendo os Dados

Um AlluxioURI pode ser utilizado para efetuar operações de FileSystem do Alluxio, como modificar os metadados de um arquivo, exemplos: TTL; fixar o arquivo (pin); ou pegar uma leitura de stream para ler um arquivo.

Por exemplo, para ler um arquivo:

FileSystem fs = FileSystem.Factory.get();
AlluxioURI path = new AlluxioURI("/myFile");
// Open the file for reading
FileInStream in = fs.openFile(path);
// Read data
in.read(...);
// Close file relinquishing the lock
in.close();

Hadoop API

O Alluxio possui um empacotador do client nativo que fornece compatibilidade coma interface FileSystem. Com este client, as operações de arquivo do Hadoop serão traduzidas para as operações de FileSystem. A última documentação da interface FileSystem pode ser encontrada aqui.

A interface compatível do Hadoop é fornecida com uma classe de conveniência, permitindo que os usuários mantenham o código anterior escrito para o Hadoop.