Recomendações para sistemas de processamento distribuído / armazenamento distribuído

4

Na minha organização, temos um sistema de processamento e armazenamento distribuído em duas dúzias de máquinas Linux que manipulam mais de um petabyte de dados. O sistema agora é muito ad-hoc; A automação de processamento e o gerenciamento de dados são tratados por uma coleção de grandes programas perl em máquinas independentes. Eu estou vendo sistemas de processamento e armazenamento distribuídos para facilitar a manutenção, distribuir uniformemente carga e dados com replicação e aumentar o espaço em disco e a capacidade de computação.

O sistema precisa ser capaz de lidar com milhões de arquivos, variando em tamanho entre 50 megabytes e 50 gigabytes. Uma vez criados, os arquivos não serão anexados, apenas substituídos completamente, se necessário. Os arquivos precisam estar acessíveis via HTTP para download pelo cliente.

Neste momento, o processamento é automatizado por scripts perl (que eu tenho controle total) que chamam uma série de outros programas (que eu não tenho controle porque eles são de código fechado) que essencialmente transformam um conjunto de dados em outro . Não há mineração de dados acontecendo aqui.

Aqui está uma lista rápida das coisas que estou procurando:

  • Confiabilidade: esses dados devem estar acessíveis em HTTP em cerca de 99% do tempo, por isso preciso de algo que faça replicação de dados no cluster.

  • Escalabilidade: quero poder adicionar mais poder de processamento e armazenamento com facilidade e reequilibrar os dados no cluster.

  • Processamento distribuído: agendamento de tarefas e balanceamento de carga fáceis e automáticos que se ajustam ao fluxo de trabalho de processamento que descrevi resumidamente acima.

  • Reconhecimento do local de dados: não é estritamente necessário, mas desejável. Como os dados e o processamento estarão no mesmo conjunto de nós, gostaria que o agendador de trabalhos agendasse tarefas no ou próximas ao nó em que os dados estão realmente ativos para reduzir o tráfego de rede.

Aqui está o que eu vi até agora:

Gerenciamento de armazenamento:

  • GlusterFS: Parece muito legal e fácil de usar, mas parece não ter uma maneira de descobrir em que nó (s) um arquivo realmente reside para fornecer como uma dica para o agendador de tarefas.

  • GPFS: Parece o padrão ouro dos sistemas de arquivos em cluster. Atende à maioria dos meus requisitos, exceto, como glusterfs, reconhecimento de local de dados.

  • Ceph: Parece um jeito de imaturo agora.

Processamento distribuído:

  • Sun Grid Engine: Eu tenho muita experiência com isso e é relativamente fácil de usar (uma vez configurado corretamente). Mas a Oracle deu um aperto gelado em torno dele e já não parece muito desejável.

Ambos:

  • Hadoop / HDFS: À primeira vista, parecia que o hadoop era perfeito para minha situação. Armazenamento distribuído e agendamento de tarefas e foi a única coisa que achei que me daria a percepção de localização de dados que eu queria. Mas eu não gosto do namename sendo um único ponto de falha. Além disso, não tenho certeza se o paradigma MapReduce se ajusta ao tipo de fluxo de trabalho de processamento que tenho. Parece que você precisa escrever todo o seu software especificamente para o MapReduce, em vez de apenas usar o Hadoop como um agendador de tarefas genérico.

  • OpenStack: Fiz algumas leituras sobre isso, mas estou tendo problemas para decidir se isso se ajusta bem ao meu problema ou não.

Alguém tem opiniões ou recomendações de tecnologias que se encaixem bem no meu problema? Qualquer sugestão ou conselho seria muito apreciada.

Obrigado!

    
por Eddie 28.06.2011 / 01:52

1 resposta

2

Parece que você está no caminho certo para o que precisa. As tecnologias por aí (GlusterFS, GPFS) têm os recursos que você está procurando, mas não a localização de dados. Dependendo do que você está fazendo com os dados, isso pode ser incorporado ao seu despachante de trabalhos.

Para mim, parece que você precisa compilar em um estágio de indexação para o pipeline de processamento que determina a localidade de dados. Isso pode ser paralelizado e depois serializado novamente em um banco de dados, embora essa etapa provavelmente seja um código personalizado (você conhece seus dados melhor do que eu). Depois que você tiver a localidade de dados, as unidades de trabalho de processamento de pacotes para nós do trabalhador devem ser relativamente simples; construir unidades de trabalho para dados locais de nós primeiro e depois adjacentes a nós (se esse conceito se aplicar ao seu caso) e finalmente um contexto global usado quando a maioria do processamento é feito, mas algumas unidades de trabalho parecem estar tomando uma idade e seu processador local de nó está ocupado mastigando-os.

Essa é uma visão de alto nível. Focando mais perto dos parafusos do problema. A julgar pelo que você disse até agora, parece que você está trabalhando em grandes blocos de dados e deseja que o processamento seja feito no armazenamento local por motivos de largura de banda. Vejo algumas opções:

Primeira ideia, quando os dados são ingeridos a partir da sua fonte, são copiados para o Gluster / GPFS / qualquer sistema de arquivos distribuído. Em seguida, execute o processo de indexação que descrevi acima. Em seguida, à medida que os trabalhadores processam dados, os conjuntos de dados processados são reportados de volta a outro grupo de servidores cuja função é fornecer dados processados por HTTP. O método report-back pode até ser feito via HTTP PUTs, que depois coloca os dados em outro sistema de arquivos replicado. A desvantagem desse método é que ele armazena seus dados duas vezes (original e modificado), mas não sei se é algo que você já está fazendo. Isso permite que você amplie sua infra-estrutura de processamento até certo ponto, ao mesmo tempo em que mantém a infra-estrutura de serviço do cliente muito pequena.

Segunda ideia, como acima, mas quando os trabalhadores terminam de processar uma unidade de trabalho, os dados salvos são armazenados no sistema de arquivos Gluster / GPFS / whatever. Em seguida, os servidores HTTP veiculam dados diretamente desses repositórios, mas eles não estão tão preocupados com o nó-local quanto os nós de processamento. Para isso, é provavelmente uma boa ideia ter redes separadas de serviço e processamento de clientes para limitar o problema de trânsito duplo com esses grandes conjuntos de dados.

Terceira ideia, se descobrir a localidade de dados do GPFS / Gluster não for realmente factível (não os usei, por isso não tenho a certeza) poderá querer criar o seu próprio tipo de armazenamento. É muito trabalho, se você realmente precisa de localidade, pode valer a pena para você. À medida que você ingerir dados, cada conjunto de dados é indexado em um banco de dados e HTTP PUTed para vários nós, conforme necessário. Quando o processamento acontece, as tarefas são criadas para nós individuais para dados que são locais do nó para si mesmos primeiro. Quando um trabalhador recebe um trabalho, ele HTTP obtém os dados do nó especificado pelo banco de dados (que deve ser em si, mas não precisa ser). Quando o trabalho é concluído, ele notifica o banco de dados e recebe instruções sobre onde COLOCAR os resultados.

Para veicular conjuntos de dados processados para clientes, você provavelmente terá que introduzir algum código de aplicativo para converter arquivos para buscar HTTP GETs com proxy de seus nós.

Isso introduz uma parte de alta largura de banda do processo na forma desse banco de dados. Ele pode ter vários servidores da Web com balanceamento de carga na frente para processamento de lógica, mas o próprio banco de dados acaba sendo um ponto único de falha (embora as pessoas mais experientes nas formas de bancos de dados possam saber formas de contornar isso) . O banco de dados está basicamente atuando como a tabela de alocação de arquivos para um grande sistema de arquivos baseado em HTTP. Já que seu processamento parece precisar de semântica de sistema de arquivos muito simples (buscar / colocar, possivelmente bloquear / desbloquear para um nó que está processando um conjunto de dados) que pode ser mediado por tal banco de dados. Obviamente, esse banco de dados será muito grande, portanto, algumas das tecnologias NoSQL podem ser mais adequadas por motivos de desempenho.

Eu sei que esta não é a tecnologia específica que você está procurando, é mais sobre técnicas para lidar com deficiências no mercado. A localidade dos dados e a replicação é algo como um caso extremo, parece. Acontece que fazemos algo semelhante a você apenas com conjuntos de dados menores, por isso é um assunto que está na minha mente também.

    
por 28.06.2011 / 02:59