Análise completa do código-fonte do Alluxio | Sistema de orquestração de dados de código aberto que você não conhece (Parte 2)

Reveja

Em "Alluxio - Source Code Analysis - Part 1", descreve principalmente a construção do ambiente local do Alluxio, a estrutura do projeto de código fonte, o processo de inicialização do processo de serviço e a chamada RPC entre serviços.

Este artigo continuará a descrever as principais classes do Alluxio com base no artigo anterior, o processo de leitura e gravação subjacente do Block in Alluxio, o processo de chamada do Alluxio Client e a estrutura de agendamento leve construída no Alluxio.

Descrição da classe chave da Parte 1

1.1**** Registrado

A interface Journaled define um método comum que pode ser mantido persistentemente por Journaled e obtém as informações de passagem dos elementos Journal por meio de JournalEntryIterable#getJournalEntryIterator . Essa interface fornece o método de ponto de verificação padrão. A interface Journaled herda Checkpointed e JournalEntryIterable, e os métodos definidos incluem:
getJournalEntryIterator: Obter todos os elementos de Journal;

getCheckpointName: obtém o nome da classe de checkpoint;

writeToCheckpoint: grava persistentemente o ponto de verificação de todos os estados;

restoreFromCheckpoint: recuperação de ponto de verificação;

processJournalEntry : Processa o elemento Journal especificado, o método principal de processamento do Journal ;

resetState: redefine o estado do Diário;

applyAndJournal: Executa e aplica operações do Diário aos elementos do Diário.
insira a descrição da imagem aqui
1.2****UnderFileSystem

Alluxio gerencia e adapta dados para realizar operações nos sistemas de armazenamento subjacentes.O armazenamento subjacente que implementa a interface UnderFileSystem pode ser usado como UFS legal do Alluxio.

1.2.1. Diagrama de Classes

O diagrama de classes de UnderFileSystem é mostrado abaixo, que é implementado principalmente pela classe abstrata BaseUnderFileSystem e BaseUnderFileSystem é dividido principalmente em duas categorias:

ConsistentUnderFileSystem : Implementação consistente de UFS, incluindo: LocalUnderFileSystem, HdfsUnderFileSystem, CephFSunderFileSystem, etc.;

ObjectUnderFileSystem : Implementação UFS de armazenamento de objetos, incluindo principalmente: S3AUnderFileSystem, COSunderFileSystem, OSUnderFileSystem, etc.
insira a descrição da imagem aqui
1.2.2. Métodos de interface

Existem dois tipos de APIs de interface no UnderFileSystem:
operações comuns do sistema de armazenamento, como: criar/excluir arquivos, renomear arquivos;

Lidar com a consistência eventual de persistência de dados, como: Resolver o problema de que quando AlluxioMaster mantém metadados com sucesso, a operação UFS falha.

1.2.2.1. Operação do sistema de armazenamento
criar: especifique o caminho do caminho, crie um arquivo de dados em UFS (o diretório pai não existe, ele será criado automaticamente), você pode definir o grupo de usuários e a política de ACL para criar o arquivo através de CreateOptions ;

deleteDirectory: Para excluir o diretório especificado, a estratégia de exclusão e o método de travessia podem ser definidos por meio de DeleteOptions;

deleteFile: exclua o arquivo especificado;

getDirectoryStatus: Para obter o status do diretório UFS especificado, você precisa passar o arquivo de diretório existente;

getFileStatus: obtém o status do arquivo especificado pelo UFS;

getStatus: Obtém o status UFS, você pode especificar um diretório ou arquivo;

isDirectory: Determine se o caminho especificado é um diretório no UFS;

open: abre o arquivo especificado no UFS e define os parâmetros de abertura do arquivo através de OpenOptions;

renameDirectory: renomeie o diretório especificado no UFS;

renameFile: Renomeie o arquivo especificado no UFS;

existe: Determine se o arquivo ou diretório especificado existe;

getAclPair: Obtenha a política de ACL do UFS;

getBlockSizeByte: obtém o tamanho de cada arquivo Block do UFS no diretório especificado, em bytes;

getFileLocations: obtém a lista de locais de armazenamento associados ao UFS para o caminho especificado;

getFingerprint: Calcula e obtém o ID do arquivo (fingerprint) do caminho especificado.O cálculo do ID do arquivo (fingerprint) deve ser determinístico e imutável;

getOperationMode: obtém o modo de operação do UFS subjacente. O armazenamento subjacente do Alluxio pode ser composto por vários tipos de UFS. Este método é usado para determinar o modo de operação do UFS subjacente. Por exemplo, o UFS subjacente é: hdfs:/ /ns1/, hdfs://ns2 /, o resultado é retornado: {hdfs://ns1/:NO_ACCESS,hdfs://ns2/:READ_WRITE};

getPhysicalStores: Obtenha todos os tipos de UFS, incluindo estruturas de dados e permissões correspondentes

getSpace: Obtenha as informações de espaço de armazenamento do caminho especificado no UFS especificando SpaceType, SpaceType inclui: SPACE_TOTAL, SPACE_FREE, SPACE_USED;

getUnderFSType: obtém o tipo UFS, como hdfs;

isFile: determina se o arquivo existe no UFS;

isObjectStorage: Determine se o UFS é um armazenamento de objetos;

isSeekable: Determine se o UFS suporta pesquisa;

listStatus: especifica a lista de status do arquivo sob o caminho UFS. A lista não garante a ordem. Você pode definir se deve suportar travessia por meio de ListOptions;

mkdirs: cria um diretório especificado no UFS. Você pode definir regras de criação de diretórios por meio de MkdirsOptions, como ACL e criação de diretório pai recursivo;

setAclEntries: Especifique o caminho e defina o conjunto de políticas ALC do UFS;

setMode: especifique o caminho, defina o modo UFS ALC, como 0777;

setOwner: Especifique o caminho e defina o usuário e grupo do UFS ALC;

supportFlush: Determina se o UFS suporta o arquivo Flush;

supportActiveSync: Determina se o UFS oferece suporte ao ActiveSync (acesso ao compartilhamento interno de arquivos) As interfaces relacionadas ao ActiveSync incluem: getActiveSyncInfo, startSync, stopSync, startActiveSyncPolling, stopActiveSyncPolling.

1.2.2.2 A operação de consistência eventual
createNonexistingFile: cria um arquivo que não existe e sai se o arquivo existir;

deleteExistingDirectory: exclua o diretório especificado;

deleteExistingFile: exclui o arquivo especificado;

getExistingDirectoryStatus: obtém o status do diretório especificado pelo UFS;

getExistingFileStatus: obtém o status do arquivo especificado pelo UFS;

getExistingStatus: Obtenha o status UFS, você pode especificar um diretório ou arquivo;

isExistingDirectory: Determine se o caminho especificado é um diretório no UFS;

openExistingFile: Para abrir o arquivo especificado no UFS, você pode definir os parâmetros de abertura do arquivo através de OpenOptions;

renameRenamableDirectory: renomeie o diretório especificado no UFS;

renameRenamableFile: renomeie o arquivo especificado no UFS.

1.2.2.3
Limpeza de outras operações: quando o arquivo de dados é criado sem um final bem-sucedido normal ou é descartado, o UFS subjacente é limpo;

connectFromMaster: Especifique o endereço do host do AlluxioMaster para estabelecer uma conexão entre o Master especificado e o UFS;

connectFromWorker: Especifique o endereço do host do AlluxioWorker para estabelecer uma conexão entre o Worker especificado e o UFS;

resolveUri: Dado o URI e o caminho base do Alluxio, retorne o caminho do Alluxio montado.

1.3 UfsManager

A definição geral de classe de interface unificada para a operação de gerenciamento do UFS subjacente (Under FileSystem) no Alluxio. Os métodos de interface definidos incluem:
addMount: UFS é montado no Alluxio, este método é apenas para processamento do Alluxio, não para a operação UFS subjacente;

removeMount: remove a montagem UFS no Alluxio;

get: Obtém as informações UFS montadas de acordo com mountId;

getRoot: Obtém as informações do diretório raiz montadas no Alluxio;

getJournal: Obtém o endereço do Local do Diário;

A classe abstrata AbstractUfsManager basicamente implementa a interface de gerenciamento UFS.
insira a descrição da imagem aqui
1.3.1 O UfsClient
mantém as informações de conexão do cliente do UFS subjacente e outras informações de descrição do UFS relacionadas e implementa as operações do Alluxio no UnderFileSystem com base no UfsClient. insira a descrição da imagem aqui
1.4 BlockClient

A classe abstrata BlockClient define as operações básicas de leitura e escrita do chamador para o Block .O diagrama de classes é o seguinte, incluindo principalmente: BlockWriter, BlockReader .
insira a descrição da imagem aqui
A classe de método para ler e gravar definições de bloco: insira a descrição da imagem aqui
1.5 DefaultFileSystemMaster

O serviço Master mantém as operações de gerenciamento de todas as alterações de metadados do FileSystem (sistema de arquivos). Tais como: InodeLockManager, MasterUfsManager, MountTable, etc.;
Nota : DefaultFil1.5.Os detalhes do método de início de DefaultFileSystemMastereSystemMaster estão descritos acima.

1.5.1. Métodos de Interface

A interface FileSystemMaster define o método de operação para FS no mestre.DefaultFileSystemMaster herda FileSystemMaster e seus métodos de interface incluem principalmente:
cleanupUfs: limpa periodicamente o UFS subjacente;

getFileId: obtém o ID do arquivo com base no URI do caminho do Alluxio. Se o arquivo não estiver armazenado em cache no Alluxio, chame UFS para obtê-lo;

getFileInfo: Obtenha detalhes do arquivo com base no ID do arquivo. Esta interface é aberta apenas para serviços internos, não diretamente para usuários;

getPersistenceState: obtém o estado persistente do arquivo de acordo com o ID do arquivo;

listStatus: Especifique o caminho do Alluxio para obter a lista de status do arquivo;

checkAccess: Verifica as permissões do caminho do Alluxio especificado;

checkConsistency: Verifica a consistência dos dados do arquivo do caminho do Alluxio especificado;

completeFile: fecha/termina o caminho especificado do Alluxio, após o fechamento, o arquivo não é gravável;

createFile: Cria um arquivo FileInfo baseado no caminho do arquivo Alluxio especificado;

getNewBlockIdForFile: Especifique o caminho do arquivo Alluxio para obter o ID do bloco do próximo arquivo de bloco a ser operado;

getMountPointInfoSummary: Obtenha as informações do instantâneo do caminho de montagem no Alluxio;

getDisplayMountPointInfo: Obtenha as informações de montagem exibidas pelos usuários do Alluxio;

delete: exclua a meta-informação do arquivo do caminho do Alluxio especificado;

getFileBlockInfoList: obtém todas as informações da lista de bloqueios no caminho do Alluxio especificado;

getInAlluxioFiles: Obtém todos os caminhos da lista de arquivos no Alluxio;

getInMemoryFiles: Obtém o caminho de todos os arquivos armazenados em cache na memória do Alluxio;

createDirectory: Cria o diretório correspondente ao Alluxio e retorna o ID do diretório;

renomear: Mudanças de metadados para operações de renomeação de arquivos no Alluxio;

free: No diretório Alluxio designado, libere todas as informações do arquivo de bloco armazenadas em cache pelo alluxio e suporte a liberação de arquivos atravessados ​​no diretório;

getPath: obtém o caminho do URI do Alluxio de acordo com o FileId especificado;

getPinIdList: obtém a lista de ids de inode fixa;

getUfsAddress: obtém o endereço UFS exigido pelo mestre;

getUfsInfo: Obtenha as informações UFS correspondentes de acordo com o ID de montagem;

getLostFiles: obtém a lista de arquivos perdidos pelo nó do trabalhador;

mount: A operação principal é montar o caminho UFS no caminho especificado pelo Alluxio;

unmount: Desmonte o UFS no caminho do Alluxio especificado;

updateMount: atualiza as informações de montagem do caminho do Alluxio especificado;

setAcl: Defina a ACL do caminho do Alluxio;

updateUfsMode: defina o modo UFS subjacente;

validateInodeBlocks: Verifique se as informações do bloco de inode estão completas;

workerHeartbeat: Especifique o ID do trabalhador e notifique o trabalhador correspondente para armazenar e persistir os arquivos;

getWorkerInfoList: Obtenha uma lista de todas as informações do nó do trabalhador;

getTimeSeries: Obtenha as informações de versão de tempo do armazenamento de metadados no mestre alluxio;

1.6 DefaultBlockWorker
1.6.1. Interface

O Worker Server implementa a classe de interface para operações de gerenciamento de bloco: BlockWorker, e seus métodos de interface incluem principalmente:
getWorkerId: Obter o ID do trabalhador;

abortBlock: descarta o arquivo de bloco criado temporariamente na sessão;

accessBlock: acessa as informações do bloco na sessão e id do bloco especificados, este método pode ser acessado quando o cache do bloco for liberado;

commitBlock: Envia o bloco para o espaço de gerenciamento do Alluxio. O bloco a ser submetido deve ser temporário. Antes do bloco ser submetido com sucesso, o bloco não suporta acesso de leitura e escrita;

commitBlockInUfs: Submete o bloco ao UFS para persistência;

createBlock: Cria um bloco no espaço de gerenciamento do Alluxio, o bloco pode ser escrito com base na classe BlockWriter, que é temporária até que o bloco seja submetido;

getTempBlockMeta: Obtenha metadados de bloco temporários;

createBlockWriter: Cria BlockWriter com base na sessão e id de bloco para operações de gravação de bloco;

getReport: Obtém o relatório da pulsação periódica entre o trabalhador e o mestre;

getStoreMeta: Obtenha as informações de metadados de todo o armazenamento do bloco, incluindo o mapeamento de cada diretório de armazenamento no bloco e a capacidade de cada camada de armazenamento;

getStoreMetaFull: Semelhante a getStoreMeta, mas inclui a lista de blockIds completa, que é mais cara de se obter;

getVolatileBlockMeta: obtém informações de metadados de bloco de acordo com o blockId especificado;

lockBlock: bloqueia o bloco;

moveBlock: move o bloco do local de armazenamento atual para o local de destino; atualmente, apenas movimentos de armazenamento hierárquicos são suportados;

moveBlockToMedium: o bloco move e especifica o tipo de meio de armazenamento correspondente (MediumType);

createBlockReader: Cria BlockReader para operação de leitura de bloco, que pode ler Alluxio Block e UFS Block;

createUfsBlockReader: Crie um BlockReader para operações de leitura de bloco UFS;

removeBlock: remove Block do espaço de gerenciamento do Allxuio;

requestSpace: Obtenha espaço de armazenamento para o bloco especificado, que deve ser um bloco temporário;

unlockBlock: remove a operação de bloqueio no bloco;

asyncCache: Envie solicitações de cache assíncronas para gerenciamento de cache assíncrono;

updatePinList: atualiza a lista de pinos ocupada pelo armazenamento de bloco subjacente;

getFileInfo: obtém informações do arquivo com base no ID do arquivo especificado.

1.6.2. TieredBlockStore

BlockStore define a interface de armazenamento de blocos para gerenciar o armazenamento de blocos local. O objetivo principal da interface é implementar as classes de método definidas em BlockWorker . A interface é a seguinte: insira a descrição da imagem aqui
TieredBlockStore é a classe de implementação de BlockStore, que implementa o ponto de função principal em Alluxio: armazenamento em camadas, permite que os objetos de armazenamento correspondentes executem o gerenciamento de armazenamento hierárquico com base no formato de bloco e expõe APIs para gerenciamento de bloco. O algoritmo de alocação integrado no TieredBlockStore determina o acesso de novos blocos e a liberação de blocos antigos e mantém informações de metadados, como status de armazenamento hierárquico e gerenciamento de bloqueio de leitura/gravação de bloco com base no BlockMetadataManager.

TieredBlockStore é thread-safe e todas as operações em nível de bloco precisam chamar BlockLockManager para obter o bloqueio de leitura/gravação correspondente, garantindo que as operações de metadados e operações de E/S no bloco sejam thread-safe. Qualquer operação de metadados de bloco requer um bloqueio de leitura e gravação ReentrantReadWriteLock baseado em BlockMetadataManager para obter metadados.

A interface Allocator define a estratégia de alocação para gerenciamento de dados no Alluxio. O método da interface é: alocaBlockWithView. Atualmente, existem três classes de implementação:

RoundRobinAllocator: com base na alocação de treinamento round-robin, a alocação começa na camada mais alta por padrão. Quando o espaço de armazenamento da camada mais alta é insuficiente, ela irá para a próxima camada. Essa estratégia de alocação não suporta camadas de armazenamento específicas.

MaxFreeAllocator: O espaço máximo restante alocado para o armazenamento. Quando nenhuma camada de armazenamento específica é especificada, a alocação começa a partir da camada mais alta por padrão;

GreedyAllocator: Retorna a primeira camada de espaço de armazenamento que satisfaz o tamanho do bloco de armazenamento, que é uma classe de exemplo de alocação de armazenamento;

O BlockStoreLocation define o endereço de localização e as informações hierárquicas do bloco de armazenamento e descreve três dimensões de armazenamento: o alias da camada de armazenamento, o endereço do diretório da camada de armazenamento correspondente e as informações de mídia da camada de armazenamento.

1.6.2.1. createBlock
cria um bloco temporário baseado no algoritmo de alocação de blocos quando há espaço livre (espaço); especial: a criação de um bloco não acionará a destruição e liberação de outros blocos, obtenha informações de metadados de bloco somente leitura através de BlockMetadataAllocatorView , e agende para Allocator Forneça a fonte de dados, Allocator retorna o objeto StorageDirView e cria TempBlockMeta e o gerencia através do BlockMetadataManager após alocação e agendamento . Os metadados após a alocação de armazenamento persistirão no arquivo de metadados Block com base no método createBlockFile. insira a descrição da imagem aqui
A interface Allocator define a estratégia de alocação para gerenciamento de dados no Alluxio. O método da interface é: alocaBlockWithView. Atualmente, existem três classes de implementação:

RoundRobinAllocator: Com base na alocação round-robin round-robin, a alocação começa na camada mais alta por padrão. Quando o espaço de armazenamento da camada mais alta é insuficiente, ele irá para a próxima camada. Esta estratégia de alocação não suporta o armazenamento específico camada especificada.

MaxFreeAllocator: O espaço máximo restante alocado para o armazenamento. Quando nenhuma camada de armazenamento específica é especificada, a alocação começa a partir da camada mais alta por padrão;

GreedyAllocator: Retorna a primeira camada de espaço de armazenamento que satisfaz o tamanho do bloco de armazenamento, que é uma classe de exemplo de alocação de armazenamento;

O BlockStoreLocation define o endereço de localização e as informações hierárquicas do bloco de armazenamento e descreve três dimensões de armazenamento: o alias da camada de armazenamento, o endereço do diretório da camada de armazenamento correspondente e as informações de mídia da camada de armazenamento.

1.6.2.2 O
método de sincronização freeSpace executa o espaço de armazenamento do cache do bloco para excluir e liberar imediatamente, e a criação de um novo bloco só pode ser suportada após a conclusão da operação de liberação de espaço de todas as camadas de armazenamento. Obtenha as informações do bloco removível no armazenamento de blocos de acordo com BlockMetadataEvictorView. Determine se o armazenamento em cache atual satisfaz o espaço mínimo contínuo e o espaço mínimo disponível. Se ambos forem satisfeitos, a operação de limpeza de espaço subsequente não será executada; caso contrário, percorra as informações do bloco para determinar se ele pode ser limpo e se pode ser limpo, exclua o bloco correspondente Para arquivos e metadados, as operações de liberação de bloco são sincronizadas por meio do ouvinte de eventos BlockStoreEventListener. insira a descrição da imagem aqui
BlockStoreEventListener escuta o evento trigger do fim bem sucedido da mudança de metadados no BlockStore, incluindo principalmente classes de métodos de interface:
onAccessBlock: trigger de evento Access Block;

onAbortBlock: Acionado pela limpeza e liberação de eventos temporários do Block;

onCommitBlock: O evento BlockStoreLocation é acionado quando um bloco temporário é submetido e associado às informações de armazenamento do bloco;

onMoveBlockByClient: Acionado pelo evento BlockStoreLocation do Bloco de movimentação do Cliente;

onMoveBlockByWorker: Acionado pelo evento BlockStoreLocation baseado na movimentação do Worker Block;

onRemoveBlockByClient: acionado pelo evento BlockStoreLocation que remove e libera o Bloco baseado no Cliente;

onRemoveBlock: Remove e libera o evento Block acionado;

onBlockLost: Evento de perda de bloco acionado;

onStorageLost: Acionado pelo evento de perda do diretório de armazenamento. insira a descrição da imagem aqui
1.7 Definição do Plano

A definição do plano de execução do trabalho do sistema de ângulo leve integrado no Alluxio tem duas partes principais, 1. PlanDefinition# selectExecutors : Este método é chamado no nó Master para selecionar o AlluxioJobWorker que executa a tarefa, 2. PlanDefinition# runTask : em o JobWorker Execute o agendamento de trabalho especificado. As principais implementações de definição de tarefa incluídas no PlanDefinition são:

MoveDefinition: aciona a operação de movimentação de bloco
no nível de verificação FileSystemMaster;ReplicateDefinition: aciona a operação de cópia de bloco no nível de verificação FileSystemMaster;

EvictDefinition: Aciona a operação de liberação do bloco no nível de verificação do FileSystemMaster;

PersistDefinition: Persiste o armazenamento em cache do Alluxio Block para o UFS subjacente;

CompactDefinition: Compacta os arquivos de dados das tabelas estruturadas no diretório especificado;

MigrateDefinition: Movimento de bloco, blocos de origem e destino podem ser montados em diferentes nós UFS;

LoadDefinition: Implemente a operação Load de um arquivo Block simples. insira a descrição da imagem aqui
1.7.1. Gerenciador Executor de Tarefas

Gerencie o executor de tarefas JobWorker. A tarefa de execução real chama TaskExecutor#run através do pool de threads , e a camada inferior de TaskExecutor#run é realizada por meio de PlanDefinition#runTask ; ao mesmo tempo, o TaskExecutorManager também gerencia a capacidade de execução da tarefa e o gerenciamento do ciclo de vida da tarefa, como: obter o pool de threads de execução, executar o limite atual/liberar o limite atual nas tarefas e iniciar e parar as tarefas.insira a descrição da imagem aqui

Parte 2 Bloqueie as operações de leitura e gravação

2.1 Operação de leitura

O processo geral da operação de leitura do cliente fornecido pelo serviço BlockWorker RPC é o seguinte:
O método BlockWorkerClientServiceHandler.readBlock define a leitura do bloco e o parâmetro de solicitação StreamObserverresponseObserver é criado por padrão para criar um CallStreamObserver; se a cópia zero for suportada, use DataMessageServerStreamObserver

Crie BlockReadHandler com base em CallStreamObserver e chame BlockReadHandler#onReady para iniciar a leitura de dados e crie a execução de thread DataReader com base no envio do pool de threads;

DataReader é uma classe de thread usada pelo Alluxio para leitura de dados de E/S. Ela encapsula a lógica principal da operação de leitura do Alluxio.(1) Obtenha o fluxo de entrada de dados do Alluxio DataBuffer, (2) Chame CallStreamObserver.onNext para acionar e monitorar a leitura do fluxo de dados;

A obtenção do DataBuffer pelo DataReader é a lógica central de todo o processo de leitura, determinando a fonte de leitura dos dados: Local, UFS e se deve realizar movimento de bloco para obter leitura em curto-circuito;

  • Crie e abra Block, se a solicitação precisar ser acelerada (promote=true), então opere BlockWorker.moveBlock para mover o Block para um nível mais alto de armazenamento;

  • Chame DefaultBlockWorker#createBlockReader para criar um BlockReader, determine se o Worker local pode acessá-lo diretamente e retorne LocalFileBlockReader se ele suportar; se estiver em UFS, chame UnderFileSystemBlockReader;

  • Chame BlockReader.transferTo para ler os dados e encapsule a E/S como NettyDataBuffer para retornar.
    insira a descrição da imagem aqui
    2.1.1 UnderFileSystemBlockReader A
    classe UnderFileSystemBlockReader implementa a leitura direta do UFS e armazena em cache as informações lidas no bloco Worker lido. O processo geral é o seguinte:

UfsInputStreamCache.acquire obtém o fluxo de entrada InputStream de acordo com ufs, path e blockId. Se o InputStream é obtido diretamente no cache, caso não exista, obtém o fluxo de entrada do arquivo InputStream do UFS subjacente de acordo com ufs.openExistingFile;

Obtenha e atualize o BlockWriter, determine se existe um Block correspondente, se não houver, chame BlockStore.createBlock para criar um novo Block temporário e retorne o BlockWriter correspondente;

Leia o arquivo de acordo com o fluxo de entrada InputStream obtido na primeira etapa e o parâmetro offset, e os dados lidos: (1) Gravar o Worker correspondente no cache do Block através do BlockWriter; (2) Retornar ao chamador para ler o em formação. insira a descrição da imagem aqui
Observações:
LocalFileBlockReader: leia as informações do arquivo de texto com base nas operações de E/S do método FileChannel.map

RemoteBlockReader: baseado na leitura do trabalhador remoto (trabalhador não local), atualmente não suportado;

DelegatingBlockReader julga e seleciona a classe de implementação BlockReader para usar de acordo com diferentes cenários de uso.

2.1.2. ShortCircuitBlockReadHandler

A classe ShortCircuitBlockReadHandler é uma implementação de serviço RPC que fornece recursos de leitura de curto-circuito. Primeiro, o StreamObserver do Grpc (modo observador), uma chamada onNext descreve uma mensagem lida e o processo geral de execução:

Obtenha se a leitura acelerada deve ser realizada de acordo com OpenLocalBlockRequest. Se acelerado (promote=true), chame BlockWorker.moveBlock para mover o armazenamento para camadas de armazenamento superiores;

Chame BlockWorker.lockBlock para obter o bloqueio da operação de leitura e gravação do bloco e, finalmente, BlockWorker.accessBlock para obter o bloco de acesso

2.2 Operação
de gravação A operação de gravação do cliente fornecida pelo serviço BlockWorker RPC, o processo geral é o seguinte:
O método BlockWorkerClientServiceHandler.writeBlock define a gravação do bloco, e o parâmetro de solicitação StreamObserverresponseObserver é criado por padrão para criar CallStreamObserver; se a cópia zero for suportada, BlockWorkerClientServiceHandler é usado;

Crie um DelegationWriteHandler baseado em CallStreamObserver e chame DelegationWriteHandler#onCancel para fechar a operação de gravação de dados; chame o método onNext para monitorar a operação de gravação de fluxo de dados;

DelegationWriteHandler obtém a classe de implementação AbstractWriteHandler correspondente de acordo com o tipo de comando de solicitação:

  • ALLUXIO_BLOCK: BlockWriteHandler, os dados são gravados apenas no Alluxio Block, e as operações de gravação são implementadas com base no BlockWriter;

  • UFS_FILE: UfsFileWriteHandler, os dados são gravados apenas no UFS, os arquivos de diretório são criados com base no UFS Client e as operações de E/S são executadas;

  • UFS_FALLBACK_BLOCK: UfsFallbackBlockWriteHandler, primeiro escreva Alluxio Block baseado em BlockWriteHandler e depois escreva UFS; A insira a descrição da imagem aqui
    relação de classe abstrata AbstractWriteHandler é a seguinte: insira a descrição da imagem aqui
    2.2.1 LocalFileBlockWriter

Chame FileChannel.map com base nas informações do arquivo de bloco gravadas pelo Worker local

2.2.2. ShortCircuitBlockWriteHandler

ShortCircuitBlockWriterHandler implementa a capacidade de criar um bloco local para leitura de curto-circuito. Com base na chamada onNext, o processo geral de execução é o seguinte:

Se você solicitar apenas recursos de espaço, obtenha os recursos de espaço solicitados criados pelo Block com base em BlockWorker.requestSpace;

Para criar um bloco temporário, chame BlockWorker.createBlock para criar um bloco e retornar o caminho do bloco correspondente.

Parte 3 Gerenciamento de catálogo

O AlluxioCatalog gerencia os objetos do catálogo no Alluxio, encapsula e mantém as informações do banco de dados registradas no Alluxio e informações de metadados como Tabela em cada banco de dados. Os métodos básicos são os seguintes, incluindo: obtenção de informações do banco de dados, sincronização de metadados do banco de dados, operações de vinculação do banco de dados, configuração/desvinculação. insira a descrição da imagem aqui
attachDatabase: mantém as informações de metadados db vinculadas na memória e persiste-as de forma síncrona no Journal;

syncDatabase: As informações mais recentes do banco de dados de metadados serão obtidas com base no udb subjacente. Por exemplo, o Hive chamará o método de interface do cliente HMS IMetaStoreClient#getDatabase para obter informações do banco de dados.

Parte 4 Operação do Cliente

4.1 Cliente

A interface Client define abstratamente a operação do Client no Alluxio, suas classes de herança e implementação são as seguintes, encapsulando a interface RPC para conexão com cada componente:

FileSystemMasterClient: encapsula chamadas RPC relacionadas a FileSystemMasterClientServiceHandler para operações de gerenciamento de metadados

BlockMasterClient: Encapsula chamadas RPC relacionadas ao BlockMasterClientServiceHandler para realizar operações de gerenciamento de bloco

TableMasterClient: encapsula chamadas RPC relacionadas a TableMasterClientServiceHandler para operações de gerenciamento do Alluxio Table Catalog

MetaMasterClient: Encapsula chamadas RPC relacionadas ao MetaMasterClientServiceHandler

MetaMasterConfigClient: encapsula chamadas RPC relacionadas ao MetaMasterConfigurationServiceHandler

JobMasterClient: Encapsula as chamadas RPC relacionadas de JobMasterClientServiceHandler para chamar Alluxio Job
insira a descrição da imagem aqui
;

A classe de interface de operação do sistema de arquivos definida em Client é usada para gerenciamento de metadados e gerenciamento de dados.Os usuários podem estender o comportamento de operação do arquivo Client de acordo com sua classe de implementação BaseFileSystem. insira a descrição da imagem aqui
Os métodos de interface definidos no FileSystem incluem principalmente as seguintes categorias:
checkAccess: Verifique as permissões de caminho especificadas;

createDirectory: Cria um diretório de arquivos baseado em AlluxioURI;

createFile: Cria um arquivo de dados baseado em AlluxioURI;

delete: exclua o arquivo/diretório especificado com base no AlluxioURI;

existe: Determina se o arquivo/diretório especificado existe com base no AlluxioURI;

free: Libera espaço no Alluxio baseado no AlluxioURI, mas não exclui arquivos de dados UFS;

listStatus: Lista as informações do arquivo/diretório AlluxioURI;

mount/updateMount/unmount: monta/atualiza/desmonta o diretório AlluxioURI especificado;

openFile: abre e lê o fluxo de entrada do arquivo AlluxioURI;

persist: persiste de forma assíncrona os dados armazenados em cache no Alluxio para o UFS subjacente;

renomear: renomear arquivo Alluxio.

4.1.2. FileSystemContext

Mantém as informações de contexto das operações do sistema de arquivos do Alluxio com base no Cliente. Normalmente, um processo Client JVM usará o mesmo FileSystem para se conectar ao Alluxio, então os objetos Cliente serão compartilhados entre diferentes threads. O FileSystemContext é criado apenas quando o usuário precisa de configuração e autenticação personalizadas. O cliente thread-shared manterá um espaço de thread independente para o FileSystemContext. O thread FileSystemContext não é compartilhado (thread security), o que aumentará o uso de recursos da conexão do cliente Portanto, quando o usuário interromper a operação do Alluxio Após isso, é necessário fechar o FileSystemContext para liberar recursos.

4.1.3. FileInStream/FileOutStream

Os fluxos de entrada/saída baseados nas operações do arquivo Alluxio são definidos no cliente da seguinte forma:

Fluxo de saída: AlluxioFileOutStream, gravação de fluxo de saída Alluxio, operação subjacente BlockOutStream

Fluxo de entrada: AlluxioFileInStream: Alluxio input stream lendo, encapsulando a leitura de dados do nó local/remoto, ou diretamente baseado no UFS subjacente; operações subjacentes BlockInStream, LocalCacheFileInStream, AlluxioHdfsInputStream
insira a descrição da imagem aqui
4.2
As funções do AbstractShell Client podem fornecer operações externas através do Shell, AbstractShell abstract class Define As operações de comando do shell no Alluxio e suas subclasses herdadas incluem:
FileSystemShell: classe de entrada de operação de arquivo do Shell do Alluxio;

FileSystemAdminShell: operações de gerenciamento do sistema de arquivos Alluxio;

CollectInfo: comando para coletar informações de todos os nós Woker no Alluxio;

TableShell: operações de gerenciamento de tabelas Alluxio;

JobShell: Alluxio executa operações de gerenciamento de tarefas. insira a descrição da imagem aqui
4.2.1. Comando Cat

Tomando o CatCommand como exemplo, o processo geral de leitura de arquivos pelo Alluxio Client é brevemente descrito a seguir:

FileSystemShell recebe comandos shell, executa "cat" para abrir arquivos, chama o comando CatCommand.run, comandos shell suportam diretórios regulares e multidiretórios e executam a operação runPlainPath implementada de forma personalizada para cada diretório especificado;

O método CatCommand#runPlainPath julga o tipo de arquivo através de getStatus. Se for um diretório, ele sai. Se for um arquivo, ele abre o arquivo baseado no FileSystem para obter o objeto de fluxo de entrada do cliente FileInStream(AlluxioFileInStream);

Leia o conteúdo do arquivo com base no AlluxioFileInStream#read, o URIStatus mantém as informações do instantâneo do diretório e dos metadados do arquivo no Alluxio, obtém as informações do bloco correspondentes a um arquivo do Alluxio especificado com base no URIStatus e obtém o BlockInStream (stream de entrada do bloco) através das informações do bloco mantidas no cliente AlluxioBlockStore ;

A operação de leitura de fluxo de entrada é chamada com base em BlockInStream, e a interface de leitura de dados baseada em bloco subjacente DataReader é implementada e a operação de leitura de bloco com base nos detalhes do bloco de leitura de DataReader da seguinte forma. insira a descrição da imagem aqui
4.2.2. Comando de toque

Tomando o TouchCommand como exemplo, o processo geral de escrita de arquivos pelo Alluxio Client é brevemente descrito a seguir:

FileSystemShell recebe comandos shell, executa "touch" para abrir arquivos, chama o comando TouchCommand.run, comandos shell suportam diretórios regulares e multidiretórios e executam a operação runPlainPath implementada de forma personalizada para cada diretório especificado;

O método TouchCommand#runPlainPath chama FileSystem.createFile para criar o arquivo e fecha a conexão quando terminar;

O método de FileSystem.createFile é explicado em detalhes da seguinte forma:

  • Obtenha informações de conexão RPC remota de FileSystemMasterClientServiceHandler com base em FileSystemMasterClient;

  • Chame a interface RPC para criar um arquivo de dados (createFile) baseado no FileSystemMasterClient e sincronize as informações de metadados do arquivo Alluxio recém-criado com o Alluxio Master;

  • FileSystem cria um novo objeto de fluxo de saída de arquivo Alluxio do lado do cliente: AlluxioFileOutStream, cuja camada inferior chama o objeto DataWriter do Block para processamento de arquivos;

  • Após a conclusão do fluxo de saída, execute o método AlluxioFileOutStream#close, chame FileSystemMasterClient#completeFile para avaliar se a execução foi concluída e, finalmente, implemente completeFile com base na interface RPC;insira a descrição da imagem aqui

Parte 5 Programação Leve

O Alluxio implementa internamente o agendamento de operações do Alluxio leve e integrado baseado no AlluxioJobMaster e no AlluxioJobWoker O Master é responsável pelo gerenciamento do agendamento de tarefas, enquanto o Worker realmente executa as operações de tarefas.

5.1 Gerenciamento de Agendamento

Como pode ser visto no processo de inicialização do AlluxioJobMaster anterior, o AlluxioJobMaster acionará a inicialização do Servidor JobMaster quando for inicializado. O JobMaster mantém internamente o rastreador de gerenciamento do plano de execução (plano): PlanTracker, que é usado para criar, remover e acessar tarefas Coleções de jobs Cada job tem um correspondente O PlanCoordinator é usado para coordenação de execução de jobs distribuídos. Os serviços externos podem chamar o método JobMaster.run por meio de HTTP e RPC para iniciar e agendar trabalhos (sincronizados/segmentados) de acordo com a configuração do trabalho (JobConfig). JobConfig define a interface de configuração do job, que é dividida em duas categorias: PlanConfig (execução de job único), WorkflowConfig (um grupo de execução de fluxo de job).

O processo geral de gerenciamento de agendamento de trabalho no JobMaster é o seguinte: A
interface externa pode chamar o método JobMaster.run para acionar a execução do trabalho.Tomando o tipo de trabalho Plan como exemplo, chame PlanTracker para executar o método run;

O PlanTracker verifica e remove primeiro os trabalhos concluídos, cria uma nova instância do trabalho com base no PlanCoordinator e inicia a instância do trabalho;

Processo de inicialização do trabalho do PlanCoordinator:

  • Obtenha o PlanDefinition correspondente baseado em JobConfig;

  • De acordo com a lista de Worker disponível e PlanDefinition, chame o método selectExecutors para obter a lista de Workers a serem executados;

  • Chame o CommandManager para enviar o trabalho e mantenha o trabalho e as informações da lista de trabalho do trabalho a ser executado na fila de memória;

Por fim, os nós Job Master e Job Worker enviam informações de trabalho específicas ao Worker para execução por meio da detecção de pulsação RPC.
insira a descrição da imagem aqui
5.2 Execução do trabalho
Como pode ser visto no processo de inicialização do AlluxioJobWorker acima, quando o AlluxioJobWorker é iniciado, o thread de detecção de pulsação CommandHandlingExecutor será acionado para executar o processamento de agendamento nos trabalhos recebidos. Cada trabalho inicia um thread para execução. O processo geral de execução do trabalho é o seguinte:
o thread CommandHandlingExecutor inicia o heartbeat com JobMaster Detection, baseado no método JobMasterClient.heartbeat para obter uma lista de todos os trabalhos a serem executados;

Percorra a lista de trabalhos a serem executados e chame a classe de thread CommandHandler.run do pool de threads para executar o agendamento de trabalho, incluindo os tipos de trabalho: iniciar, cancelar e registrar trabalhos;

Quando CommandHandler inicia um trabalho, ele chamará TaskExecutorManager para executar o trabalho e executará TaskExecutor com Future para agendamento de trabalho em nível de thread;

O TaskExecutor realmente executa o agendamento de tarefas:

  • Desserialize os parâmetros de trabalho correspondentes;

  • Obtenha o PlanDefinition que executa o Job de acordo com o PlanDefinitionRegistry e mobilize o runTask para executar o job;
    insira a descrição da imagem aqui
    tome PersistDefinition como exemplo, descreva aproximadamente a operação do Job Executor e persista o armazenamento do Alluxio Block para o UFS subjacente:
    Obtenha o URI de armazenamento de dados de Alluxio e leia o fluxo de entrada de dados correspondente;

Obtenha o caminho de destino UFS especificado, julgue se o caminho existe de acordo com UfsClient, crie-o se não existir e crie o fluxo de saída com base em UnderFileSystem;

De acordo com a classe da ferramenta de operação de E/S, os dados são copiados do fluxo de dados para o fluxo de saída e persistidos no UFS.

Para [informações do evento] [artigos técnicos] [grandes visualizações de café] mais interessantes e informativos, preste atenção em [Alluxio Think Tank] :

{{o.name}}
{{m.name}}

Acho que você gosta

Origin my.oschina.net/u/5904778/blog/5570016
Recomendado
Clasificación