portaldacalheta.pt
  • Основен
  • Технология
  • Наука За Данни И Бази Данни
  • Разпределени Екипи
  • Инвеститори И Финансиране
Наука За Данни И Бази Данни

Урок за HDFS за анализатори на данни, затънал в релационни бази данни



Въведение

Досега вероятно сте чували за разпределената файлова система Hadoop (HDFS), особено ако сте анализатор на данни или някой, който отговаря за преместването на данни от една система в друга. Какви обаче са предимствата на HDFS от релационните бази данни?

HDFS е мащабируемо решение с отворен код за съхранение и обработка на големи обеми данни. Доказано е, че HDFS е надежден и ефективен много съвременни центрове за данни .



HDFS използва стоков хардуер заедно с софтуер с отворен код за намаляване на общите разходи за байт съхранение.

Със своята вградена репликация и устойчивост на дискови откази, HDFS е идеална система за съхранение и обработка на данни за анализ. Той не изисква основите и режийните разходи, за да поддържат атомността на транзакциите, последователността, изолацията и трайността (ACID), както е необходимо при традиционните релационни системи от бази данни.



Освен това, в сравнение с корпоративни и търговски бази данни, като Oracle, използването на Hadoop като платформа за анализ избягва всякакви допълнителни лицензионни разходи.

Един от въпросите, които много хора задават, когато за първи път научават за HDFS, е: Как да вмъкна съществуващите си данни в HDFS?



В тази статия ще разгледаме как да импортираме данни от база данни PostgreSQL в HDFS. Ние ще използваме Apache Sqoop , което в момента е най-ефективното решение с отворен код за прехвърляне на данни между HDFS и релационни системи от бази данни. Apache Sqoop е предназначен за групово зареждане на данни от релационна база данни в HDFS (импортиране) и за групово записване на данни от HDFS в релационна база данни (експортиране).

HDFS



Ускорете анализа, като мигрирате данните си в HDFS. Tweet

Стъпките в този урок са написани за някой с основни познания за изпълнение на SQL заявки и елементарни познания за HDFS команди.

Използваната система от бази данни е PostgreSQL 9.5 за Windows, а версията HDFS е Cloudera Hadoop 2.5.0-cdh5.2.0 на виртуална машина Centos 6.4 Linux.



Apache Sqoop разчита на JAR файлове на JDBC драйвер, които са специфични за доставчика на релационни бази данни и версията на базата данни.

За да изпълни стъпките, показани в тази статия, потребителят ще се нуждае от разрешения за дистанционно свързване с базата данни PostgreSQL, SELECT разрешения за релационната база данни, разрешения за запис на HDFS и изпълнява разрешения за изпълнимия файл на Sqoop.



За целите на този урок създадохме база данни PostgreSQL, наречена я Маймунско бягство , и го направи достъпен през порт 5432.

Източник на данни на PostgreSQL

За да започнете, в нашия PostgreSQL ApeeScape база данни, ще създадем таблица с тестови данни sales. Ще приемем, че OpenSSL сертификатите и файловете с частни ключове вече съществуват на сървъра на PostgreSQL.



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

След това ще вмъкнем 20 реда в таблицата:

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

Нека изберете данните, за да проверим дали данните изглеждат правилни:

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)

Данните изглеждат добре, така че нека продължим.

Импортирайте в HDFS с помощта на Sqoop

С дефинирания източник на данни вече сме готови да импортираме данните в HDFS. sqoop команда, която ще разгледаме, е изброена по-долу и ще разделим всеки аргумент в следващите точки. Имайте предвид, че командата трябва да е на един пълен ред или, както е показано по-долу, с обратна наклонена черта (символът за продължаване на командния ред на Linux) в края на всеки ред, с изключение на последния.

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 - Изпълнимият файл се казва sqoop и ние го инструктираме да импортира данните от таблица или изглед от база данни в HDFS.
  • --connect - С --connect аргумент, ние предаваме в JDBC низ за свързване за PostgreSQL. В този случай използваме IP адреса, номера на порта и името на базата данни. Също така трябва да уточним, че SSL се използва и трябва да предоставим SSLSocketFactory клас, който да се използва.
  • --username - В този пример потребителското име е вход за PostgreSQL, а не вход за Windows. Потребителят трябва да има разрешения за свързване към посочената база данни и да избира от посочената таблица.
  • -P - Това ще подкани потребителя на командния ред за паролата. Ако Sqoop се изпълнява рядко, това може да е добър вариант. Има множество други начини за автоматично предаване на паролата на командата, но ние се опитваме да улесним тази статия.
  • --table - Тук преминаваме в името на таблицата PostgreSQL.
  • --target-dir - Този аргумент указва директорията HDFS, в която трябва да се съхраняват данните.
  • --split-by - Трябва да предоставим на Sqoop уникален идентификатор, който да му помогне да разпредели натоварването. По-късно в изхода за работа ще видим къде Sqoop избира минималните и максималните стойности, за да помогне за задаването на разделени граници.

Добра идея е да поставите командата в скрипт за повторяемост и редактиране, както е показано по-долу:

[ [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]$

Сега е време да изпълним горния команден скрипт на Sqoop. Изходът от командата Sqoop е показан по-долу.

[ [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]$

Забележете, че последният ред изход по-горе показва, че са били извлечени 20 записа, което съответства на 20 записа в таблицата в базата данни PostgreSQL.

След изпълнението на командата Sqoop можем да изпълним hdfs dfs -ls команда, за да видите директорията, която е създадена по подразбиране с името на таблицата на HDFS.

[ [email protected] :/sqoop]$ hdfs dfs -ls Found 1 items drwxrwxrwx - toptal data 0 2016-10-02 18:59 sales [ [email protected] :/sqoop]$

Можем да използваме hdfs dfs -ls команда отново, за да изведете съдържанието на sales директория. Ако погледнете HDFS, можете да забележите, че данните са разделени и разпределени по четири файла по подразбиране, а не само в един.

[ [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 команда ще покаже всички записи в първия дял на данните за продажбите на HDFS.

[ [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]$

Забележете, че разделителят на файла по подразбиране е запетая. Също така обърнете внимание, че във всеки дял има само пет реда, тъй като 20-те реда в източника са разпределени еднакво между четирите дяла.

За да ограничим броя на редовете, които се извеждат на екрана, можем да изведем изхода на cat команда към head команда, както е показано по-долу, за да проверите съдържанието на останалите три дяла.

-n 5 аргумент на head команда ограничава изхода на екрана до първите пет реда.

(Имайте предвид, че в нашия случай това е ненужно, тъй като във всеки дял има само пет реда за начало. На практика обаче вероятно ще имате много повече редове от това във всеки дял и ще искате просто да проверите първите няколко, за да уверете се, че изглеждат правилно, така че това ви показва как да го направите.)

как да направя игра в обработка
[ [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]$

Ако трябва да изпълните заявка за извличане на данни от множество таблици в базата данни PostgreSQL, това може да се постигне със следната команда:

[ [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]$

В горната команда използваме едни и същи аргументи за командата Sqoop, но те придобиват различно значение, когато се използват с SQL команда.

  • --target-dir - Целевата директория казва на Sqoop в коя директория на HDFS да съхранява избраните данни. Този аргумент се изисква от Sqoop, когато се използва заявка в свободна форма.
  • --split-by - Въпреки че избираме първичния ключ на таблицата за продажби, все пак трябва да предоставим на Sqoop уникален идентификатор, който да му помогне да разпредели натоварването.
  • --query - Това е аргументът, в който предоставяме SQL заявката. Заявката по-горе е затворена в двойни кавички. Забележете, че има не обратна наклонена черта (символът за продължаване на реда) в множеството редове, съдържащи заявката. Също така обърнете внимание на and $CONDITIONS в края на WHERE клауза. Това се изисква от Sqoop, тъй като Sqoop автоматично ще замени $CONDITIONS токен с уникален израз.

Проблеми или без проблеми: Трябва да помислите за HDFS

HDFS има много предимства пред релационните бази данни. Ако правите анализ на данни, трябва да помислите за мигриране на вашите данни към HDFS днес.

С умения научено тук, импортирането на данни от релационна система от бази данни в HDFS е прост и ясен процес, който може да се осъществи с една команда. Докато тези примери имат малък брой редове, механиката за импортиране на големи обеми данни в HDFS от таблица на базата данни PostgreSQL остава същата.

Можете дори да експериментирате с импортиране на големи таблици и различни разделители за съхранение. Използването на Apache Sqoop е по-ефективно от експортирането на данните от базата данни във файл, прехвърлянето на файла от сървъра на базата данни в HDFS и след това зареждането на файла в HDFS.

Свързани: Увеличете обмяната на данни с R

Упражнения за творчество, за да подобрите дизайна си

Процес На Проектиране

Упражнения за творчество, за да подобрите дизайна си
Криптовалута за манекени: Биткойн и след това

Криптовалута за манекени: Биткойн и след това

Наука За Данни И Бази Данни

Популярни Публикации
Разработка на софтуер навсякъде: Моето разпределено отдалечено работно място
Разработка на софтуер навсякъде: Моето разпределено отдалечено работно място
Глава 11 Несъстоятелност: Какво е това и какво се случва след това?
Глава 11 Несъстоятелност: Какво е това и какво се случва след това?
Живейки най-добрия си живот - вдъхновяващата история на успеха на Дейвид Наф
Живейки най-добрия си живот - вдъхновяващата история на успеха на Дейвид Наф
Познайте своя потребител - UX статистика и статистика (с инфографика)
Познайте своя потребител - UX статистика и статистика (с инфографика)
Програмиране със смесени цели числа: Ръководство за вземане на изчислителни решения
Програмиране със смесени цели числа: Ръководство за вземане на изчислителни решения
 
Максималистичен дизайн и проблемът с минимализма
Максималистичен дизайн и проблемът с минимализма
Новата вълна на предприемачеството
Новата вълна на предприемачеството
Внедряване на отдалечен Framebuffer сървър в Java
Внедряване на отдалечен Framebuffer сървър в Java
Емулиране на React и JSX във Vanilla JS
Емулиране на React и JSX във Vanilla JS
Запознайте се с Ecto, безкомпромисна обвивка за бази данни за едновременни приложения на Elixir
Запознайте се с Ecto, безкомпромисна обвивка за бази данни за едновременни приложения на Elixir
Популярни Публикации
  • колко голяма е грим индустрията
  • познаването на ценова еластичност на продукта позволява на икономистите да:
  • javascript получава текуща дата и час
  • най-добрите безсерифни шрифтове за печат
  • angular 5 урок за начинаещи
Категории
  • Технология
  • Наука За Данни И Бази Данни
  • Разпределени Екипи
  • Инвеститори И Финансиране
  • © 2022 | Всички Права Запазени

    portaldacalheta.pt