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 1)

prefácio

Atualmente, o data lake se tornou um dos tópicos mais recentes no campo de big data, e o que é um data lake, cada plataforma de dados e fornecedor de nuvem tem sua própria interpretação. No geral, as principais vantagens de capacidade do data lake são: armazenamento centralizado de dados originais, massivos, de várias fontes e de vários tipos e suporte para processamento e cálculo rápidos de dados. Em comparação com os data warehouses tradicionais, os data lakes são mais inclusivos de dados, suportam dados estruturados/semiestruturados/não estruturados e podem implementar rapidamente o pouso de dados e a descoberta de valor de dados. O sistema técnico do data lake pode ser dividido em três subcampos: armazenamento de data lake, computação de data lake e metadados unificados de data lake.

O Data Lake Storage fornece a capacidade de armazenamento de dados heterogêneos massivos e oferece suporte a vários tipos de sistemas de armazenamento subjacentes, como armazenamento distribuído HDFS, armazenamento de objetos AWS S3, Tencent Cloud Object Storage COS etc. Além disso, no cenário de data lake, computação e A separação do armazenamento faz com que a localidade de dados da computação não exista mais. Portanto, é necessário introduzir uma camada de cache de dados unificada entre o armazenamento do data lake e a computação.

Alluxio é uma tecnologia de orquestração de dados de código aberto nativa da nuvem que cria uma ponte entre computação de dados e armazenamento de dados e suporta a movimentação de dados da camada de armazenamento original para um sistema de armazenamento distribuído virtual que acelera a computação . O Alluxio pode fornecer uma entrada unificada de acesso ao armazenamento de data lake para computação de data lake, suporte a diferentes tipos de armazenamento subjacente e abstrair um namespace de acesso a dados unificado, fornecendo localidade de dados, acessibilidade de dados e escalabilidade de dados.

Este artigo irá analisar brevemente o código-fonte subjacente do Alluxio, que é dividido em duas partes: incluindo principalmente a construção do ambiente local, estrutura do projeto do código-fonte, processo de inicialização do processo de serviço, chamada RPC entre serviços, explicação detalhada das principais classes no Alluxio, processo de leitura e gravação do Bloco no Alluxio, processo de chamada do Alluxio Client e estrutura de agendamento leve incorporada do Alluxio.

Preparação ambiental

implantação local

Baixe a versão de instalação do site oficial (endereço de download), tome a instalação 2.6.0 como exemplo, descompacte o pacote de instalação após o download:
1 tar -zxvf alluxio-2.6.0-bin.tar.gz
Modifique o arquivo de configuração básica,
(1) Modifique alluxio-site.properties, defina o endereço mestre, defina o ponto de montagem raiz padrão do Alluxio:
1 cp conf/alluxio-site.properties.template alluxio-site.properties
2 #Release the comment:
3 alluxio.master .hostname=127.0.0.1
4 alluxio.master.mount.table.root.ufs=${alluxio.work.dir}/underFSStorage

2) Modifique o ip correspondente da configuração dos masters e workers, a instalação local pode ser configurada para 127.0.0.1
1 vi conf/masters
2 vi conf/workers

Após modificar a configuração, prepare-se para iniciar o serviço Alluxio e execute os seguintes comandos:
1 # monta o disco correspondente
2 bin/alluxio-mount.sh Monta workers
3 # executa a verificação do ambiente
4 bin/alluxio validateEnv master
5 bin/alluxio validateEnv worker

As operações de comando de início de serviço, para todas as operações de serviço incluem: master, worker, job_master, job_worker, proxy
1 # Iniciar todos os serviços
2 bin/alluxio-start.sh all
3 # Parar todos os serviços
4 bin/alluxio-stop.sh all
5
6 # Inicia um único serviço
7 bin/alluxio-start.sh -a master
8 bin/alluxio-start.sh -a worker
9 bin/alluxio-start.sh -a job_master
10 bin/alluxio-start.sh -a job_worker
11 bin /alluxio-start.sh -a proxy

Depois que o serviço for iniciado com sucesso, você também poderá visualizar os processos Java por meio do JPS: AlluxioMaster, AlluxioWorker, AlluxioJobMaster, AlluxioJobWorker, AlluxioProxy. insira a descrição da imagem aqui
http://localhost:19999, visualização de página alluxio master ui interface, porta padrão: 19999

http://localhost:30000, visualização de página alluxio worker ui interface, porta padrão: 30000
insira a descrição da imagem aqui
IDEA debugging

Para compilação do código-fonte, consulte a documentação oficial: Construindo o Alluxio From Source
1 mvn clean install -DskipTests
2 # Acelera a compilação
3 mvn -T 2C clean install -DskipTests -Dmaven.javadoc.skip -Dfindbugs.skip -Dcheckstyle .skip -Dlicense.skip - Dskip.protoc

Inicie cada processo de serviço do Alluxio através do IDEA, e suas principais classes de inicialização incluem:

AlluxioMaster : Entrada de função principal, definida para iniciar e executar Opções de VM, alluxio.logger.type=MASTER_LOGGER, porta RPC: 19998, porta Web: 19999;

AlluxioJobMaster : entrada de função principal, definida para iniciar e executar opções de VM, alluxio.logger.type=JOB_MASTER_LOGGER

AlluxioWorker : entrada de função principal, definida para iniciar e executar opções de VM, alluxio.logger.type=WORKER_LOGGER,

AlluxioJobWorker : entrada de função principal, definida para iniciar e executar opções de VM, alluxio.logger.type=JOB_WORKER_LOGGER

AlluxioProxy : entrada de função principal, definida para iniciar e executar opções de VM, alluxio.logger.type=PROXY_LOGGER

Opções de VM参数示例如下:
1 -Dalluxio.home=/code/git/java/alluxio -Dalluxio.conf.dir=/code/git/java/alluxio/conf -Dalluxio.logs.dir=/code/git/java /alluxio/logs -Dlog4j.configuration=file:/code/git/java/alluxio/conf/log4j.properties -Dorg.apache.jasper.compiler.disablejsr199=true -Djava.net.preferIPv4Stack=true -Dalluxio.logger. type=MASTER_LOGGER -Xmx2g -XX:MaxDirectMemorySize=516M

O exemplo de operação é o seguinte: Você
insira a descrição da imagem aqui
pode visualizar o arquivo de log da inicialização do serviço nos logs do diretório raiz do projeto:
insira a descrição da imagem aqui
DEBUG remote debugging, configure as variáveis ​​de ambiente em alluxio-env.sh e inclua as seguintes propriedades de configuração
1 export ALLUXIO_WORKER_JAVA_OPTS=" ALLUXIOJAVAOPTS − agentlib : jdwp = transport = dtsocket , server = y , suspend = n , address = 6606 " 2 export ALLUXIOMASTERJAVAOPTS = " ALLUXIO_JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6606" 2 export ALLUXIO_MASTER_JAVA_OPTS=" A L L U X I O J A V A O P T S a g e n t li b : j d w p = t r a n s p o r t = d t s ​ock et , s e r v e r = y , s u s p e n d = n , a d d _ _ _ r e s s = 6 6 0 6 " 2e x p o r t A L L U X I O M ​A S T E R J ​A V A ​P T S = " ALLUXIO_JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n, address=6607”
3 export ALLUXIO_USER_DEBUG_JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=6609"

Conforme mostrado na figura abaixo, adicione uma porta de monitoramento remoto para monitorar o Alluxio Worker 6606:
insira a descrição da imagem aqui
habilite a saída DEBUG ao chamar o comando Alluxio Shell, use o parâmetro: -debug, o exemplo é o seguinte:
1 bin/alluxio fs -debug ls /

Estrutura do projeto

A estrutura do projeto do código fonte do Alluxio pode ser simplificada para os seguintes módulos principais:

alluxio-core: implementa o módulo central do sistema Alluxio Alluxio-core-server implementa Alluxio Master, Alluxio Worker e Alluxio Proxy, alluxio-core-client define as operações do Alluxio Client, alluxio-core-transport implementa a comunicação RPC entre serviços;

alluxio-job: Implementação de escalonamento de job leve no Alluxio, Alluxio Job Master e Alluxio Job Worker no alluxio-job-server;

alluxio-underfs: Adapta-se a diferentes armazenamentos subjacentes, como hdfs, cephfs, local, s3, etc.;

alluxio-table: implementa a função Alluxio Catalog, lê metadados com base no mecanismo de tabela e oferece suporte ao armazenamento Alluxio associado.Atualmente, o UDB subjacente do catálogo suporta hive metastore e aws glue catalog;

alluxio-shell: encapsula a ferramenta shell do Alluxio;
insira a descrição da imagem aqui

processo de serviço

Os cinco processos principais do serviço Alluxio: AlluxioMaster, AlluxioWorker, AlluxioProxy, AlluxioJobMaster e AlluxioJobWorker são implementados com base na extensão de classe da interface Process e definem as operações de gerenciamento do ciclo de vida dos processos do componente.

O diagrama de classes implementa o relacionamento de herança da seguinte forma:
insira a descrição da imagem aqui

AlluxioMaster

iniciar o processo

Baseado no JournalSystem para manter as informações persistentes dos metadados Master, é conveniente restaurar a partir do Arquivo do Diário mais recente após o serviço estar inativo.Para obter detalhes, consulte Gerenciamento do Diário;

Para a eleição do AlluxioMaster, a eleição do Mestre suporta dois métodos: ZK, Raft (RaftJournalSystem);

Acionador de gerenciamento de início e parada de processo baseado em ProcessUtils, execute AlluxioMasterProcess start

  • JournalSystem iniciar/definir o modo de execução primária (gainPrimacy)

  • AlluxioMasterProcess#startMasters: Inicia todos os serviços relacionados ao Master, incluindo block master, FileSystem master, etc.; se for o líder, chame BackupManager#initFromBackup para inicializar todos os componentes do servidor master registrados, se não for o líder, inicie apenas o RPC /UI serviço do Mestre

  • AlluxioMasterProcess#startServing: Iniciar serviços relacionados a indicadores, incluindo indicadores relacionados à Web, JVM e RPC;

O diagrama de sequência de inicialização é simplificado da seguinte forma: A
insira a descrição da imagem aqui
classe de interface do servidor é um componente de classe de interface do servidor
especial , inicializado e iniciado , incluindo principalmente a classe Master e a classe Worker . O servidor obterá threads do pool de threads e iniciará e executará as operações definidos por cada Servidor, que são definidos no servidor.A operação do ciclo de vida do encadeamento de serviço, os métodos de interface definidos são os seguintes: getName: obtém o nome do servidor;

getDependencies: outros pré-servidores dos quais o servidor depende;

getServices: Obtenha a coleção GrpcService definida pelo Servidor;

iniciar: o servidor inicia;

parar: o servidor pára;

close: o servidor está fechado;
insira a descrição da imagem aqui
o servidor mestre
define cada serviço de servidor de encadeamento encapsulado no componente mestre, incluindo gerenciamento de metadados de bloco, gerenciamento de sistema de arquivos, etc. O diagrama de classes detalhado é o seguinte:
insira a descrição da imagem aqui
DefaultFileSystemMaster

O Alluxio Master trata dos serviços de servidor de todo o gerenciamento de metadados do sistema de arquivos no sistema. Baseado no DefaultFileSystemMaster, ele pode realizar operações de bloqueio (lock) em arquivos. Para ler e escrever qualquer inode, é necessário bloquear cada caminho independente no árvore de inodes. Os métodos de bloqueio fornecidos pelo objeto InodeTree são: InodeTree#lockInodePath, InodeTree#lockFullInodePath, e o método retorna o objeto de caminho LockedInodePath que foi bloqueado.

Objetos de contexto comumente usados ​​em DefaultFileSystemMaster: JournalContext, BlockDeletionContext, RpcContext; o acesso do usuário aos metadados do arquivo (invocação de método) tem um thread independente para registro e gerenciamento de auditoria.

Nota : Quando o caminho do inode é obtido, pode haver operações simultâneas para escrever e alterar o caminho, então a leitura do caminho do inode lançará uma exceção, indicando que a estrutura de dados do caminho foi alterada.

DefaultFileSystemMaster iniciar a visão geral do processo de inicialização:
Inicialize o diretório raiz do sistema de arquivos (initializeRoot) com base no InodeTree e determine se existe a permissão do sistema de arquivos;

Atravesse MountTable, inicialize MasterUfsManager e execute a operação de montagem de montagem do sistema de arquivos;

Envie HeartbeatThreads diferentes ( threads de pulsação ) para cada verificação de detecção e, finalmente, chame o método HeartbeatExecutor.heartbeat. A detecção de pulsação inclui:

  • BlockIntegrityChecker: verificação de integridade do bloco

  • InodeTtlChecker: Verificação do ciclo de vida TTL do arquivo Inode

  • LostFileDetector: detecção de arquivo perdido

  • ReplicationChecker: Verificação do número de réplicas

  • Cronograma de Persistência: Cronograma de Persistência

  • Verificador de Persistência: Verificador de Persistência

  • Gravador de Séries Temporais: Gravador de Séries Temporais

  • UfsCleaner: UFS cleaner
    insira a descrição da imagem aqui
    anexado : visão geral do diagrama de classes HeartbeatExecutor
    insira a descrição da imagem aqui
    DefaultBlockMaster
    Alluxio Master gerencia todos os serviços de servidor de metadados de mapeamento de bloco e trabalhador. Para garantir solicitações simultâneas, o BlockMaster Server usa uma estrutura de dados que oferece suporte à simultaneidade e cada metadados pode ser bloqueado de forma independente. Existem dois tipos de metadados no BlockMaster: metadados de bloco (metadados de bloco), metadados de trabalhador (metadados de nó de trabalhador):
    operação de bloqueio de metadados de bloco: execute operações BlockStore arbitrárias com base em blocos para remover elementos de mlostBlocks;

Operação de bloqueio de metadados do trabalhador: verificar/atualizar o status do registro do trabalhador, taxa de uso do trabalhador de leitura/gravação, gerenciamento de bloco de leitura/gravação no trabalhador;

Para evitar operações de deadlock, se os metadados do bloco e do trabalhador precisam ser bloqueados ao mesmo tempo, o trabalhador precisa bloquear antes do bloco, e o contrário ocorre ao liberar o bloqueio, o bloco precisa liberar o bloqueio antes do trabalhador.

Iniciar visão geral do processo de inicialização : Enviar HeartbeatThread ( thread de pulsação ) para detecção e verificação. O thread enviado é: LostWorkerDetectionHeartbeatExecutor, que detecta a pulsação do trabalhador.

AlluxioWorker

iniciar o processo

Obtenha o endereço e as informações de configuração relacionadas do Alluxio Master através do MasterInquireClient.Factory;

Crie um objeto de processo AlluxioWorkerProcess e execute o método start, como segue:

  • Obtenha todos os serviços do Worker Server no Worker através do WorkerRegistry e inicie o Server correspondente ;

  • Registre o WebServer Handler e inicie-o, incluindo indicadores gerais e indicadores do Prometheus;

  • Registre JvmPauseMonitor para coletar informações do indicador de monitoramento da JVM relacionadas aos nós do trabalhador;

Se o Worker tiver incorporado o serviço FUSE, inicie o FuseManager
insira a descrição da imagem aqui
Worker Server
insira a descrição da imagem aqui
DefaultBlockWorker

Responsável por gerenciar as operações abstratas do Bloco de nível mais alto no nó Worker, incluindo:
BlockMasterSync periódico, que periodicamente relata e sincroniza as informações do Bloco do nó Worker atual com o Master;

Manter a relação lógica entre todas as informações do Bloco do Trabalhador atual e as operações de armazenamento subjacentes;

Iniciar visão geral do processo de inicialização : Obtenha o endereço RPC BlockMaster por meio do BlockMasterClientPool e registre-o e envie o thread HeartbeatThread do nó Worker com base no ExecutorService, incluindo:
BlockMasterSync: Sincronize as informações BlockMaster do nó Worker regularmente para gerenciamento unificado de metadados de bloco;

PinListSync: mantém o endereço de conexão entre o Alluxio e o UFS subjacente;

StorageChecker: Verifique o endereço de armazenamento;

AlluxioProxy

iniciar o processo

Crie o objeto de processo correspondente baseado em ProxyProcess.Factory: AlluxioProxyProcess;

Após criar o objeto de processo AlluxioProxyProcess, execute o método start, chame o ProxyWebServer para executar o método start e inicie o serviço Web Proxy;
insira a descrição da imagem aqui
AlluxioJobMaster

iniciar o processo

Crie o objeto de processo correspondente baseado em AlluxioJobMasterProcess.Factory: AlluxioJobMasterProcess;

AlluxioJobMasterProcess executa o método start, e os detalhes da chamada são os seguintes:

  • Inicie o JournalSystem associado ao AlluxioJobMaster e obtenha o Master Leader;

  • Inicie o serviço do Job's Server e chame o JobMaster start;

  • Inicie o servidor Web e o servidor RPC do JobMaster, respectivamente, para fornecer serviços de comunicação externa;
    insira a descrição da imagem aqui
    JobMaster

O Alluxio possui uma estrutura leve de agendamento de trabalho integrada e o JobMaster lida com todas as operações relacionadas ao gerenciamento de trabalhos no AlluxioJobMaster.

Iniciar visão geral do processo de inicialização : Com base no PlanTracker, obtenha todos os planos de execução em execução restantes no último sistema de agendamento e pare, envie HeartbeatThread ( heartbeat thread ) para monitoramento, o processo enviado é: LostWorkerDetectionHeartbeatExecutor, que é usado para detectar nós Worker com pulsações perdidas;

AlluxioJobWorker

iniciar o processo

Obtenha o endereço e as informações de configuração relacionadas do Alluxio Master através do MasterInquireClient.Factory;

Crie um objeto de processo AlluxioJobWorkerProcess e execute o método start, como segue:

  • Registre o WebServer Handler e inicie o JobWorkerWebServer para fornecer serviços da Web;

  • Inicie o serviço de servidor JobWorker de JobWorker, registre o nó do trabalhador de tarefa e envie o encadeamento de detecção de pulsação CommandHandlingExecutor;

  • Inicie o serviço RPC para comunicação externa.
    insira a descrição da imagem aqui
    Trabalhador

Responsável por gerenciar todas as operações relacionadas à execução de tarefas no nó Worker, que é implementado pelo processo de execução de detecção de pulsação CommandHandlingExecutor.

Iniciar visão geral do processo de inicialização : Registre as informações atuais do nó do trabalhador com o JobWorkerIdRegistry, envie o HeartbeatThread ( thread de pulsação ) para monitoramento e o thread enviado é: CommandHandlingExecutor , que processa o comando Command aceito pelo nó JobWorker.

Estrutura RPC

Alluxio é um sistema distribuído de armazenamento e cache.A comunicação entre os serviços é chamada através de RPC.Ele usa o framework grpc internamente.O arquivo proto RPC é definido no subprojeto alluxio-core-transport. Tomando o AlluxioMaster como exemplo, o processo de chamada de inicialização RPC é descrito em detalhes: Quando o processo AlluxioMaster inicia, ele iniciará o servidor grpc para fornecer serviços de interface externa. O Servidor (serviço Master) define os serviços RPC a serem registrados e iniciados por cada servidor e todos os serviços RPC são registrados no GrpcServerBuilder, depois disso, gere o GrpcServer baseado no GrpcServerBuilder.build e inicie-o. insira a descrição da imagem aqui
Os serviços de registro Master RPC e Worker RPC são baseados no Handler para implementar os métodos definidos pelo grpc, conforme mostrado abaixo:

insira a descrição da imagem aqui
A próxima parte da "Análise de código-fonte do Alluxio" é mais empolgante, portanto, fique atento.

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}}

おすすめ

転載: my.oschina.net/u/5904778/blog/5570020