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.
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
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ê
pode visualizar o arquivo de log da inicialização do serviço nos logs do diretório raiz do projeto:
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:
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;
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:
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
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;
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:
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
anexado : visão geral do diagrama de classes HeartbeatExecutor
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
Worker Server
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;
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;
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.
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.
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:
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] :