Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Saiba como criar um aplicativo Apache HBase em Java. Em seguida, use o aplicativo com o HBase no Azure HDInsight.
As etapas neste documento usam o Apache Maven para criar e construir o projeto. O Maven é uma ferramenta de gerenciamento e compreensão de projetos de software que permite construir software, documentação e relatórios para projetos Java.
Pré-requisitos
Um cluster do Apache HBase no HDInsight. Consulte Introdução ao Apache HBase.
Apache Maven instalado corretamente de acordo com o Apache. Maven é um sistema de construção de projetos para projetos Java.
Um cliente SSH. Para obter mais informações, veja Ligar ao HDInsight (Apache Hadoop) através de SSH.
Se estiver usando o PowerShell, você precisará do Módulo AZ.
Um editor de texto. Este artigo usa o Bloco de Notas da Microsoft.
Ambiente de teste
O ambiente usado para este artigo foi um computador executando o Windows 10. Os comandos foram executados em um prompt de comando, e os vários arquivos foram editados com o bloco de notas. Modifique de acordo com o seu ambiente.
Em um prompt de comando, digite os seguintes comandos para criar um ambiente de trabalho:
IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI
Criar um projeto do Maven
Digite o seguinte comando para criar um projeto Maven chamado hbaseapp:
mvn archetype:generate -DgroupId=com.microsoft.examples -DartifactId=hbaseapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false cd hbaseapp mkdir confEste comando cria um diretório nomeado
hbaseappno local atual, que contém um projeto Maven básico. O segundo comando altera o diretório de trabalho parahbaseapp. O terceiro comando cria um novo diretório,confque pode ser usado posteriormente. Ohbaseappdiretório contém os seguintes itens:-
pom.xml: O Project Object Model (POM) contém informações e detalhes de configuração usados para construir o projeto. -
src\main\java\com\microsoft\examples: Contém o código do seu aplicativo. -
src\test\java\com\microsoft\examples: Contém testes para a sua aplicação.
-
Remova o código de exemplo gerado. Exclua os arquivos
AppTest.javade teste e aplicativo gerados eApp.javainserindo os seguintes comandos:DEL src\main\java\com\microsoft\examples\App.java DEL src\test\java\com\microsoft\examples\AppTest.java
Atualizar o modelo de objeto do projeto
Para obter uma referência completa do arquivo pom.xml, consulte https://maven.apache.org/pom.html. Abra pom.xml digitando o seguinte comando:
notepad pom.xml
Adicionar dependências
Em pom.xml, adicione o seguinte texto na <dependencies> seção:
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-shaded-client</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version>4.14.1-HBase-1.1</version>
</dependency>
Esta seção indica que o projeto precisa de componentes hbase-client e phoenix-core . Em tempo de compilação, essas dependências são baixadas do repositório Maven padrão. Você pode usar a Pesquisa de repositório central do Maven para saber mais sobre essa dependência.
Importante
O número da versão do hbase-client deve corresponder à versão do Apache HBase fornecida com o cluster HDInsight. Use a tabela a seguir para encontrar o número da versão correta.
| Versão do cluster HDInsight | Versão do Apache HBase a ser usada |
|---|---|
| 3.6 | 1.1.2 |
| 4.0 | 2.0.0 |
Para obter mais informações sobre versões e componentes do HDInsight, consulte Quais são os diferentes componentes do Apache Hadoop disponíveis com o HDInsight.
Compilar a configuração
Os plug-ins do Maven permitem que você personalize os estágios de construção do projeto. Esta seção é usada para adicionar plug-ins, recursos e outras opções de configuração de compilação.
Adicione o seguinte código ao pom.xml ficheiro e, em seguida, guarde e feche o ficheiro. Esse texto deve estar dentro das <project>...</project> tags no arquivo, por exemplo, entre </dependencies> e </project>.
<build>
<sourceDirectory>src</sourceDirectory>
<resources>
<resource>
<directory>${basedir}/conf</directory>
<filtering>false</filtering>
<includes>
<include>hbase-site.xml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Esta seção configura um recurso (conf/hbase-site.xml) que contém informações de configuração para o HBase.
Nota
Você também pode definir valores de configuração via código. Veja os comentários no CreateTable exemplo.
Esta seção também configura o Apache Maven Compiler Plugin e o Apache Maven Shade Plugin. O plug-in do compilador é usado para compilar a topologia. O plug-in de sombra é usado para evitar a duplicação de licenças no pacote JAR criado pelo Maven. Este plug-in é usado para evitar um erro de "arquivos de licença duplicados" em tempo de execução no cluster HDInsight. Usar maven-shade-plugin com a ApacheLicenseResourceTransformer implementação evita o erro.
O maven-shade-plugin também produz um uber jar que contém todas as dependências exigidas pelo aplicativo.
Faça o download do hbase-site.xml
Use o comando a seguir para copiar a configuração do HBase do cluster HBase para o conf diretório. Substitua CLUSTERNAME pelo nome do cluster HDInsight e digite o comando:
scp sshuser@CLUSTERNAME-ssh.azurehdinsight.net:/etc/hbase/conf/hbase-site.xml ./conf/hbase-site.xml
Criar a aplicação
Implementar uma classe CreateTable
Digite o seguinte comando para criar e abrir um novo arquivo CreateTable.java. Selecione Sim no prompt para criar um novo arquivo.
notepad src\main\java\com\microsoft\examples\CreateTable.java
Em seguida, copie e cole o seguinte código Java no novo arquivo. Em seguida, feche o arquivo.
package com.microsoft.examples;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;
public class CreateTable {
public static void main(String[] args) throws IOException {
Configuration config = HBaseConfiguration.create();
// Example of setting zookeeper values for HDInsight
// in code instead of an hbase-site.xml file
//
// config.set("hbase.zookeeper.quorum",
// "zookeepernode0,zookeepernode1,zookeepernode2");
//config.set("hbase.zookeeper.property.clientPort", "2181");
//config.set("hbase.cluster.distributed", "true");
//
//NOTE: Actual zookeeper host names can be found using Ambari:
//curl -u admin:PASSWORD -G "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME/hosts"
//Linux-based HDInsight clusters use /hbase-unsecure as the znode parent
config.set("zookeeper.znode.parent","/hbase-unsecure");
// create an admin object using the config
HBaseAdmin admin = new HBaseAdmin(config);
// create the table...
HTableDescriptor tableDescriptor = new HTableDescriptor(TableName.valueOf("people"));
// ... with two column families
tableDescriptor.addFamily(new HColumnDescriptor("name"));
tableDescriptor.addFamily(new HColumnDescriptor("contactinfo"));
admin.createTable(tableDescriptor);
// define some people
String[][] people = {
{ "1", "Marcel", "Haddad", "marcel@fabrikam.com"},
{ "2", "Franklin", "Holtz", "franklin@contoso.com" },
{ "3", "Dwayne", "McKee", "dwayne@fabrikam.com" },
{ "4", "Rae", "Schroeder", "rae@contoso.com" },
{ "5", "Rosalie", "burton", "rosalie@fabrikam.com"},
{ "6", "Gabriela", "Ingram", "gabriela@contoso.com"} };
HTable table = new HTable(config, "people");
// Add each person to the table
// Use the `name` column family for the name
// Use the `contactinfo` column family for the email
for (int i = 0; i< people.length; i++) {
Put person = new Put(Bytes.toBytes(people[i][0]));
person.add(Bytes.toBytes("name"), Bytes.toBytes("first"), Bytes.toBytes(people[i][1]));
person.add(Bytes.toBytes("name"), Bytes.toBytes("last"), Bytes.toBytes(people[i][2]));
person.add(Bytes.toBytes("contactinfo"), Bytes.toBytes("email"), Bytes.toBytes(people[i][3]));
table.put(person);
}
// flush commits and close the table
table.flushCommits();
table.close();
}
}
Esse código é a CreateTable classe, que cria uma tabela chamada people e a preenche com alguns usuários predefinidos.
Implementar uma classe SearchByEmail
Digite o seguinte comando para criar e abrir um novo arquivo SearchByEmail.java. Selecione Sim no prompt para criar um novo arquivo.
notepad src\main\java\com\microsoft\examples\SearchByEmail.java
Em seguida, copie e cole o seguinte código Java no novo arquivo. Em seguida, feche o arquivo.
package com.microsoft.examples;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.filter.RegexStringComparator;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.util.GenericOptionsParser;
public class SearchByEmail {
public static void main(String[] args) throws IOException {
Configuration config = HBaseConfiguration.create();
// Use GenericOptionsParser to get only the parameters to the class
// and not all the parameters passed (when using WebHCat for example)
String[] otherArgs = new GenericOptionsParser(config, args).getRemainingArgs();
if (otherArgs.length != 1) {
System.out.println("usage: [regular expression]");
System.exit(-1);
}
// Open the table
HTable table = new HTable(config, "people");
// Define the family and qualifiers to be used
byte[] contactFamily = Bytes.toBytes("contactinfo");
byte[] emailQualifier = Bytes.toBytes("email");
byte[] nameFamily = Bytes.toBytes("name");
byte[] firstNameQualifier = Bytes.toBytes("first");
byte[] lastNameQualifier = Bytes.toBytes("last");
// Create a regex filter
RegexStringComparator emailFilter = new RegexStringComparator(otherArgs[0]);
// Attach the regex filter to a filter
// for the email column
SingleColumnValueFilter filter = new SingleColumnValueFilter(
contactFamily,
emailQualifier,
CompareOp.EQUAL,
emailFilter
);
// Create a scan and set the filter
Scan scan = new Scan();
scan.setFilter(filter);
// Get the results
ResultScanner results = table.getScanner(scan);
// Iterate over results and print values
for (Result result : results ) {
String id = new String(result.getRow());
byte[] firstNameObj = result.getValue(nameFamily, firstNameQualifier);
String firstName = new String(firstNameObj);
byte[] lastNameObj = result.getValue(nameFamily, lastNameQualifier);
String lastName = new String(lastNameObj);
System.out.println(firstName + " " + lastName + " - ID: " + id);
byte[] emailObj = result.getValue(contactFamily, emailQualifier);
String email = new String(emailObj);
System.out.println(firstName + " " + lastName + " - " + email + " - ID: " + id);
}
results.close();
table.close();
}
}
A SearchByEmail classe pode ser usada para consultar linhas por endereço de e-mail. Como ele usa um filtro de expressão regular, você pode fornecer uma cadeia de caracteres ou uma expressão regular ao usar a classe.
Implementar uma classe DeleteTable
Digite o seguinte comando para criar e abrir um novo arquivo DeleteTable.java. Selecione Sim no prompt para criar um novo arquivo.
notepad src\main\java\com\microsoft\examples\DeleteTable.java
Em seguida, copie e cole o seguinte código Java no novo arquivo. Em seguida, feche o arquivo.
package com.microsoft.examples;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HBaseAdmin;
public class DeleteTable {
public static void main(String[] args) throws IOException {
Configuration config = HBaseConfiguration.create();
// Create an admin object using the config
HBaseAdmin admin = new HBaseAdmin(config);
// Disable, and then delete the table
admin.disableTable("people");
admin.deleteTable("people");
}
}
A DeleteTable classe limpa as tabelas do HBase criadas neste exemplo desabilitando e soltando a tabela criada pela CreateTable classe.
Compilar e empacotar o aplicativo
hbaseappNo diretório, use o seguinte comando para criar um arquivo JAR que contenha o aplicativo:mvn clean packageEste comando cria e empacota o aplicativo em um arquivo .jar.
Quando o comando for concluído, o
hbaseapp/targetdiretório conterá um arquivo chamadohbaseapp-1.0-SNAPSHOT.jar.Nota
O arquivo
hbaseapp-1.0-SNAPSHOT.jaré um uber jar. Ele contém todas as dependências necessárias para executar o aplicativo.
Carregue o JAR e execute trabalhos (SSH)
As etapas seguintes usam o scp para copiar o JAR para o nó principal do seu cluster Apache HBase no HDInsight. O ssh comando é então usado para se conectar ao cluster e executar o exemplo diretamente no nó principal.
Carregue o jar para o cluster. Substitua
CLUSTERNAMEpelo nome do cluster HDInsight e digite o seguinte comando:scp ./target/hbaseapp-1.0-SNAPSHOT.jar sshuser@CLUSTERNAME-ssh.azurehdinsight.net:hbaseapp-1.0-SNAPSHOT.jarConecte-se ao cluster HBase. Substitua
CLUSTERNAMEpelo nome do cluster HDInsight e digite o seguinte comando:ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.netPara criar uma tabela HBase usando o aplicativo Java, use o seguinte comando em sua conexão ssh aberta:
yarn jar hbaseapp-1.0-SNAPSHOT.jar com.microsoft.examples.CreateTableEste comando cria uma tabela do HBase chamada people e a preenche com dados.
Para procurar endereços de e-mail armazenados na tabela, use o seguinte comando:
yarn jar hbaseapp-1.0-SNAPSHOT.jar com.microsoft.examples.SearchByEmail contoso.comVocê recebe os seguintes resultados:
Franklin Holtz - ID: 2 Franklin Holtz - franklin@contoso.com - ID: 2 Rae Schroeder - ID: 4 Rae Schroeder - rae@contoso.com - ID: 4 Gabriela Ingram - ID: 6 Gabriela Ingram - gabriela@contoso.com - ID: 6Para excluir a tabela, use o seguinte comando:
yarn jar hbaseapp-1.0-SNAPSHOT.jar com.microsoft.examples.DeleteTable
Carregue o JAR e execute trabalhos (PowerShell)
As etapas a seguir usam o módulo AZ do Azure PowerShell para carregar o JAR no armazenamento padrão do cluster Apache HBase. Os cmdlets do HDInsight são usados para executar os exemplos remotamente.
Depois de instalar e configurar o módulo AZ, crie um arquivo chamado
hbase-runner.psm1. Utilize o seguinte texto como o conteúdo desse ficheiro:<# .SYNOPSIS Copies a file to the primary storage of an HDInsight cluster. .DESCRIPTION Copies a file from a local directory to the blob container for the HDInsight cluster. .EXAMPLE Start-HBaseExample -className "com.microsoft.examples.CreateTable" -clusterName "MyHDInsightCluster" .EXAMPLE Start-HBaseExample -className "com.microsoft.examples.SearchByEmail" -clusterName "MyHDInsightCluster" -emailRegex "contoso.com" .EXAMPLE Start-HBaseExample -className "com.microsoft.examples.SearchByEmail" -clusterName "MyHDInsightCluster" -emailRegex "^r" -showErr #> function Start-HBaseExample { [CmdletBinding(SupportsShouldProcess = $true)] param( #The class to run [Parameter(Mandatory = $true)] [String]$className, #The name of the HDInsight cluster [Parameter(Mandatory = $true)] [String]$clusterName, #Only used when using SearchByEmail [Parameter(Mandatory = $false)] [String]$emailRegex, #Use if you want to see stderr output [Parameter(Mandatory = $false)] [Switch]$showErr ) Set-StrictMode -Version 3 # Is the Azure module installed? FindAzure # Get the login for the HDInsight cluster $creds=Get-Credential -Message "Enter the login for the cluster" -UserName "admin" # The JAR $jarFile = "wasb:///example/jars/hbaseapp-1.0-SNAPSHOT.jar" # The job definition $jobDefinition = New-AzHDInsightMapReduceJobDefinition ` -JarFile $jarFile ` -ClassName $className ` -Arguments $emailRegex # Get the job output $job = Start-AzHDInsightJob ` -ClusterName $clusterName ` -JobDefinition $jobDefinition ` -HttpCredential $creds Write-Host "Wait for the job to complete ..." -ForegroundColor Green Wait-AzHDInsightJob ` -ClusterName $clusterName ` -JobId $job.JobId ` -HttpCredential $creds if($showErr) { Write-Host "STDERR" Get-AzHDInsightJobOutput ` -Clustername $clusterName ` -JobId $job.JobId ` -HttpCredential $creds ` -DisplayOutputType StandardError } Write-Host "Display the standard output ..." -ForegroundColor Green Get-AzHDInsightJobOutput ` -Clustername $clusterName ` -JobId $job.JobId ` -HttpCredential $creds } <# .SYNOPSIS Copies a file to the primary storage of an HDInsight cluster. .DESCRIPTION Copies a file from a local directory to the blob container for the HDInsight cluster. .EXAMPLE Add-HDInsightFile -localPath "C:\temp\data.txt" -destinationPath "example/data/data.txt" -ClusterName "MyHDInsightCluster" .EXAMPLE Add-HDInsightFile -localPath "C:\temp\data.txt" -destinationPath "example/data/data.txt" -ClusterName "MyHDInsightCluster" -Container "MyContainer" #> function Add-HDInsightFile { [CmdletBinding(SupportsShouldProcess = $true)] param( #The path to the local file. [Parameter(Mandatory = $true)] [String]$localPath, #The destination path and file name, relative to the root of the container. [Parameter(Mandatory = $true)] [String]$destinationPath, #The name of the HDInsight cluster [Parameter(Mandatory = $true)] [String]$clusterName, #If specified, overwrites existing files without prompting [Parameter(Mandatory = $false)] [Switch]$force ) Set-StrictMode -Version 3 # Is the Azure module installed? FindAzure # Get authentication for the cluster $creds=Get-Credential # Does the local path exist? if (-not (Test-Path $localPath)) { throw "Source path '$localPath' does not exist." } # Get the primary storage container $storage = GetStorage -clusterName $clusterName # Upload file to storage, overwriting existing files if -force was used. Set-AzStorageBlobContent -File $localPath ` -Blob $destinationPath ` -force:$force ` -Container $storage.container ` -Context $storage.context } function FindAzure { # Is there an active Azure subscription? $sub = Get-AzSubscription -ErrorAction SilentlyContinue if(-not($sub)) { Connect-AzAccount } } function GetStorage { param( [Parameter(Mandatory = $true)] [String]$clusterName ) $hdi = Get-AzHDInsightCluster -ClusterName $clusterName # Does the cluster exist? if (!$hdi) { throw "HDInsight cluster '$clusterName' does not exist." } # Create a return object for context & container $return = @{} $storageAccounts = @{} # Get storage information $resourceGroup = $hdi.ResourceGroup $storageAccountName=$hdi.DefaultStorageAccount.split('.')[0] $container=$hdi.DefaultStorageContainer $storageAccountKey=(Get-AzStorageAccountKey ` -Name $storageAccountName ` -ResourceGroupName $resourceGroup)[0].Value # Get the resource group, in case we need that $return.resourceGroup = $resourceGroup # Get the storage context, as we can't depend # on using the default storage context $return.context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey # Get the container, so we know where to # find/store blobs $return.container = $container # Return storage accounts to support finding all accounts for # a cluster $return.storageAccount = $storageAccountName $return.storageAccountKey = $storageAccountKey return $return } # Only export the verb-phrase things export-modulemember *-*Este ficheiro contém dois módulos:
- Add-HDInsightFile - usado para carregar arquivos para o cluster
- Start-HBaseExample - usado para executar as classes criadas anteriormente
Guarde o ficheiro
hbase-runner.psm1no diretóriohbaseapp.Registre os módulos com o Azure PowerShell. Abra uma nova janela do Azure PowerShell e edite o comando a seguir substituindo
CLUSTERNAMEpelo nome do cluster. Em seguida, digite os seguintes comandos:cd C:\HDI\hbaseapp $myCluster = "CLUSTERNAME" Import-Module .\hbase-runner.psm1Use o seguinte comando para carregar o
hbaseapp-1.0-SNAPSHOT.jarpara o seu cluster.Add-HDInsightFile -localPath target\hbaseapp-1.0-SNAPSHOT.jar -destinationPath example/jars/hbaseapp-1.0-SNAPSHOT.jar -clusterName $myClusterQuando solicitado, digite o nome e a senha de login (admin) do cluster. O comando carrega o
hbaseapp-1.0-SNAPSHOT.jarna localizaçãoexample/jarsno armazenamento principal do cluster.Para criar uma tabela usando o
hbaseapp, use o seguinte comando:Start-HBaseExample -className com.microsoft.examples.CreateTable -clusterName $myClusterQuando solicitado, digite o nome e a senha de login (admin) do cluster.
Este comando cria uma tabela chamada pessoas no HBase no cluster HDInsight. Este comando não mostra nenhuma saída na janela do console.
Para procurar entradas na tabela, utilize o seguinte comando:
Start-HBaseExample -className com.microsoft.examples.SearchByEmail -clusterName $myCluster -emailRegex contoso.comQuando solicitado, digite o nome e a senha de login (admin) do cluster.
Este comando usa a
SearchByEmailclasse para procurar quaisquer linhas onde a família decontactinformationcolunas e aemailcoluna contenham a cadeia de caracterescontoso.com. Deverá receber os seguintes resultados:Franklin Holtz - ID: 2 Franklin Holtz - franklin@contoso.com - ID: 2 Rae Schroeder - ID: 4 Rae Schroeder - rae@contoso.com - ID: 4 Gabriela Ingram - ID: 6 Gabriela Ingram - gabriela@contoso.com - ID: 6Usar fabrikam.com para o valor
-emailRegexretorna os utilizadores que têm fabrikam.com no campo de e-mail. Você também pode usar expressões regulares como o termo de pesquisa. Por exemplo, ^r retorna endereços de e-mail que começam com a letra 'r'.Para excluir a tabela, use o seguinte comando:
Start-HBaseExample -className com.microsoft.examples.DeleteTable -clusterName $myCluster
Nenhum resultado ou resultados inesperados ao usar Start-HBaseExample
Use o -showErr parâmetro para exibir o erro padrão (STDERR) produzido durante a execução do trabalho.