Vytváření aplikací v Javě pro Apache HBase
Zjistěte, jak vytvořit aplikaci Apache HBase v Javě. Pak použijte aplikaci s HBase ve službě Azure HDInsight.
Kroky v tomto dokumentu používají Apache Maven k vytvoření a sestavení projektu. Maven je softwarový nástroj pro řízení projektů a porozumění, který umožňuje vytvářet software, dokumentaci a sestavy pro projekty Java.
Cluster Apache HBase ve službě HDInsight. Viz Začínáme s Apache HBase.
Apache Maven je správně nainstalovaný podle Apache. Maven je systém sestavení projektu pro projekty Java.
Klient SSH. Další informace najdete v tématu Připojení ke službě HDInsight (Apache Hadoop) pomocí SSH.
Pokud používáte PowerShell, potřebujete modul AZ.
Textový editor Tento článek používá Microsoft Notepad.
Prostředí použité pro tento článek bylo počítač s Windows 10. Příkazy se spustily na příkazovém řádku a různé soubory byly upraveny pomocí Poznámkového bloku. Odpovídajícím způsobem upravte své prostředí.
Z příkazového řádku zadejte následující příkazy pro vytvoření pracovního prostředí:
IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI
Zadáním následujícího příkazu vytvořte projekt Maven s názvem hbaseapp:
mvn archetype:generate -DgroupId=com.microsoft.examples -DartifactId=hbaseapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false cd hbaseapp mkdir conf
Tento příkaz vytvoří adresář pojmenovaný
hbaseapp
v aktuálním umístění, který obsahuje základní projekt Maven. Druhý příkaz změní pracovní adresář nahbaseapp
. Třetí příkaz vytvoří nový adresář,conf
který lze použít později. Adresářhbaseapp
obsahuje následující položky:pom.xml
: Objektový model projektu (POM) obsahuje informace a podrobnosti konfigurace používané k sestavení projektu.src\main\java\com\microsoft\examples
: Obsahuje kód aplikace.src\test\java\com\microsoft\examples
: Obsahuje testy pro vaši aplikaci.
Odeberte vygenerovaný ukázkový kód. Odstraňte vygenerované soubory
AppTest.java
testů a aplikací aApp.java
zadáním následujících příkazů:DEL src\main\java\com\microsoft\examples\App.java DEL src\test\java\com\microsoft\examples\AppTest.java
Úplný odkaz na soubor pom.xml naleznete v tématu https://maven.apache.org/pom.html. Otevřete pom.xml
zadáním následujícího příkazu:
notepad pom.xml
Do pom.xml
oddílu <dependencies>
přidejte následující text:
<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>
Tato část označuje, že projekt potřebuje komponenty hbase-client a phoenix-core . V době kompilace se tyto závislosti stáhnou z výchozího úložiště Maven. Další informace o této závislosti najdete v centrálním úložišti Maven.
Důležité
Číslo verze klienta hbase-client musí odpovídat verzi Apache HBase, která je k dispozici s vaším clusterem HDInsight. Pomocí následující tabulky vyhledejte správné číslo verze.
Verze clusteru HDInsight | Verze Apache HBase, která se má použít |
---|---|
3,6 | 1.1.2 |
4.0 | 2.0.0 |
Další informace o verzích a komponentách HDInsight najdete v tématu Jaké jsou různé komponenty Apache Hadoop dostupné v HDInsight.
Moduly plug-in Maven umožňují přizpůsobit fáze sestavení projektu. Tato část slouží k přidání modulů plug-in, prostředků a dalších možností konfigurace sestavení.
Do souboru přidejte následující kód pom.xml
a pak soubor uložte a zavřete. Tento text musí být uvnitř <project>...</project>
značek v souboru, například mezi </dependencies>
a </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>
Tato část nakonfiguruje prostředek (conf/hbase-site.xml
), který obsahuje informace o konfiguraci HBase.
Poznámka
Hodnoty konfigurace můžete také nastavit prostřednictvím kódu. Podívejte se na komentáře v příkladu CreateTable
.
Tato část také konfiguruje modul plug-in kompilátoru Apache Maven a modul plug-in apache Maven shade. Modul plug-in kompilátoru slouží ke kompilaci topologie. Modul plug-in shade slouží k zabránění duplikování licencí v balíčku JAR vytvořeném mavenem. Tento modul plug-in slouží k zabránění chybě duplicitních licenčních souborů za běhu v clusteru HDInsight. Použití modulu plug-in maven-shade-plugin s ApacheLicenseResourceTransformer
implementací zabraňuje chybě.
Modul plug-in maven-shade také vytvoří soubor uber jar, který obsahuje všechny závislosti vyžadované aplikací.
Pomocí následujícího příkazu zkopírujte konfiguraci HBase z clusteru HBase do conf
adresáře. Nahraďte CLUSTERNAME
názvem clusteru HDInsight a zadejte příkaz:
scp sshuser@CLUSTERNAME-ssh.azurehdinsight.net:/etc/hbase/conf/hbase-site.xml ./conf/hbase-site.xml
Zadáním následujícího příkazu vytvořte a otevřete nový soubor CreateTable.java
. Výběrem možnosti Ano na příkazovém řádku vytvořte nový soubor.
notepad src\main\java\com\microsoft\examples\CreateTable.java
Potom do nového souboru zkopírujte a vložte následující kód Java. Potom soubor zavřete.
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();
}
}
Tento kód je CreateTable
třída, která vytvoří tabulku s názvem people
a naplní ji některými předdefinovanými uživateli.
Zadáním následujícího příkazu vytvořte a otevřete nový soubor SearchByEmail.java
. Výběrem možnosti Ano na příkazovém řádku vytvořte nový soubor.
notepad src\main\java\com\microsoft\examples\SearchByEmail.java
Potom do nového souboru zkopírujte a vložte následující kód Java. Potom soubor zavřete.
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();
}
}
Třídu SearchByEmail
lze použít k dotazování na řádky podle e-mailové adresy. Protože používá filtr regulárního výrazu, můžete při použití třídy zadat řetězec nebo regulární výraz.
Zadáním následujícího příkazu vytvořte a otevřete nový soubor DeleteTable.java
. Výběrem možnosti Ano na příkazovém řádku vytvořte nový soubor.
notepad src\main\java\com\microsoft\examples\DeleteTable.java
Potom do nového souboru zkopírujte a vložte následující kód Java. Potom soubor zavřete.
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");
}
}
Třída DeleteTable
vyčistí tabulky HBase vytvořené v tomto příkladu zakázáním a vyřazením tabulky vytvořené CreateTable
třídou.
hbaseapp
Z adresáře pomocí následujícího příkazu sestavte soubor JAR, který obsahuje aplikaci:mvn clean package
Tento příkaz sestaví a zabalí aplikaci do souboru .jar.
Po dokončení
hbaseapp/target
příkazu obsahuje adresář soubor s názvemhbaseapp-1.0-SNAPSHOT.jar
.Poznámka
Soubor
hbaseapp-1.0-SNAPSHOT.jar
je uber jar. Obsahuje všechny závislosti potřebné ke spuštění aplikace.
Následující postup slouží scp
ke zkopírování souboru JAR do primárního hlavního uzlu Apache HBase v clusteru HDInsight. Příkaz ssh
se pak použije k připojení ke clusteru a spuštění příkladu přímo na hlavním uzlu.
Nahrajte soubor JAR do clusteru. Nahraďte
CLUSTERNAME
názvem clusteru HDInsight a zadejte následující příkaz:scp ./target/hbaseapp-1.0-SNAPSHOT.jar sshuser@CLUSTERNAME-ssh.azurehdinsight.net:hbaseapp-1.0-SNAPSHOT.jar
Připojte se ke clusteru HBase. Nahraďte
CLUSTERNAME
názvem clusteru HDInsight a zadejte následující příkaz:ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
Pokud chcete vytvořit tabulku HBase pomocí aplikace v Javě, použijte v otevřeném připojení ssh následující příkaz:
yarn jar hbaseapp-1.0-SNAPSHOT.jar com.microsoft.examples.CreateTable
Tento příkaz vytvoří tabulku HBase s názvem lidé a naplní ji daty.
Pokud chcete vyhledat e-mailové adresy uložené v tabulce, použijte následující příkaz:
yarn jar hbaseapp-1.0-SNAPSHOT.jar com.microsoft.examples.SearchByEmail contoso.com
Zobrazí se následující výsledky:
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: 6
Pokud chcete tabulku odstranit, použijte následující příkaz:
yarn jar hbaseapp-1.0-SNAPSHOT.jar com.microsoft.examples.DeleteTable
Následující kroky používají modul AZ Azure PowerShellu k nahrání souboru JAR do výchozího úložiště clusteru Apache HBase. Rutiny HDInsight se pak používají ke vzdálenému spuštění příkladů.
Po instalaci a konfiguraci modulu AZ vytvořte soubor s názvem
hbase-runner.psm1
. Jako obsah souboru použijte následující text:<# .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 *-*
Tento soubor obsahuje dva moduly:
- Add-HDInsightFile – slouží k nahrání souborů do clusteru
- Start-HBaseExample – používá se ke spuštění dříve vytvořených tříd.
hbase-runner.psm1
Uložte soubor dohbaseapp
adresáře.Zaregistrujte moduly v Azure PowerShellu. Otevřete nové okno Azure PowerShellu a upravte následující příkaz nahrazením
CLUSTERNAME
názvu clusteru. Pak zadejte následující příkazy:cd C:\HDI\hbaseapp $myCluster = "CLUSTERNAME" Import-Module .\hbase-runner.psm1
K nahrání clusteru
hbaseapp-1.0-SNAPSHOT.jar
použijte následující příkaz.Add-HDInsightFile -localPath target\hbaseapp-1.0-SNAPSHOT.jar -destinationPath example/jars/hbaseapp-1.0-SNAPSHOT.jar -clusterName $myCluster
Po zobrazení výzvy zadejte přihlašovací jméno a heslo clusteru. Příkaz nahraje
hbaseapp-1.0-SNAPSHOT.jar
doexample/jars
umístění v primárním úložišti clusteru.Pokud chcete vytvořit tabulku pomocí
hbaseapp
příkazu , použijte následující příkaz:Start-HBaseExample -className com.microsoft.examples.CreateTable -clusterName $myCluster
Po zobrazení výzvy zadejte přihlašovací jméno a heslo clusteru.
Tento příkaz vytvoří v clusteru HDInsight tabulku s názvem lidé v HBase. Tento příkaz nezobrazuje žádný výstup v okně konzoly.
Pokud chcete vyhledat položky v tabulce, použijte následující příkaz:
Start-HBaseExample -className com.microsoft.examples.SearchByEmail -clusterName $myCluster -emailRegex contoso.com
Po zobrazení výzvy zadejte přihlašovací jméno a heslo clusteru.
Tento příkaz používá
SearchByEmail
třídu k vyhledání všech řádků, ve kterýchcontactinformation
je rodina sloupců aemail
sloupec, obsahuje řetězeccontoso.com
. Měli byste obdržet následující výsledky: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: 6
Použití fabrikam.com pro
-emailRegex
hodnotu vrátí uživatele, kteří mají v poli e-mailu fabrikam.com . Regulární výrazy můžete použít také jako hledaný termín. Například ^r vrátí e-mailové adresy, které začínají písmenem "r".Pokud chcete tabulku odstranit, použijte následující příkaz:
Start-HBaseExample -className com.microsoft.examples.DeleteTable -clusterName $myCluster
Pomocí parametru -showErr
můžete zobrazit standardní chybu (STDERR), která se vytvoří při spuštění úlohy.