Este artigo foi traduzido por máquina.

Windows Azure

Hadoop no Windows Azure

Lynn Langit

 

Houve uma série de novidades sobre Hadoop ultimamente, e interesse em usá-lo para processar conjuntos de dados extremamente grandes parece crescer dia a dia. Com isso em mente, eu vou lhe mostrar como configurar um cluster de Hadoop no Windows Azure. Este artigo pressupõe familiaridade básica com Hadoop tecnologias. Se você é novo para Hadoop, consulte "O que é o Hadoop?" Como desta escrita, Hadoop no Windows Azure está em beta privado. Para obter um convite, visite hadooponazure.com. O beta é compatível com o Apache Hadoop (instantâneo 0.20.203+).

O que é o Hadoop?

Hadoop é uma biblioteca de código aberto projetada para processamento em lotes grandes conjuntos de dados em paralelo. Ele é baseado no sistema de arquivos distribuído do Hadoop (HDFS) e é composto por utilitários e bibliotecas para trabalhar com dados armazenados em clusters. Estes processos batch executado usando um número de diferentes tecnologias, como o mapa/reduzir postos de trabalho e podem ser escritos em Java ou outras linguagens de nível mais alto, como porco. Existem também linguagens que podem ser usados para consultar dados armazenados em um cluster do Hadoop. A linguagem mais comum para consulta é HQL via colméia.  Para obter mais informações, visite hadoop.apache.org.

Configurar O Cluster

Uma vez que você está convidado a participar do beta, você pode configurar o cluster do Hadoop. Vá para hadooponazure.com e faça login com sua Windows Live ID autorizado. Em seguida, preencha as caixas de diálogo no portal da Web, usando os seguintes valores:

  1. Nome do cluster (DNS): Digite o nome na forma "< sua string exclusiva > .cloudapp. NET".
  2. Tamanho do cluster: Escolha o número de nós, de 4 a 32 e suas alocações de armazenamento associado, a partir de 2TB para 16 TB por cluster.
  3. Nome de usuário administrador e senha: Digite um nome de usuário e senha; restrições de complexidade de senha estão listadas na página. Uma vez que este é definido, você pode conectar via desktop remoto ou via Excel.
  4. Informações de configuração para uma instância de SQL Azure: Esta é uma opção para armazenar o Metastore Hive. Se ele for selecionado, você precisará fornecer o URL para sua instância de servidor de SQL Azure, bem como o nome das credenciais de login e o banco de dados de destino. O login que você especificar deve ter as seguintes permissões no banco de dados de destino: ddl_ddladmin, ddl_datawriter, ddl_datareader.

Depois de preenchido essas informações, clique em solicitação de cluster. Você verá uma série de atualizações de status no portal de Web como o cluster (chamado de isótopo no beta) está sendo alocado, criado e iniciado. Para cada cluster que você alocar, você verá muitos nós de trabalhador e um nó principal, que também é conhecido como o NameNode.

Após algum período de tempo (cinco a 30 minutos na minha experiência), o portal será atualizado para mostrar que o cluster é alocado e pronto para uso. Você pode simplesmente explorar a interface Metro-style (clicando os botões grandes) para ver quais tipos de processamento de dados e tarefas de gerenciamento que você pode executar (ver Figura 1). Além de usando o portal Web para interagir com o cluster, você poderá abrir as portas disponíveis (fechadas por padrão) para acesso FTP ou servidor ODBC. Falarei sobre alguns métodos alternativos de conexão em um pouco.

The Azure Hadoop Portal
Figura 1: O Portal do Windows Azure Hadoop

Na seção de seu Cluster do portal, você pode executar tarefas administrativas básicas, tais como a configuração do acesso ao cluster, importação de dados e gerenciamento do cluster através do console interativo. O console interativo oferece suporte a JavaScript ou colméia. Como Figura 1 mostra, você também pode acessar a seção de suas tarefas. Aqui, você pode executar um trabalho de MapReduce (através de um arquivo. jar) e ver o status de todos os trabalhos de MapReduce que executam, bem como aqueles que completaram recentemente.

Os portal botões exibem informações sobre três trabalhos de MapReduce recentemente concluídos: C# Streaming exemplo, exemplo de contagem de palavras e exemplo de Terasort de 10 GB. Cada botão mostra o status de ambos o mapa e a reduzir a parte de cada trabalho. Existem várias outras opções para exibir o status de execução (ou concluídos) trabalhos de MapReduce diretamente do portal e através de outros meios de conexão com o cluster, como o Remote Desktop Protocol (RDP).

Conectando a seus dados

Você pode disponibilizar dados para o Hadoop no cluster de Windows Azure em um número de maneiras, incluindo diretamente fazer o upload para o cluster e acessar dados armazenados em outros locais.

Embora FTP permite upload teoricamente quaisquer arquivos de dados de tamanho, a melhor prática é fazer upload de arquivos que estão em um intervalo de gigabyte-tamanho inferior. Se você deseja executar trabalhos em lotes em dados armazenados fora do Hadoop, você precisará executar algumas etapas de configuração pela primeira vez. Para configurar conexões externas, clique no botão Gerenciar Cluster no portal principal e, em seguida, configurar os locais de armazenamento que você deseja usar, como um local de armazenamento de Blob do Windows Azure, um resultado de consulta de dados de mercado do Windows Azure ou um local de armazenamento S3 da Amazon Web Services (AWS):

  1. Para configurar uma conexão com um balde de AWS S3, digite suas chaves de segurança (públicas e privadas) para acessar dados armazenados em S3 no cluster Hadoop.
  2. Para trabalhar com dados do mercado de dados do Windows Azure, preencher os valores para o nome de usuário (WLID), chave de acesso (para o fonte de dados que você deseja consultar e importar), nome da tabela consulta e (destino) Colméia (extrato) de origem. Certifique-se de remover o parâmetro para o limite de consulta padrão (100 linhas) da consulta gerada pelas ferramentas de dados no mercado antes de digitar a consulta na caixa de texto em seu cluster.
  3. Para acessar dados armazenados no armazenamento de Blob do Windows Azure, você precisará digitar o nome de conta de armazenamento (URL) para os locais de armazenamento de Blob e o valor da sua chave de acesso (chave privada).

Executando um trabalho de MapReduce

Depois de configurar e verificar seu cluster Hadoop e tornando seus dados disponíveis, você provavelmente vai querer começar analisando dados executando um ou mais trabalhos de MapReduce. A questão é, a melhor forma de começar? Se você é novo para Hadoop, existem alguns exemplos que você pode executar para ter uma idéia do que é possível. Você pode exibir e executar qualquer um destes, clicando no botão de amostras no portal da Web.

Se você é experiente com Hadoop técnicas e quer executar seu próprio trabalho de MapReduce, existem vários métodos. O método selecionado dependerá de sua familiaridade com as ferramentas do Hadoop (como o prompt de comando do Hadoop) e seu idioma preferido. Você pode usar Java, porco, JavaScript ou c# para escrever um trabalho de MapReduce executável para Hadoop no Windows Azure.

Vou usar o exemplo de contagem de palavras para demonstrar como executar um trabalho de MapReduce no portal usando um arquivo. jar. Como você poderia esperar, esse trabalho conta palavras para alguma entrada — neste exemplo um arquivo de texto grande (o conteúdo de um livro publicado) — e produz o resultado. Clique em amostras, em seguida, WordCount para abrir a página de configuração de emprego no portal, como mostrado na Figura 2.

Setting Up the WordCount Sample
Figura 2 Configurando o exemplo WordCount

Você verá dois parâmetros configuráveis para este trabalho, para a função (contagem de palavras) e outra para os dados de origem (o arquivo de texto). Os dados de origem (parâmetro 1) incluem não apenas o nome do arquivo de entrada, mas também o caminho para sua localização. Este caminho para o arquivo de dados de origem pode ser texto, ou pode ser "local", que significa que o arquivo é armazenado nesse cluster Hadoop Windows Azure. Como alternativa, a fonte de dados pode ser obtido em AWS S3 (através do S3n: / / ou o S3: / / protocolo), do armazenamento de Blob do Windows Azure (via o ASV: / / protocolo) ou no mercado de dados do Windows Azure (importando primeiro os dados desejados através de uma consulta), ou ser obtido diretamente do HDFS loja. Depois de digitar o caminho para um local remoto, você pode clicar no ícone de verificação (um triângulo) e você deverá receber uma mensagem de OK, se você pode se conectar usando a seqüência de caracteres fornecida.

Depois de configurar os parâmetros, clique em executar trabalho. Você encontrará um número de maneiras de monitorar o status do trabalho de ambos como o trabalho é em execução e emprego de resultados depois que o trabalho for concluído. Por exemplo, na página principal do portal, a seção de suas tarefas exibe um botão com o status dos trabalhos mais recentes durante a execução e após a conclusão. É adicionado um novo botão para cada trabalho, mostrando o nome do emprego, porcentagem concluída para o mapa e as porções de reduzir durante a execução e o status (OK, falha e assim por diante) após a conclusão do trabalho.

A página de histórico do trabalho, que você pode obter a seção gerenciar sua conta da página principal, fornece mais detalhes sobre o trabalho, incluindo o texto (script), usado para executar o trabalho e o estado, com informações de data e hora. Você pode clicar no link de cada trabalho obter mais informações sobre a execução do trabalho.

Se você decidir executar uma amostra, certifique-se de ler as instruções detalhadas para esse exemplo específico. Alguns exemplos podem ser executados a partir do portal de Web (suas tarefas | Criar emprego); outros requerem uma conexão RDP para o cluster.

Usando JavaScript para executar trabalhos de

Clique no botão do Console interativo para abrir o console de JavaScript. Aqui você pode executar trabalhos de MapReduce executando arquivos. jar (Java), executando um comando de porco do prompt, ou por escrever e executar trabalhos de MapReduce diretamente em JavaScript.

Você pode carregar também diretamente os dados de origem de js > prompt usando o comando fs.put. Este comando abre uma caixa de diálogo onde você pode escolher um arquivo para carregar para o cluster. IIS limita o tamanho do arquivo que você pode fazer o upload através do console de JavaScript para 4 GB.

Você também pode usar a fonte de dados a partir de outros repositórios remotos (como o Windows Azure Blobs) ou outros fornecedores de nuvem. Para trabalhar com dados de origem de AWS S3, você usar uma solicitação no formato s3n: / / < nome de balde > / < nome da pasta >.

Usando o console de JavaScript, você pode verificar a conectividade seu balde de AWS S3 usando o comando ls # com o endereço do balde, da seguinte forma:

JS > # ls s3n: / HadoopAzureTest/livros

2 Itens encontrados

-rwxrwxrwx 1 0 2012-03-30 00:20 / livros

-rwxrwxrwx 1 1395667 2012-03-30 00:22 /Books/davinci.txt

 

Quando você fizer isso, você deve obter uma lista dos conteúdos (pastas e arquivos) do seu balde como neste exemplo.

Se você gostaria de revisar o conteúdo do arquivo antes de executar seu trabalho, você pode fazê-lo no console com o comando #cat:

JS > #Cat s3n://HadoopAzureTest/Books/davinci.txt

 

Depois de verificar que você pode conectar a sua fonte de dados, você vai querer executar seu trabalho de MapReduce. A seguir está a sintaxe de JavaScript para o trabalho de MapReduce de amostra de contagem de palavras (usando um arquivo. jar):

var map = function (key, value, context) {
  var words = value.split(/[^a-zA-Z]/);
  for (var i = 0; i < words.length; i++) {
    if (words[i] !== "") {
      context.write(words[i].toLowerCase(), 1);
    }
  }
};
var reduce = function (key, values, context) {
  var sum = 0;
  while (values.hasNext()) {
    sum += parseInt(values.
next());
  }
  context.write(key, sum);
};

Na parte do mapa, o script divide o texto de origem em palavras individuais; na parte de reduzir, palavras idênticas são agrupadas e, em seguida, contou. Finalmente, um arquivo de saída (Resumo) com as palavras top por contagem (e a contagem das palavras) é produzido. Para executar este trabalho de WordCount diretamente do console interativo JavaScript, comece com a palavra-chave do porco para indicar que você deseja executar um trabalho de porco. Em seguida, chamar o método, que é onde você passa no local da fonte de dados. Nesse caso, eu vou realizar a operação nos dados armazenados remotamente — na AWS S3.

Agora você pode chamar o método de mapReduce no trabalho porco, passando o nome do arquivo com o código de JavaScript para este trabalho, incluem­ing os parâmetros necessários. Os parâmetros para este trabalho são o método de quebra de texto — cada palavra — e o valor e o tipo de dados da agregação de reduzir. Neste caso, o último é uma contagem (soma) de tipo de dados long.

Você, em seguida, especificar a ordem de saída usando o método orderBy, novamente passando os parâmetros; aqui, a contagem de cada grupo de palavras será saída em ordem decrescente. Na próxima etapa, o método de tomar especifica quantos valores agregados devem ser retornados — neste caso, as 10 palavras mais comumente ocorrem. Finalmente, você chamar o método, passando o nome do arquivo de saída que você deseja gerar. Aqui está a sintaxe completa para executar este trabalho:

Pig.from("s3n://HadoopAzureTest/Books").mapReduce("WordCount.js", "word, count:long").orderBy 
("count DESC").take(10).to("DaVinciTop10Words.txt")

 

Como o trabalho está sendo executado, você vai ver as atualizações de status no navegador — a porcentagem concluída de primeiro o mapa e, em seguida, o trabalho de reduzir. Você também pode clicar em um link para abrir outra janela do navegador, onde você verá o log mais detalhado sobre o andamento do trabalho. Dentro de alguns minutos, você verá uma mensagem indicando que o trabalho foi concluído com êxito. Para validar ainda mais a saída de trabalho, você pode executar uma série de comandos no console do JavaScript.

O primeiro comando, fs.read, exibe o arquivo de saída, mostrando as palavras de top 10 e a contagem total de cada um em ordem decrescente. O comando seguinte, analisar, mostra as mesmas informações e irá preencher a variável de dados com a lista. O último comando, graph.bar, exibe um gráfico de barras dos resultados. Aqui está a aparência desses comandos:

JS > arquivo = fs.read("DaVinciTop10Words.txt")

JS > dados = a análise (file.data, "word count: long")

JS > Graph.Bar(Data)

 

Um aspecto interessante do uso de JavaScript para executar trabalhos de MapReduce é a concisão do código JavaScript em comparação com o Java. O trabalho de Java MapReduce WordCount amostra contém mais de 50 linhas de código, mas o exemplo de JavaScript contém apenas 10 linhas. A funcionalidade de ambos os postos de trabalho é semelhante.

Usando c# com Hadoop Streaming

Uma outra maneira, você pode executar trabalhos de MapReduce no Hadoop no Windows Azure é via Streaming de c#. Você encontrará um exemplo mostrando como fazer isso no portal. Como no exemplo anterior, para experimentar este exemplo, você precisa fazer o upload dos ficheiros necessários (davinci.txt, cat.exe e wc.exe) para um local de armazenamento, como o HDFS, ASV ou S3. Você também precisará obter o endereço IP do seu HEADNODE Hadoop. Para obter o valor usando o console interativo, execute este comando:

JS > #cat apps/dist/conf/core-site.xml

 

Preencha os valores na página de corredor de trabalho; o comando final será parecido com isto:

Hadoop jar hadoop-exemplos-0.20.203.1-SNAPSHOT.jar

-arquivos "hdfs:///example/apps/wc.exe,hdfs:///example/apps/cat.exe"

-entrada "/ example/data/davinci.txt"

-saída "/ example/data/StreamingOutput/wc.txt"

-mapper "cat.exe"

-redutor de "wc.exe"

 

No exemplo, o mapeador e o redutor são arquivos executáveis que ler a entrada do stdin, linha por linha e emitem a saída para stdout. Esses arquivos de produzem um trabalho de mapa/reduzir, o que é enviado para o cluster para execução. Tanto o arquivo de mapeamento, cat.exe e o arquivo de redutor, wc.exe, são mostrados em Figura 3.

The Mapper and Reducer Files
Figura 3 O mapeador e arquivos de redutor

Aqui está como funciona o trabalho. O arquivo de mapeamento inicia-se pela primeira vez como um processo de inicialização de tarefa de mapeador. Se houver vários mappers, cada um vai lançar como um processo separado na inicialização. Neste caso, há apenas um único recurso de mapeamento file—cat.exe. A exe­cução, a tarefa de mapeador converte a entrada em linhas e alimenta essas linhas para a parte de stdin do trabalho MapReduce. Em seguida, o mapeador reúne a linha de saídas de stdout e converte cada linha em um par chave/valor. O comportamento padrão (que pode ser alterado) é que a chave é criada a partir do prefixo de linha até o primeiro caractere de tabulação, e o valor é criado a partir do restante da linha. Se não houver nenhum guia em linha, a linha inteira se torna a chave e o valor será nulo.

Após a conclusão das tarefas de mapeador, cada arquivo de redutor lança como um processo separado na inicialização de tarefa do redutor. Na execução, o redutor converte entrada pares de chave/valor em linhas e alimenta as linhas para o processo de stdin. Em seguida, o redutor recolhe a linha -­orientada para saídas de stdout processar e converte cada linha em um par chave/valor, que é coletado como a saída do redutor.

Usando HiveQL para consultar uma tabela de ramificação

Usando o console de Web interativo, você pode executar uma consulta de colméia contra Hive tabelas que você definiu em seu cluster Hadoop. Para saber mais sobre a colméia, consulte hive.apache.org.

Para usar o Hive, você primeiro criar (e carregar) uma tabela de ramificação. Arquivo de saída usando nosso exemplo WordCount MapReduce (DavinciTop10­Words.txt), você pode executar o seguinte comando para criar e, em seguida, verifique se sua nova tabela de ramificação:

seção > INPATH DE DADOS DE CARGA

'hdfs://lynnlangit.cloudapp.net:9000/user/lynnlangit/DaVinciTop10Words.txt'

SUBSTITUIR INTO TABLE wordcounttable;

seção > Mostrar tabelas;

seção > Descreva wordcounttable:

seção > Selecione * from wordcounttable;

 

Seção sintaxe é semelhante à sintaxe SQL e HiveQL fornece a funcionalidade de consulta semelhante. Tenha em mente que todos os dados é diferencia maiúsculas de minúsculas por padrão no Hadoop.

Outras maneiras de se conectar ao Cluster

Usando RDP além de trabalhar com o cluster através do portal da Web, você também pode estabelecer uma conexão remota ao servidor de NameNode do cluster. Para conectar via RDP, você clique no botão de área de trabalho remota no portal, em seguida, clique sobre o arquivo de conexão RDP baixado e, quando solicitado, digite seu nome de usuário administrador e senha. Se solicitado, abra portas de firewall na máquina cliente. Depois que a conexão é estabelecida, você pode trabalhar diretamente com o NameNode do seu cluster usando o shell do Windows Explorer ou outras ferramentas que são incluídas com a instalação do Hadoop, tal como faria com a experiência do Hadoop padrão.

Meu servidor de NameNode está executando o Windows Server 2008 R2 Enterprise SP1 em um servidor com dois processadores e 14 GB de RAM, com Apache Hadoop lançamento 0.20.203.1 instantâneo instalado. Observe que os recursos de cluster consistem no nó de nome e nós do trabalhador associado, portanto o número total de processadores para meu cluster de amostra é oito.

A instalação inclui ferramentas de gerenciamento padrão do Hadoop, como o Hadoop Shell de comando ou a interface de linha de comando (CLI), o Hadoop MapReduce job tracker (encontrado em http://[namenode]:50030) e o Hadoop NameNode HDFS (encontrado em http://[namenode]:50070). Usando o Shell de comando do Hadoop você pode executar trabalhos de MapReduce ou outras tarefas administrativas (como gerenciamento de seu estado de cluster DFS) através de sua sessão RDP.

Neste momento, você pode se conectar via RDP usando apenas um computador de cliente do Windows. Atualmente, a conexão RDP usa um cookie para permitir o encaminhamento de porta. O Remote Desktop Connection para Mac cliente não tem a capacidade de usar esse cookie, para que ele não pode se conectar à máquina virtual.

Usando o Microsoft de conector Sqoop enviado vários conectores para Hadoop para SQL Server no final de 2011 (para SQL Server 2008 R2 ou posterior ou SQL Server Parallel Data Warehouse). O conector de base Sqoop SQL Server é projetado para permitem que você importar ou exportar dados entre Hadoop no Linux e SQL Server. Você pode baixar o conector de bit.ly/JgFmm3. Este conector requer que o driver JDBC do SQL Server seja instalado no mesmo nó como Sqoop. Download do driver em bit.ly/LAIU4F.

Você encontrará um exemplo mostrando como usar Sqoop para importar ou exportar dados entre o SQL Azure e HDFS na seção de exemplos do portal.

Usando FTP para usar o FTP, você primeiro tem que abrir uma porta, que pode ser feito clicando no botão de configurar portas no portal e, em seguida, arrastando o controle deslizante para abrir a porta padrão para FTPS (porta 2226). Para se comunicar com o servidor FTP, você precisará de um hash MD5 da senha para sua conta. Conectar via RDP, abra o arquivo users.conf, copie o hash MD5 da senha para a conta que será usada para transferir arquivos através de FTPS e, em seguida, usar esse valor para se conectar. Observe que o hash MD5 da senha usa um certificado auto-assinado no servidor Hadoop que pode não ser totalmente confiável.

Você também pode abrir uma porta para conexões de ODBC (tais como Excel) nesta seção do portal. O número da porta padrão para as conexões do servidor ODBC é 10000. Para configurações de porta mais complexas, no entanto, use uma conexão RDP para o cluster.

Usando o Driver ODBC para o Hadoop (para conectar-se ao Excel e PowerPivot) você pode baixar um driver ODBC para Hadoop da página de Downloads do portal. Este driver, que inclui um add-in para o Excel, posso ligar do Hadoop para Excel ou do PowerPivot. Figura 4 mostra o botão do painel colméia que é adicionado ao Excel, depois de instalar o add-in. O botão apresenta um painel de consulta da colmeia onde você pode estabelecer uma conexão com um servidor de Hadoop hospedado localmente ou em uma instância remota. Após fazer isso, você pode escrever e executar uma consulta de colméia (via HiveQL) contra esse cluster e, em seguida, trabalhar com os resultados que são retornados para o Excel.


Figura 4: painel de consulta de Hive no Excel

Você também pode conectar aos dados do Hadoop usando o PowerPivot para Excel. Para conectar-se ao PowerPivot do Hadoop, primeiro crie um OLE DB para conexão de ODBC usando o provedor de colméia. No painel de consulta de colmeia, em seguida conecte ao cluster de Hadoop usando a conexão que você configurou anteriormente, em seguida, selecione as tabelas de colméia (ou escrever uma consulta de HiveQL) e retornar os dados selecionados para o PowerPivot.

Certifique-se de baixar a versão correta do driver ODBC para o hardware da máquina e o Excel. O driver está disponível em edições de 32 bits e 64 bits.

Flexível e fácil — mas com algumas incógnitas

O Hadoop no beta do Windows Azure mostra várias vantagens interessantes, incluindo:

  • A instalação é fácil usando o portal de Metro-style Web intuitivo.
  • Você tem escolhas da linguagem flexível para executar consultas de dados e trabalhos de MapReduce. Você pode executar trabalhos de MapReduce usando Java, c#, porco ou JavaScript e consultas podem ser executadas usando o Hive (HiveQL).
  • Se você estiver familiarizado com Hadoop technologies, você pode usar suas habilidades existentes. Esta implementação é compatível com Apache Hadoop instantâneo 0,203 +.
  • Há uma variedade de opções de conectividade, incluindo um driver ODBC (SQL Server/Excel), RDP e outros clientes, bem como a conectividade a outros armazenamentos de dados de nuvem da Microsoft (Windows Azure Blobs, o mercado de dados do Windows Azure) e outros (Amazon Web Services S3 baldes).

No entanto, há muitas incógnitas na versão do Hadoop no Windows Azure que será lançado publicamente:

  • A versão atual é um beta privado apenas; há pouca informação sobre um roteiro e as características de lançamento prevista.
  • Preço não foi anunciado.
  • Durante o beta, há um limite para o tamanho dos arquivos que você pode fazer upload, e a Microsoft incluiu um aviso de que "a versão beta para testes de características, não para testes de cargas de dados de nível de produção." Assim, não está claro como será o desempenho da versão de lançamento.

Para ver demonstrações de vídeo (screencasts) a funcionalidade de beta do Hadoop no Windows Azure, veja minha BigData Playlist no YouTube no bit.ly/LyX7Sj.

Lynn Langit (LynnLangit.com) executa seu próprio treinamento técnico e a empresa de consultoria. Ela projeta e constrói soluções de dados que incluem sistemas RDBMS e NoSQL. Recentemente, ela retornou à prática privada, depois de trabalhar como divulgador e desenvolvedor Microsoft há quatro anos. É autora de três livros sobre SQL Server Business Intelligence, recentemente "Smart soluções de Business Intelligence com o SQL Server 2008" (Microsoft Press, 2009). Ela também é o co-fundador da TKP sem fins lucrativos (TeachingKidsProgramming.org).

Graças ao especialista técnico seguir para revisar este artigo: Denny Lee