1. Visão geral da arquitetura de comunicação do Spark
A versão 2.x do Spark usa a estrutura de comunicação Netty como componente de comunicação interna.
A nova estrutura de rpc do Spark com base no Netty baseia-se no design da Akka. É baseada no modelo de ator, conforme mostrado na figura a seguir: Cada componente (cliente / mestre / trabalhador) na estrutura de comunicação do Spark pode ser considerado um por um 独立的实体
, e cada entidade passa por Mensagem para comunicar. A relação específica entre os vários componentes é a seguinte:
Endpoint (Cliente / Mestre / Trabalhador) lá 1 个 InBox
, e N 个 OutBox
(N> = 1, N e dependendo de quantos outros Endpoint Endpoint se comunicam ou se comunicam com um correspondente da outra Endpoint OutBox), Endpoint 接收到的消息被写入 InBox,发送出去的消息写入OutBox ,并被发送到其他 Endpoint 的 InBox 中
.
Dois, análise da arquitetura de comunicação do Spark
A arquitetura de comunicação do Spark é mostrada na figura abaixo:
(1) RpcEndpoint
: endpoint RPC, Spark chama cada nó (Cliente / Mestre / Trabalhador) de endpoint Rpc e todos implementam a interface RpcEndpoint. O design interno é diferente de acordo com as necessidades dos diferentes endpoints. Mensagens e processamento de negócios diversos, caso precise enviar (consulta), ligue para Dispatcher;
(2) RpcEnv
: ambiente de contexto RPC, o ambiente de contexto do qual cada ponto de extremidade RPC depende durante o tempo de execução é chamado RpcEnv;
(3) Dispatcher
: Distribuidor de mensagens, para terminais RPC que precisam enviar mensagens ou mensagens recebidas de RPC remoto, distribua-as para a caixa de entrada / saída do comando correspondente. Se o destinatário da instrução for ele mesmo, coloque-a na caixa de entrada; se o destinatário da instrução não for ele mesmo, coloque-a na caixa de saída;
(4) Inbox
: Caixa de entrada da mensagem de instrução, um RpcEndpoint local corresponde a uma caixa de entrada, o Dispatcher adiciona o EndpointData correspondente ao ReceiverQueue interno toda vez que uma mensagem é armazenada na Caixa de entrada e um thread separado é iniciado quando o Dispatcher é criado. Pergunte ao ReceiverQueue para consumir mensagens da caixa de entrada;
(5) RpcEndpointRef
: RpcEndpointRef é uma referência a RpcEndpoint remoto. Quando precisamos enviar uma mensagem para um RpcEndpoint específico, geralmente precisamos obter uma referência para o RpcEndpoint e, em seguida, enviar a mensagem por meio do aplicativo.
(6) OutBox
: Caixa de saída da mensagem de instrução. Para o RpcEndpoint atual, um RpcEndpoint de destino corresponde a uma caixa de saída. Se enviar informações para vários RpcEndpoints de destino, haverá várias caixas de saída. Quando a mensagem é colocada na caixa de saída, ela é enviada via TransportClient. A mensagem é colocada na caixa de saída e o processo de envio é realizado no mesmo thread;
(7) RpcAddress
: Representa o endereço do RpcEndpointRef remoto, Host + Port.
(8) TransportClient
: cliente de comunicação Netty, uma OutBox corresponde a um TransportClient, TransportClient pesquisa a OutBox continuamente e solicita o TransportServer remoto correspondente de acordo com a informação do receptor da mensagem OutBox;
(9) TransportServer
: servidor de comunicação Netty, um RpcEndpoint corresponde a um TransportServer, após receber a mensagem remota, o Dispatcher é chamado para distribuir a mensagem para a caixa de envio e recebimento correspondente;
Com base na análise acima, a visão de alto nível da arquitetura de comunicação do Spark é mostrada na figura a seguir: