Skapa Java-program för Apache HBase
Lär dig hur du skapar ett Apache HBase-program i Java. Använd sedan programmet med HBase i Azure HDInsight.
Stegen i det här dokumentet använder Apache Maven för att skapa och skapa projektet. Maven är ett verktyg för projekthantering och förståelse för programvara som gör att du kan skapa programvara, dokumentation och rapporter för Java-projekt.
Förutsättningar
Ett Apache HBase-kluster i HDInsight. Se Kom igång med Apache HBase.
Apache Maven har installerats korrekt enligt Apache. Maven är ett projektbyggsystem för Java-projekt.
En SSH-klient. Mer information finns i Ansluta till HDInsight (Apache Hadoop) med hjälp av SSH.
Om du använder PowerShell behöver du AZ-modulen.
En textredigerare. Den här artikeln använder Microsoft Notepad.
Testmiljö
Miljön som används för den här artikeln var en dator som kör Windows 10. Kommandona kördes i en kommandotolk och de olika filerna redigerades med Anteckningar. Ändra i enlighet med detta för din miljö.
Från en kommandotolk anger du följande kommandon för att skapa en arbetsmiljö:
IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI
Skapa ett Maven-projekt
Ange följande kommando för att skapa ett Maven-projekt med namnet hbaseapp:
mvn archetype:generate -DgroupId=com.microsoft.examples -DartifactId=hbaseapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false cd hbaseapp mkdir conf
Det här kommandot skapar en katalog med namnet
hbaseapp
på den aktuella platsen, som innehåller ett grundläggande Maven-projekt. Det andra kommandot ändrar arbetskatalogen tillhbaseapp
. Det tredje kommandot skapar en ny katalog,conf
, som kan användas senare. Katalogenhbaseapp
innehåller följande objekt:pom.xml
: Projektobjektmodellen (POM) innehåller information och konfigurationsinformation som används för att skapa projektet.src\main\java\com\microsoft\examples
: Innehåller programkoden.src\test\java\com\microsoft\examples
: Innehåller tester för ditt program.
Ta bort den genererade exempelkoden. Ta bort de genererade test- och programfilerna
AppTest.java
ochApp.java
genom att ange följande kommandon:DEL src\main\java\com\microsoft\examples\App.java DEL src\test\java\com\microsoft\examples\AppTest.java
Uppdatera projektobjektmodellen
En fullständig referens för filen pom.xml finns i https://maven.apache.org/pom.html. Öppna pom.xml
genom att ange följande kommando:
notepad pom.xml
Lägga till beroenden
I pom.xml
lägger du till följande text i avsnittet <dependencies>
:
<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>
Det här avsnittet anger att projektet behöver komponenterna hbase-client och phoenix-core . Vid kompileringstillfället laddas dessa beroenden ned från maven-standardlagringsplatsen. Du kan använda Maven Central Repository Search för att lära dig mer om det här beroendet.
Viktigt!
Versionsnumret för hbase-klienten måste matcha den version av Apache HBase som tillhandahålls med ditt HDInsight-kluster. Använd följande tabell för att hitta rätt versionsnummer.
HDInsight-klusterversion | Apache HBase-version att använda |
---|---|
3,6 | 1.1.2 |
4.0 | 2.0.0 |
Mer information om HDInsight-versioner och -komponenter finns i Vad är de olika Apache Hadoop-komponenterna som är tillgängliga med HDInsight.
Skapa konfiguration
Med Maven-plugin-program kan du anpassa byggfaserna i projektet. Det här avsnittet används för att lägga till plugin-program, resurser och andra konfigurationsalternativ för bygge.
Lägg till följande kod i pom.xml
filen och spara och stäng sedan filen. Den här texten måste finnas i taggarna <project>...</project>
i filen, till exempel mellan </dependencies>
och </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>
Det här avsnittet konfigurerar en resurs (conf/hbase-site.xml
) som innehåller konfigurationsinformation för HBase.
Kommentar
Du kan också ange konfigurationsvärden via kod. Se kommentarerna i exemplet CreateTable
.
Det här avsnittet konfigurerar även Plugin-programmet Apache Maven Compiler och Plugin-programmet Apache Maven Shade. Plugin-programmet för kompileraren används för att kompilera topologin. Plugin-programmet shade används för att förhindra licensduplicering i JAR-paketet som har skapats av Maven. Det här plugin-programmet används för att förhindra felet "duplicerade licensfiler" vid körning i HDInsight-klustret. Om du använder maven-shade-plugin med implementeringen ApacheLicenseResourceTransformer
förhindras felet.
Plugin-programmet maven-shade-ger också en uber-jar som innehåller alla beroenden som krävs av programmet.
Ladda ned hbase-site.xml
Använd följande kommando för att kopiera HBase-konfigurationen från HBase-klustret till conf
katalogen. Ersätt CLUSTERNAME
med ditt HDInsight-klusternamn och ange sedan kommandot:
scp sshuser@CLUSTERNAME-ssh.azurehdinsight.net:/etc/hbase/conf/hbase-site.xml ./conf/hbase-site.xml
Skapa programmet
Implementera en CreateTable-klass
Ange följande kommando för att skapa och öppna en ny fil CreateTable.java
. Välj Ja i kommandotolken för att skapa en ny fil.
notepad src\main\java\com\microsoft\examples\CreateTable.java
Kopiera och klistra sedan in följande Java-kod i den nya filen. Stäng sedan filen.
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();
}
}
Den här koden är CreateTable
klassen som skapar en tabell med namnet people
och fyller den med vissa fördefinierade användare.
Implementera en SearchByEmail-klass
Ange följande kommando för att skapa och öppna en ny fil SearchByEmail.java
. Välj Ja i kommandotolken för att skapa en ny fil.
notepad src\main\java\com\microsoft\examples\SearchByEmail.java
Kopiera och klistra sedan in följande Java-kod i den nya filen. Stäng sedan filen.
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();
}
}
Klassen SearchByEmail
kan användas för att fråga efter rader via e-postadress. Eftersom det använder ett filter för reguljära uttryck kan du ange antingen en sträng eller ett reguljärt uttryck när du använder klassen.
Implementera en DeleteTable-klass
Ange följande kommando för att skapa och öppna en ny fil DeleteTable.java
. Välj Ja i kommandotolken för att skapa en ny fil.
notepad src\main\java\com\microsoft\examples\DeleteTable.java
Kopiera och klistra sedan in följande Java-kod i den nya filen. Stäng sedan filen.
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");
}
}
Klassen DeleteTable
rensar upp de HBase-tabeller som skapats i det här exemplet genom att inaktivera och släppa tabellen som skapats av CreateTable
klassen.
Skapa och paketera programmet
Från katalogen
hbaseapp
använder du följande kommando för att skapa en JAR-fil som innehåller programmet:mvn clean package
Det här kommandot skapar och paketar programmet i en .jar fil.
När kommandot har slutförts
hbaseapp/target
innehåller katalogen en fil med namnethbaseapp-1.0-SNAPSHOT.jar
.Kommentar
Filen
hbaseapp-1.0-SNAPSHOT.jar
är en uber-jar. Den innehåller alla beroenden som krävs för att köra programmet.
Ladda upp JAR och kör jobb (SSH)
Följande steg använder scp
för att kopiera JAR-filen till den primära huvudnoden i Apache HBase i HDInsight-klustret. Kommandot ssh
används sedan för att ansluta till klustret och köra exemplet direkt på huvudnoden.
Ladda upp jar-filen till klustret. Ersätt
CLUSTERNAME
med ditt HDInsight-klusternamn och ange sedan följande kommando:scp ./target/hbaseapp-1.0-SNAPSHOT.jar sshuser@CLUSTERNAME-ssh.azurehdinsight.net:hbaseapp-1.0-SNAPSHOT.jar
Anslut till HBase-klustret. Ersätt
CLUSTERNAME
med ditt HDInsight-klusternamn och ange sedan följande kommando:ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
Om du vill skapa en HBase-tabell med Java-programmet använder du följande kommando i din öppna ssh-anslutning:
yarn jar hbaseapp-1.0-SNAPSHOT.jar com.microsoft.examples.CreateTable
Det här kommandot skapar en HBase-tabell med namnet people och fyller den med data.
Om du vill söka efter e-postadresser som lagras i tabellen använder du följande kommando:
yarn jar hbaseapp-1.0-SNAPSHOT.jar com.microsoft.examples.SearchByEmail contoso.com
Du får följande resultat:
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
Om du vill ta bort tabellen använder du följande kommando:
yarn jar hbaseapp-1.0-SNAPSHOT.jar com.microsoft.examples.DeleteTable
Ladda upp JAR och kör jobb (PowerShell)
Följande steg använder Azure PowerShell AZ-modulen för att ladda upp JAR-filen till standardlagringen för ditt Apache HBase-kluster. HDInsight-cmdletar används sedan för att fjärrköra exemplen.
När du har installerat och konfigurerat AZ-modulen skapar du en fil med namnet
hbase-runner.psm1
. Använd följande text som filens innehåll:<# .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 *-*
Den här filen innehåller två moduler:
- Add-HDInsightFile – används för att ladda upp filer till klustret
- Start-HBaseExample – används för att köra de klasser som skapades tidigare
hbase-runner.psm1
Spara filen ihbaseapp
katalogen.Registrera modulerna med Azure PowerShell. Öppna ett nytt Azure PowerShell-fönster och redigera följande kommando genom att
CLUSTERNAME
ersätta med namnet på klustret. Ange sedan följande kommandon:cd C:\HDI\hbaseapp $myCluster = "CLUSTERNAME" Import-Module .\hbase-runner.psm1
Använd följande kommando för att ladda upp
hbaseapp-1.0-SNAPSHOT.jar
till klustret.Add-HDInsightFile -localPath target\hbaseapp-1.0-SNAPSHOT.jar -destinationPath example/jars/hbaseapp-1.0-SNAPSHOT.jar -clusterName $myCluster
När du uppmanas till det anger du namnet och lösenordet för klusterinloggning (administratör). Kommandot laddar upp
hbaseapp-1.0-SNAPSHOT.jar
till platsenexample/jars
i det primära lagringsutrymmet för klustret.Om du vill skapa en tabell med hjälp av
hbaseapp
använder du följande kommando:Start-HBaseExample -className com.microsoft.examples.CreateTable -clusterName $myCluster
När du uppmanas till det anger du namnet och lösenordet för klusterinloggning (administratör).
Det här kommandot skapar en tabell med namnet people i HBase i ditt HDInsight-kluster. Det här kommandot visar inga utdata i konsolfönstret.
Om du vill söka efter poster i tabellen använder du följande kommando:
Start-HBaseExample -className com.microsoft.examples.SearchByEmail -clusterName $myCluster -emailRegex contoso.com
När du uppmanas till det anger du namnet och lösenordet för klusterinloggning (administratör).
Det här kommandot använder
SearchByEmail
klassen för att söka efter rader där kolumnfamiljencontactinformation
email
och kolumnen innehåller strängencontoso.com
. Du bör få följande resultat: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
Om du använder fabrikam.com för
-emailRegex
värdet returneras de användare som har fabrikam.com i e-postfältet. Du kan också använda reguljära uttryck som sökord. Till exempel returnerar ^r e-postadresser som börjar med bokstaven "r".Om du vill ta bort tabellen använder du följande kommando:
Start-HBaseExample -className com.microsoft.examples.DeleteTable -clusterName $myCluster
Inga resultat eller oväntade resultat när du använder Start-HBaseExample
Använd parametern -showErr
för att visa standardfelet (STDERR) som skapas när jobbet körs.