Nüüdseks olete ilmselt kuulnud Hadoopi hajutatud failisüsteemist (HDFS), eriti kui olete andmeanalüütik või keegi, kes vastutab andmete ühest süsteemist teise teisaldamise eest. Millised on HDFS-i eelised siiski relatsioonide andmebaaside ees?
HDFS on skaleeritav avatud lähtekoodiga lahendus suurte andmemahtude salvestamiseks ja töötlemiseks. HDFS on osutunud usaldusväärseks ja tõhusaks kogu ulatuses paljud kaasaegsed andmekeskused .
HDFS kasutab koos riistvaraga ka riistvara avatud lähtekoodiga tarkvara vähendada talletusbaidi üldkulu.
Tänu oma sisseehitatud replikatsioonile ja vastupidavusele kettarikketele on HDFS ideaalne süsteem andmete säilitamiseks ja töötlemiseks analüütika jaoks. See ei nõua tehingute aatomi, järjepidevuse, eraldatuse ja vastupidavuse (ACID) toetamiseks aluseid ja üldkulusid, nagu see on vajalik traditsiooniliste relatsiooniliste andmebaasisüsteemide puhul.
Pealegi väldib Hadoopi kasutamine analüüsiplatvormina ettevõtte- ja äriandmebaasidega (nt Oracle) võrreldes täiendavate litsentsimiskuludega.
Üks paljudest inimestest HDFS-i tundmaõppimisel küsitav küsimus on: Kuidas ma saan oma olemasolevad andmed HDFS-i viia?
Selles artiklis uurime, kuidas importida andmeid PostgreSQL andmebaasist HDFS-i. Kasutame Apache Sqoop , mis on praegu kõige tõhusam avatud lähtekoodiga lahendus andmete edastamiseks HDFS-i ja relatsiooniliste andmebaasisüsteemide vahel. Apache Sqoop on loodud andmete hulgi laadimiseks relatsiooniandmebaasist HDFS-i (import) ja HDFS-i andmete hulgi-kirjutamiseks relatsioonide andmebaasi (eksport).
kas peaksin õppima c või c ++
Selle õpetuse etapid on kirjutatud kellelegi, kellel on algteadmised SQL-päringute täitmise kohta ja elementaarsed teadmised HDFS-i käskudest.
Kasutatav andmebaasisüsteem on Windowsi jaoks PostgreSQL 9.5 ja HDFS-i versioon on Centera 6.4 Linuxi virtuaalmasinas Cloudera Hadoop 2.5.0-cdh5.2.0.
Apache Sqoop tugineb JDBC draiveri JAR-failidele, mis on omased relatsioonide andmebaasi tarnijale ja andmebaasi versioonile.
Selles artiklis näidatud toimingute sooritamiseks on kasutajal luba PostgreSQL-i andmebaasiga kaugühenduse loomiseks SELECT
õigused relatsiooniandmebaasis, HDFS-i kirjutamisõigused ja täitmisfaili Sqoop õigused.
c ++ roboti programmeerimine
Selle õpetuse jaoks lõime PostgreSQL andmebaasi ja panime sellele nimeks Ahvi põgenemine ja muutis selle ligipääsetavaks pordi 5432 kaudu.
Alustamiseks meie PostgreSQL ApeeScape
andmebaasi, loome testandmete tabeli nimega sales
. Eeldame, et OpenSSL-i sertifikaat ja privaatvõtme failid on PostgreSQL-i serveris juba olemas.
Server [localhost]: Database [postgres]: ApeeScape Port [5432]: Username [postgres]: Password for user postgres: psql (9.5.3) ApeeScape=# create table sales ApeeScape-# ( ApeeScape(# pkSales integer constraint salesKey primary key, ApeeScape(# saleDate date, ApeeScape(# saleAmount money, ApeeScape(# orderID int not null, ApeeScape(# itemID int not null ApeeScape(# ); CREATE TABLE
Järgmisena sisestame tabelisse 20 rida:
ApeeScape=# insert into sales values (1, '2016-09-27', 1.23, 1, 1); INSERT 0 1 ApeeScape=# insert into sales values (2, '2016-09-27', 2.34, 1, 2); INSERT 0 1 ApeeScape=# insert into sales values (3, '2016-09-27', 1.23, 2, 1); INSERT 0 1 ApeeScape=# insert into sales values (4, '2016-09-27', 2.34, 2, 2); INSERT 0 1 ApeeScape=# insert into sales values (5, '2016-09-27', 3.45, 2, 3); INSERT 0 1 ApeeScape=# insert into sales values (6, '2016-09-28', 3.45, 3, 3); INSERT 0 1 ApeeScape=# insert into sales values (7, '2016-09-28', 4.56, 3, 4); INSERT 0 1 ApeeScape=# insert into sales values (8, '2016-09-28', 5.67, 3, 5); INSERT 0 1 ApeeScape=# insert into sales values (9, '2016-09-28', 1.23, 4, 1); INSERT 0 1 ApeeScape=# insert into sales values (10, '2016-09-28', 1.23, 5, 1); INSERT 0 1 ApeeScape=# insert into sales values (11, '2016-09-28', 1.23, 6, 1); INSERT 0 1 ApeeScape=# insert into sales values (12, '2016-09-29', 1.23, 7, 1); INSERT 0 1 ApeeScape=# insert into sales values (13, '2016-09-29', 2.34, 7, 2); INSERT 0 1 ApeeScape=# insert into sales values (14, '2016-09-29', 3.45, 7, 3); INSERT 0 1 ApeeScape=# insert into sales values (15, '2016-09-29', 4.56, 7, 4); INSERT 0 1 ApeeScape=# insert into sales values (16, '2016-09-29', 5.67, 7, 5); INSERT 0 1 ApeeScape=# insert into sales values (17, '2016-09-29', 6.78, 7, 6); INSERT 0 1 ApeeScape=# insert into sales values (18, '2016-09-29', 7.89, 7, 7); INSERT 0 1 ApeeScape=# insert into sales values (19, '2016-09-29', 7.89, 8, 7); INSERT 0 1 ApeeScape=# insert into sales values (20, '2016-09-30', 1.23, 9, 1); INSERT 0 1
Valige andmed, et veenduda andmete õiges välimuses.
ApeeScape=# select * from sales; pksales | saledate | saleamount | orderid | itemid ---------+------------+------------+---------+-------- 1 | 2016-09-27 | .23 | 1 | 1 2 | 2016-09-27 | .34 | 1 | 2 3 | 2016-09-27 | .23 | 2 | 1 4 | 2016-09-27 | .34 | 2 | 2 5 | 2016-09-27 | .45 | 2 | 3 6 | 2016-09-28 | .45 | 3 | 3 7 | 2016-09-28 | .56 | 3 | 4 8 | 2016-09-28 | .67 | 3 | 5 9 | 2016-09-28 | .23 | 4 | 1 10 | 2016-09-28 | .23 | 5 | 1 11 | 2016-09-28 | .23 | 6 | 1 12 | 2016-09-29 | .23 | 7 | 1 13 | 2016-09-29 | .34 | 7 | 2 14 | 2016-09-29 | .45 | 7 | 3 15 | 2016-09-29 | .56 | 7 | 4 16 | 2016-09-29 | .67 | 7 | 5 17 | 2016-09-29 | .78 | 7 | 6 18 | 2016-09-29 | .89 | 7 | 7 19 | 2016-09-29 | .89 | 8 | 7 20 | 2016-09-30 | .23 | 9 | 1 (20 rows)
Andmed näevad head välja, nii et jätkame.
Kui andmeallikas on määratletud, oleme nüüd valmis andmeid HDFS-i importima. sqoop
käsk, mida uurime, on loetletud allpool ja jaotame iga argumendi järgnevates täppides. Pange tähele, et käsk peaks olema ühes terves reas või nagu allpool näidatud, iga rea lõpus, välja arvatud viimane, on tagasild (Linuxi käsurea jätkumärk).
sqoop import --connect 'jdbc:postgresql://aaa.bbb.ccc.ddd:5432/ApeeScape?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory' --username 'postgres' -P --table 'sales' --target-dir 'sales' --split-by 'pksales'
sqoop import
- Käivitatava faili nimi on sqoop
ja me käskime tal importida andmed tabelist või andmebaasivaadest HDFS-i.--connect
- nupuga --connect
argumenti, edastame JDBC-ühenduse stringi PostgreSQL-i jaoks. Sel juhul kasutame IP-aadressi, pordi numbrit ja andmebaasi nime. Samuti peame täpsustama, et SSL-i kasutatakse, ja peame pakkuma SSLSocketFactory
kasutatav klass.--username
- Selles näites on kasutajanimi PostgreSQL, mitte Windowsi sisselogimine. Kasutajal peavad olema õigused määratud andmebaasiga ühenduse loomiseks ja määratud tabelist valimiseks.-P
- See küsib käsurea kasutajalt parooli. Kui Sqoopi käivitatakse harva, võib see olla hea võimalus. Paroolil on käsk automaatselt automaatne edastamine veel mitmel viisil, kuid püüame selle artikli jaoks lihtsaks muuta.--table
- Siit edastame tabeli PostgreSQL nime.--target-dir
- See argument määrab HDFS-i kataloogi, kuhu andmed salvestatakse.--split-by
- Peame Sqoopile andma unikaalse identifikaatori, mis aitab tal töökoormust jaotada. Hiljem näeme töö väljundis, kus Sqoop valib jagatud piiride määramiseks minimaalse ja maksimaalse väärtuse.Korratavuse ja redigeerimise eesmärgil on hea käsk skripti panna, nagu allpool näidatud:
[ [email protected] :/sqoop]$ cat sqoopCommand.sh sqoop import --connect 'jdbc:postgresql://aaa.bbb.ccc.ddd:5432/toptal?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory' --username 'postgres' -P --table 'sales' --target-dir 'sales' --split-by 'pksales' [ [email protected] :/sqoop]$
Nüüd on aeg täita ülaltoodud Sqoopi käsukript. Sqoopi käsu väljund on näidatud allpool.
[ [email protected] :/sqoop]$ ./sqoopCommand.sh 16/10/02 18:58:34 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5-cdh5.2.0 Enter password: 16/10/02 18:58:40 INFO manager.SqlManager: Using default fetchSize of 1000 16/10/02 18:58:40 INFO tool.CodeGenTool: Beginning code generation 16/10/02 18:58:41 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM 'sales' AS t LIMIT 1 16/10/02 18:58:41 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/lib/hadoop-0.20-mapreduce Note: /tmp/sqoop-training/compile/77f9452788024792770d52da72ae871f/sales.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. 16/10/02 18:58:43 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-training/compile/77f9452788024792770d52da72ae871f/sales.jar 16/10/02 18:58:43 WARN manager.PostgresqlManager: It looks like you are importing from postgresql. 16/10/02 18:58:43 WARN manager.PostgresqlManager: This transfer can be faster! Use the --direct 16/10/02 18:58:43 WARN manager.PostgresqlManager: option to exercise a postgresql-specific fast path. 16/10/02 18:58:43 INFO mapreduce.ImportJobBase: Beginning import of sales 16/10/02 18:58:45 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 16/10/02 18:58:46 INFO db.DBInputFormat: Using read commited transaction isolation 16/10/02 18:58:46 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN('pksales'), MAX('pksales') FROM 'sales' 16/10/02 18:58:47 INFO mapred.JobClient: Running job: job_201609280401_0005 16/10/02 18:58:48 INFO mapred.JobClient: map 0% reduce 0% 16/10/02 18:59:04 INFO mapred.JobClient: map 50% reduce 0% 16/10/02 18:59:14 INFO mapred.JobClient: map 75% reduce 0% 16/10/02 18:59:15 INFO mapred.JobClient: map 100% reduce 0% 16/10/02 18:59:18 INFO mapred.JobClient: Job complete: job_201609280401_0005 16/10/02 18:59:18 INFO mapred.JobClient: Counters: 23 16/10/02 18:59:18 INFO mapred.JobClient: File System Counters 16/10/02 18:59:18 INFO mapred.JobClient: FILE: Number of bytes read=0 16/10/02 18:59:18 INFO mapred.JobClient: FILE: Number of bytes written=1190344 16/10/02 18:59:18 INFO mapred.JobClient: FILE: Number of read operations=0 16/10/02 18:59:18 INFO mapred.JobClient: FILE: Number of large read operations=0 16/10/02 18:59:18 INFO mapred.JobClient: FILE: Number of write operations=0 16/10/02 18:59:18 INFO mapred.JobClient: HDFS: Number of bytes read=438 16/10/02 18:59:18 INFO mapred.JobClient: HDFS: Number of bytes written=451 16/10/02 18:59:18 INFO mapred.JobClient: HDFS: Number of read operations=4 16/10/02 18:59:18 INFO mapred.JobClient: HDFS: Number of large read operations=0 16/10/02 18:59:18 INFO mapred.JobClient: HDFS: Number of write operations=4 16/10/02 18:59:18 INFO mapred.JobClient: Job Counters 16/10/02 18:59:18 INFO mapred.JobClient: Launched map tasks=4 16/10/02 18:59:18 INFO mapred.JobClient: Total time spent by all maps in occupied slots (ms)=48877 16/10/02 18:59:18 INFO mapred.JobClient: Total time spent by all reduces in occupied slots (ms)=0 16/10/02 18:59:18 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 16/10/02 18:59:18 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 16/10/02 18:59:18 INFO mapred.JobClient: Map-Reduce Framework 16/10/02 18:59:18 INFO mapred.JobClient: Map input records=20 16/10/02 18:59:18 INFO mapred.JobClient: Map output records=20 16/10/02 18:59:18 INFO mapred.JobClient: Input split bytes=438 16/10/02 18:59:18 INFO mapred.JobClient: Spilled Records=0 16/10/02 18:59:18 INFO mapred.JobClient: CPU time spent (ms)=3980 16/10/02 18:59:18 INFO mapred.JobClient: Physical memory (bytes) snapshot=481574912 16/10/02 18:59:18 INFO mapred.JobClient: Virtual memory (bytes) snapshot=2949685248 16/10/02 18:59:18 INFO mapred.JobClient: Total committed heap usage (bytes)=127401984 16/10/02 18:59:18 INFO mapreduce.ImportJobBase: Transferred 451 bytes in 33.7555 seconds (13.3608 bytes/sec) 16/10/02 18:59:18 INFO mapreduce.ImportJobBase: Retrieved 20 records. [ [email protected] :/sqoop]$
Pange tähele, et ülaltoodud väljundi viimane rida näitab, et otsiti 20 kirjet, mis vastab PostgreSQL-i andmebaasi tabeli 20 kirjele.
Pärast käsu Sqoop käivitamist saame käivitada hdfs dfs -ls
käsk, et näha vaikimisi loodud kataloogi koos tabeli nimega HDFS-is.
[ [email protected] :/sqoop]$ hdfs dfs -ls Found 1 items drwxrwxrwx - toptal data 0 2016-10-02 18:59 sales [ [email protected] :/sqoop]$
Saame kasutada hdfs dfs -ls
käsk uuesti sales
sisu loetlemiseks kataloogi. HDFS-i vaadates võite märgata, et andmed on vaikimisi jaotatud nelja faili peale, mitte ainult ühes.
[ [email protected] :/sqoop]$ hdfs dfs -ls sales Found 6 items -rw-rw-rw- 1 toptal data 0 2016-10-02 18:59 sales/_SUCCESS drwxrwxrwx - toptal data 0 2016-10-02 18:58 sales/_logs -rw-rw-rw- 1 toptal data 110 2016-10-02 18:59 sales/part-m-00000 -rw-rw-rw- 1 toptal data 111 2016-10-02 18:59 sales/part-m-00001 -rw-rw-rw- 1 toptal data 115 2016-10-02 18:59 sales/part-m-00002 -rw-rw-rw- 1 toptal data 115 2016-10-02 18:59 sales/part-m-00003 [ [email protected] :/sqoop]$
hdfs dfs -cat
käsk kuvab kõik HDFS-i müügiandmete esimeses jaotises olevad kirjed.
[ [email protected] :/sqoop]$ hdfs dfs -cat sales/part-m-00000 1,2016-09-27,1.23,1,1 2,2016-09-27,2.34,1,2 3,2016-09-27,1.23,2,1 4,2016-09-27,2.34,2,2 5,2016-09-27,3.45,2,3 [ [email protected] :/sqoop]$
Pange tähele, et vaikefailide eraldaja on koma. Pange tähele ka seda, et igas sektsioonis on ainult viis rida, sest allika 20 rida on jaotatud võrdselt nelja sektsiooni vahel.
Ekraanile väljastatavate ridade arvu piiramiseks saame cat
väljundi sisestada käsk head
käsk, nagu allpool näidatud, ülejäänud kolme sektsiooni sisu kontrollimiseks.
-n 5
argument head
-le käsk piirab ekraani väljundi viie esimese reaga.
(Pange tähele, et meie puhul pole see vajalik, sest igas partitsioonis on alustuseks ainult viis rida. Praktikas on teil siiski tõenäoliselt igas partitsioonis palju rohkem ridu kui see ja soovite lihtsalt esimesed paar kontrollida veenduge, et need näeksid õiged välja, nii et see näitab teile, kuidas seda teha.)
[ [email protected] :/sqoop]$ hdfs dfs -cat sales/part-m-00001 |head -n 5 6,2016-09-28,3.45,3,3 7,2016-09-28,4.56,3,4 8,2016-09-28,5.67,3,5 9,2016-09-28,1.23,4,1 10,2016-09-28,1.23,5,1 [ [email protected] :/sqoop]$ hdfs dfs -cat sales/part-m-00002 |head -n 5 11,2016-09-28,1.23,6,1 12,2016-09-29,1.23,7,1 13,2016-09-29,2.34,7,2 14,2016-09-29,3.45,7,3 15,2016-09-29,4.56,7,4 [ [email protected] :/sqoop]$ hdfs dfs -cat sales/part-m-00003 |head -n 5 16,2016-09-29,5.67,7,5 17,2016-09-29,6.78,7,6 18,2016-09-29,7.89,7,7 19,2016-09-29,7.89,8,7 20,2016-09-30,1.23,9,1 [ [email protected] :/sqoop]$
Kui peate PostgreSQL-i andmebaasi mitmest tabelist andmete väljavõtmiseks käivitama päringu, saate seda teha järgmise käsuga:
mis on disaini 8 põhimõtet
[ [email protected] :/sqoop]$ cat sqoopCommand.sh sqoop import --connect 'jdbc:postgresql://aaa.bbb.ccc.ddd:5432/toptal?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory' --username 'postgres' -P --target-dir 'creditCardOrders' --split-by 'pksales' --query 'select s.pksales, s.saledate, s.saleamount, o.shippingtype, o.methodofpayment from sales s inner join orders o on s.orderid=o.orderid where o.methodofpayment='credit card' and $CONDITIONS' [ [email protected] :/sqoop]$
Ülalolevas käsus kasutame käsku Sqoop mõningaid samu argumente, kuid SQL-i käsuga kasutamisel saavad need erineva tähtsuse.
--target-dir
- Sihtkataloog ütleb Sqoopile, millises HDFS-i kataloogis valitud andmed salvestada. Seda argumenti nõuab Sqoop vabakujulise päringu kasutamisel.--split-by
- Ehkki valime müügitabeli peamise võtme, peame Sqoopile siiski andma ainulaadse identifikaatori, mis aitab tal töökoormust jaotada.--query
- See on argument, milles me esitame SQL-päringu. Ülaltoodud päring on lisatud jutumärkidesse. Pange tähele, et on mitte tagasilöök (rea jätkumärk) päringut sisaldavas reas. Pange tähele ka and $CONDITIONS
WHERE
lõpus klausel. Seda nõuab Sqoop, kuna Sqoop asendab automaatselt $CONDITIONS
unikaalse väljendiga märk.HDFS-il on relatsiooniliste andmebaaside ees palju eeliseid. Kui teete andmete analüüsi, peaksite täna kaaluma oma andmete HDFS-i üleviimist.
Koos oskused õppisin siin, andmete importimine relatsiooniandmebaasisüsteemist HDFS-i on lihtne ja arusaadav protsess, mida saab saavutada ühe käsuga. Kuigi nendel näidetel on vähe ridu, jääb PostgreSQL-i andmebaasitabelist HDFS-i suurte andmemahtude importimise mehaanika samaks.
Võite katsetada isegi suurte tabelite ja varieeruvate eraldusvõimalustega. Apache Sqoopi kasutamine on tõhusam kui andmebaasi andmete eksportimine faili, faili ülekandmine andmebaasiserverist HDFS-i ja seejärel faili laadimine HDFS-i.
Seotud: Suurendage oma andmeid R-iga