Apache Phoenix in Azure HDInsight
Apache Phoenix is een open source, zeer parallelle relationele databaselaag die is gebouwd op Apache HBase. Met Phoenix kunt u SQL-achtige query's gebruiken via HBase. Phoenix maakt gebruik van onderliggende JDBC-stuurprogramma's om gebruikers in staat te stellen om SQL-tabellen, indexen, weergaven en reeksen afzonderlijk en bulksgewijs te maken, te verwijderen, te wijzigen. Phoenix maakt gebruik van noSQL native compilatie in plaats van MapReduce te gebruiken om query's te compileren, waardoor toepassingen met lage latentie kunnen worden gemaakt boven op HBase. Phoenix voegt coprocessors toe ter ondersteuning van door de client geleverde code in de adresruimte van de server, waarbij de code wordt uitgevoerd die is gekoppeld aan de gegevens. Deze aanpak minimaliseert de overdracht van client-/servergegevens.
Apache Phoenix opent big data-query's voor niet-ontwikkelaars die een SQL-achtige syntaxis kunnen gebruiken in plaats van programmeren. Phoenix is sterk geoptimaliseerd voor HBase, in tegenstelling tot andere hulpprogramma's zoals Apache Hive en Apache Spark SQL. Het voordeel van ontwikkelaars is het schrijven van zeer goed presterende query's met veel minder code.
Wanneer u een SQL-query verzendt, compileert Phoenix de query naar systeemeigen HBase-aanroepen en voert u de scan (of het plan) parallel uit voor optimalisatie. Deze abstractielaag zorgt ervoor dat de ontwikkelaar geen MapReduce-taken schrijft om zich te richten op de bedrijfslogica en de werkstroom van hun toepassing rond de big data-opslag van Phoenix.
Optimalisatie van queryprestaties en andere functies
Apache Phoenix voegt verschillende prestatieverbeteringen en -functies toe aan HBase-query's.
Secundaire indexen
HBase heeft één index die lexicografisch is gesorteerd op de primaire rijsleutel. Deze records kunnen alleen worden geopend via de rijsleutel. Als u records wilt openen via een andere kolom dan de rijsleutel, moet u alle gegevens scannen tijdens het toepassen van het vereiste filter. In een secundaire index worden de kolommen of expressies die zijn geïndexeerd vanuit een alternatieve rijsleutel, waardoor zoekopdrachten en bereikscans op die index worden toegestaan.
Maak een secundaire index met de CREATE INDEX
opdracht:
CREATE INDEX ix_purchasetype on SALTEDWEBLOGS (purchasetype, transactiondate) INCLUDE (bookname, quantity);
Deze aanpak kan een aanzienlijke prestatieverhoging opleveren ten opzichte van het uitvoeren van query's met één index. Dit type secundaire index is een index die alle kolommen bevat die in de query zijn opgenomen. Daarom is het opzoeken van tabellen niet vereist en voldoet de index aan de hele query.
Weergaven
Phoenix-weergaven bieden een manier om een HBase-beperking te overwinnen, waarbij de prestaties afnemen wanneer u meer dan ongeveer 100 fysieke tabellen maakt. Met Phoenix-weergaven kunnen meerdere virtuele tabellen één onderliggende fysieke HBase-tabel delen.
Het maken van een Phoenix-weergave is vergelijkbaar met het gebruik van de standaard-SQL-weergavesyntaxis. Een verschil is dat u kolommen voor uw weergave kunt definiëren, naast de kolommen die zijn overgenomen van de basistabel. U kunt ook nieuwe KeyValue
kolommen toevoegen.
Hier volgt bijvoorbeeld een fysieke tabel met de naam product_metrics
met de volgende definitie:
CREATE TABLE product_metrics (
metric_type CHAR(1) NOT NULL,
created_by VARCHAR,
created_date DATE NOT NULL,
metric_id INTEGER NOT NULL
CONSTRAINT pk PRIMARY KEY (metric_type, created_by, created_date, metric_id));
Definieer een weergave over deze tabel, met meer kolommen:
CREATE VIEW mobile_product_metrics (carrier VARCHAR, dropped_calls BIGINT) AS
SELECT * FROM product_metrics
WHERE metric_type = 'm';
Als u later meer kolommen wilt toevoegen, gebruikt u de ALTER VIEW
instructie.
Scan overslaan
Bij het overslaan van scan worden een of meer kolommen van een samengestelde index gebruikt om afzonderlijke waarden te vinden. In tegenstelling tot een bereikscan implementeert skip scan intra-row scan, wat resulteert in verbeterde prestaties. Wanneer u scant, wordt de eerste overeenkomende waarde samen met de index overgeslagen totdat de volgende waarde wordt gevonden.
Een skipscan maakt gebruik van de SEEK_NEXT_USING_HINT
opsomming van het HBase-filter. Met behulp SEEK_NEXT_USING_HINT
van de scan voor overslaan wordt bijgehouden naar welke set sleutels, of bereiken met sleutels, in elke kolom wordt gezocht. Tijdens de filterevaluatie wordt vervolgens een sleutel gebruikt die aan de scan is doorgegeven en wordt bepaald of deze een van de combinaties is. Als dat niet zo is, evalueert de scan de volgende hoogste sleutel om naar te gaan.
Transacties
Hoewel HBase transacties op rijniveau biedt, integreert Phoenix met Tephra om ondersteuning voor cross-row- en cross-table-transacties toe te voegen met volledige ACID-semantiek .
Net als bij traditionele SQL-transacties kunt u met transacties die worden geleverd via de Phoenix-transactiebeheerder ervoor zorgen dat een atomische gegevenseenheid wordt geupert, waardoor de transactie wordt teruggedraaid als de upserted-bewerking mislukt op een tabel met transacties.
Raadpleeg de documentatie voor Apache Phoenix-transacties om Phoenix-transacties in te schakelen.
Als u een nieuwe tabel wilt maken waarvoor transacties zijn ingeschakeld, stelt u de TRANSACTIONAL
eigenschap true
in op in een CREATE
instructie:
CREATE TABLE my_table (k BIGINT PRIMARY KEY, v VARCHAR) TRANSACTIONAL=true;
Als u een bestaande tabel wilt wijzigen in transactioneel, gebruikt u dezelfde eigenschap in een ALTER
instructie:
ALTER TABLE my_other_table SET TRANSACTIONAL=true;
Notitie
U kunt geen transactionele tabel terugzetten naar niet-transactioneel.
Gezouten tabellen
Hotspotting van regioservers kan optreden bij het schrijven van records met sequentiële sleutels naar HBase. Hoewel u mogelijk meerdere regioservers in uw cluster hebt, worden uw schrijfbewerkingen allemaal uitgevoerd op slechts één. Deze concentratie veroorzaakt het hotspotprobleem waarbij, in plaats van uw schrijfworkload wordt gedistribueerd over alle beschikbare regioservers, slechts één de belasting verwerkt. Aangezien elke regio een vooraf gedefinieerde maximale grootte heeft, wordt deze gesplitst in twee kleine regio's wanneer een regio deze groottelimiet bereikt. Als dat gebeurt, neemt een van deze nieuwe regio's alle nieuwe records mee, waardoor deze de nieuwe hotspot wordt.
Om dit probleem te verhelpen en betere prestaties te bereiken, splitst u tabellen vooraf, zodat alle regioservers gelijk worden gebruikt. Phoenix biedt gezouten tabellen, waardoor de salting-byte transparant aan de rijsleutel voor een bepaalde tabel wordt toegevoegd. De tabel wordt vooraf gesplitst op de zout bytegrenzen om gelijke belastingverdeling tussen regioservers te garanderen tijdens de eerste fase van de tabel. Met deze aanpak wordt de schrijfworkload verdeeld over alle beschikbare regioservers, waardoor de schrijf- en leesprestaties worden verbeterd. Als u een tabel wilt zouten, geeft u de SALT_BUCKETS
tabeleigenschap op wanneer de tabel wordt gemaakt:
CREATE TABLE Saltedweblogs (
transactionid varchar(500) Primary Key,
transactiondate Date NULL,
customerid varchar(50) NULL,
bookid varchar(50) NULL,
purchasetype varchar(50) NULL,
orderid varchar(50) NULL,
bookname varchar(50) NULL,
categoryname varchar(50) NULL,
invoicenumber varchar(50) NULL,
invoicestatus varchar(50) NULL,
city varchar(50) NULL,
state varchar(50) NULL,
paymentamount DOUBLE NULL,
quantity INTEGER NULL,
shippingamount DOUBLE NULL) SALT_BUCKETS=4;
Phoenix inschakelen en afstemmen met Apache Ambari
Een HDInsight HBase-cluster bevat de Ambari-gebruikersinterface voor het aanbrengen van configuratiewijzigingen.
Als u Phoenix wilt in- of uitschakelen en de time-outinstellingen voor query's van Phoenix wilt beheren, meldt u zich aan bij de Ambari-webgebruikersinterface (
https://YOUR_CLUSTER_NAME.azurehdinsight.net
) met behulp van uw Hadoop-gebruikersreferenties.Selecteer HBase in de lijst met services in het linkermenu en selecteer vervolgens het tabblad Configuraties .
Zoek de sectie Phoenix SQL-configuratie om Phoenix in of uit te schakelen en stel de time-out van de query in.