SlideShare a Scribd company logo
Методы распределенной обработки
больших объемов данных в Hadoop
Москва 2014
Лекция 7: Введение в Pig и Hive
Pig
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
Pig
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Платформа для анализа больших коллекций
данных, которая состоит из:
– Языка высокого уровня для написания программ
анализа
– Инфраструктуры для запуска этих программ
Pig
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Top Level Apache Project
– http://pig.apache.org
• Pig – это высокоуровневая платформа поверх
Hadoop
– Предоставляет язык программирования
высокого уровня Pig Latin для обработки данных
– Преобразует код такой программы в MapReduce
задачи и выполняет их на кластере Hadoop
• Используется во многих компаниях
Pig и MapReduce
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Для написания задач MapReduce требуются
программисты
– Которые должны уметь думать в стиле “map & reduce”
– Скорее всего должны знать язык Java
• Pig предоставляет язык, который могут использовать
– Аналитики
– Data Scientists
– Статистики
• Изначально был разработан в компании Yahoo! в
2006 для предоставления аналитикам доступа к
данным
Основные возможности Pig
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Join Datasets
• Sort Datasets
• Filter
• Data Types
• Group By
• Пользовательские функции
Компоненты Pig
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Pig Latin
– Язык, основанный на командах
– Разработан специально для трансформации данных
и последовательно обработки
• Среда выполнения
– Среда, в которой выполняются команды Pig Latin
– Поддержка режимов выполнения Local и Hadoop
• Компилятор Pig преобразует код Pig Latin в
MapReduce
– Компилятор оптимизирует процесс выполнения
Режимы выполнения
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Local
– Запускается в рамках одной JVM
– Работает исключительно с локальной файловой системой
– Отлично подходит для разработки, экспериментов и
прототипов
– $pig -x local
• Hadoop
– Также известен как режим MapReduce
– Pig преобразует программу Pig Latin в задачи MapReduce
и выполняет их на кластере
– $pig -x mapreduce
Запуск Pig
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Скрипт
– Выполняются команды из файла
– $pig script.pig
• Grunt
– Интерактивная оболочка для выполнения команд Pig
– Запускается в случае отсутствия скрипта
– Можно запускать скрипты из Grunt путем команда run или
exec
• Embedded
– Выполнять команды Pig используя класс PigServer
• По типу использования JDBS для исполнения SQL
– Имеется программный доступ к Grunt через класс PigRunner
Pig Latin
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Строительные блоки
– Field (поле) – часть данных
– Tuple (кортеж) – упорядоченный набор полей,
заключенный в скобки “(” и “)”
• Напр. (10.4, 5, word, 4, field1)
– Bag (мешок) – коллекция кортежей, заключенная в
скобки “{” и “}”
• Напр. { (10.4, 5, word, 4, field1), (this, 1, blah) }
• Схожесть с реляционными БД
– Bag – это таблица в БД
– Tuple – это строка в таблице
– Bag не требует, чтобы все tuples содержали одно и то же
число полей (в отличии от реляционной таблицы)
Простой пример Pig Latin
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
$ pig
grunt> cat /path/to/file/a.txt
a 1
d 4
c 9
k 6
grunt> records = LOAD ‘/path/to/file/a.txt' as (letter:chararray, count:int);
grunt> DUMP records;
...
org.apache.pig.backend.hadoop.executionengine.mapReduceLayer
.MapReduceLauncher - 50% complete
2014-07-14 17:36:22,040 [main] INFO
org.apache.pig.backend.hadoop.executionengine.mapReduceLayer
.MapReduceLauncher - 100% complete
...
(a,1)
(d,4)
(c,9)
(k,6)
Запуск Grunt в режиме MapRecue
по умолчанию
Grunt поддерживает
системные команды
Загрузить данные из
текстового файла в
таблицу records
Вывести записи из
таблицы records на экран
Операции DUMP и STORE
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Никаких действий до тех пор, пока не встретятся команды
DUMP или STORE
– Pig будет парсить, проверять и анализировать выражения
– Но не будет выполнять их
• DUMP – выводит результат на экран
• STORE – сохраняет результат (обычно в файл)
grunt> records = LOAD ‘/path/to/file/a.txt' as (letter:chararray, count:int);
...
...
...
...
grunt> DUMP records;
Ничего не выполняется,
только оптимизация
скрипта
Большой объем данных
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Данные в Hadoop, обычно, большого объема и нет
смысла их все выводить на экран
• Обычно данные находятся в HDFS/Hbase/etc
– Команда STORE
• Для целей отладки можно выводить только небольшую
часть на экран
grunt> records = LOAD ‘/path/to/file/big.txt' as (letter:chararray, count:int);
grunt> toPrint = LIMIT records 5;
grunt> DUMP toPrint;
Показывать только 5
записей
Команда LOAD
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
LOAD 'data' [USING function] [AS schema];
• data – имя директории или файла
– Должно в одинарных кавычках
• USING – определяет используемую функцию для
загрузки
– По-умолчанию, используется PigStorage, которая парсит
каждую строку, используя разделитель
• По-умолчанию, разделить знак табуляции (‘t’)
• Разделить может быть задан, используя регулярные выражения
• AS – назначает схему входным данным
– Назначает имена полям
– Объявляет тип полей
Команда LOAD
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
records =
LOAD '/path/to/file/some.log'
USING PigStorage()
AS (userId:chararray, timestamp:long, query:chararray);
Типы данных для схемы
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
Тип Описание Пример
Простые
int Signed 32-bit integer 10
long Signed 64-bit integer 10L или 10l
float 32-bit floating point 10.5F или 10.5f
double 64-bit floating point 10.5 или 10.5e2 или 10.5E2
Массивы
chararray Массив символов (string) в Unicode UTF-8 hello world
bytearray Byte array (blob)
Комплексные
tuple ordered set of fields (19,2)
bag collection of tuples {(19,2), (18,1)}
map collection of tuples [open#apache]
Pig Latin: средства диагностики
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Отобразить структуру Bag
– grunt> DESCRIBE <bag_name>;
• Отобразить план выполнения (Execution Plan)
– grunt> EXPLAIN <bag_name>;
– Варианты отчета:
• Logical Plan
• MapReduce Plan
• Показать, как Pig преобразует данные
– grunt> ILLUSTRATE <bag_name>;
Pig Latin: группировка
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
grunt> chars = LOAD '/path/to/file/b.txt' AS (c:chararray);
grunt> DESCRIBE chars;
chars: {c: chararray}
grunt> DUMP chars;
(a)
(k)
...
(k)
(c)
(k)
grunt> charGroup = GROUP chars by c;
grunt> DESCRIBE charGroup;
charGroup: {group: chararray,chars: {(c: chararray)}}
grunt> dump charGroup;
(a,{(a),(a),(a)})
(c,{(c),(c)})
(i,{(i),(i),(i)})
(k,{(k),(k),(k),(k)})
(l,{(l),(l)})
Создать новый bag с
полями group и chars
‘chars’ – это bag,который
содержит все tuples из
bag ‘chars’которые матчат
значение из ‘c’
Pig Latin: группировка
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
grunt> chars = LOAD ‘/path/to/file/b.txt' AS (c:chararray);
grunt> charGroup = GROUP chars by c;
grunt> ILLUSTRATE charGroup;
------------------------------
| chars | c:chararray |
------------------------------
| | c |
| | c |
------------------------------
------------------------------------------------------------------------------------
| charGroup | group:chararray | chars:bag{:tuple(c:chararray)} |
------------------------------------------------------------------------------------
| | c | {(c), (c)} |
-------------------------------------------------------------------------------------
Pig Latin: Inner vs. Outer Bag
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
grunt> chars = LOAD ‘/path/to/file/b.txt' AS (c:chararray);
grunt> charGroup = GROUP chars by c;
grunt> ILLUSTRATE charGroup;
------------------------------
| chars | c:chararray |
------------------------------
| | c |
| | c |
------------------------------
------------------------------------------------------------------------------------
| charGroup | group:chararray | chars:bag{:tuple(c:chararray)} |
------------------------------------------------------------------------------------
| | c | {(c), (c)} |
-------------------------------------------------------------------------------------
Inner Bag
Outer Bag
Pig Latin: Inner vs. Outer Bag
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
grunt> chars = LOAD '/path/to/file/b.txt' AS (c:chararray);
grunt> charGroup = GROUP chars by c;
grunt> dump charGroup;
(a, {(a), (a), (a)})
(c, {(c), (c)})
(i, {(i), (i), (i)})
(k, {(k), (k), (k), (k)})
(l, {(l), (l)})
Inner Bag
Outer Bag
PigLatin: FOREACH
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• FOREACH <bag> GENERATE <data>
– Итерация по каждому элементу в bag и его обработка
– grunt> result = FOREACH bag GENERATE f1;
grunt> records = LOAD ‘/path/to/file/a.txt' AS (c:chararray, i:int);
grunt> DUMP records;
(a,1)
(d,4)
(c,9)
(k,6)
grunt> counts = FOREACH records GENERATE i;
grunt> DUMP counts;
(1)
(4)
(9)
(6)
Для каждой строки
вывести поле ‘i’
PigLatin: FOREACH с функцией
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• FOREACH B GENERATE group, FUNCTION(A);
– Вместе с Pig поставляется множество встроенных
функций
• COUNT, FLATTEN, CONCAT и т.д.
– Можно реализовать свою функцию UDF (User
Defined Functions)
• Java, Python, JavaScript, Ruby или Groovy
PigLatin: FOREACH с функцией
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
grunt> chars = LOAD 'data/b.txt' AS (c:chararray);
grunt> charGroup = GROUP chars BY c;
grunt> DUMP charGroup;
(a, {(a),(a),(a)})
(c, {(c),(c)})
(i, {(i),(i),(i)})
(k, {(k),(k),(k),(k)})
(l, {(l),(l)})
grunt> DESCRIBE charGroup;
charGroup: {group: chararray,chars: {(c: chararray)}}
grunt> counts = FOREACH charGroup GENERATE group, COUNT(chars);
grunt> DUMP counts;
(a,3)
(c,2)
(i,3)
(k,4)
(l,2)
Для каждой строки в
‘charGroup’ вывести поле
‘group’ и число элементов
в ‘chars’
PigLatin: функция TOKENIZE
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Разбивает строку на токены и возвращает результат в виде bag из
токенов
– Разделители: space, double quote("), coma(,), parenthesis(()), star(*)
grunt> linesOfText = LOAD 'data/c.txt' AS (line:chararray);
grunt> DUMP linesOfText;
(this is a line of text)
(yet another line of text)
(third line of words)
grunt> tokenBag = FOREACH linesOfText GENERATE TOKENIZE(line);
grunt> DUMP tokenBag;
({(this),(is),(a),(line),(of),(text)})
({(yet),(another),(line),(of),(text)})
({(third),(line),(of),(words)})
grunt> DESCRIBE tokenBag;
tokenBag: {bag_of_tokenTuples: {tuple_of_tokens: (token: chararray)}}
Разбить каждую строку по
пробелам и вернуть bag of
tokens
PigLatin: оператор FLATTEN
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Преобразует вложенные bag структуры данных
• FLATTEN – это не функция, это оператор
grunt> DUMP tokenBag;
({(this), (is), (a), (line), (of), (text)})
({(yet), (another), (line), (of), (text)})
({(third), (line), (of), (words)})
grunt> flatBag = FOREACH tokenBag GENERATE flatten($0);
grunt> DUMP flatBag;
(this)
(is)
(a)
...
...
(text)
(third)
(line)
(of)
(words)
Доступ к элементу может
быть по индексу
Вложенная структура: bag of
bag of words
Каждая строка
раскладывается в bag
простых токенов
PigLatin: WordCount
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
input_lines = LOAD ‘copy-of-all-pages-on-internet' AS (line:chararray);
-- Extract words from each line and put them into a pig bag
-- datatype, then flatten the bag to get one word on each row
words = FOREACH input_lines GENERATE FLATTEN(TOKENIZE(line)) AS word;
-- filter out any words that are just white spaces
filtered_words = FILTER words BY word MATCHES 'w+';
-- create a group for each word
word_groups = GROUP filtered_words BY word;
-- count the entries in each group
word_count = FOREACH word_groups GENERATE COUNT(filtered_words) AS count, group AS word;
-- order the records by count
ordered_word_count = ORDER word_count BY count DESC;
STORE ordered_word_count INTO ‘number-of-words-on-internet';
PigLatin: Joins
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Pig поддерживает
– Inner Joins
– Outer Joins
– Full Joins
• Фазы join
– Загрузить записи в bag из input #1
– Загрузить записи в bag из input #2
– Сделать join для двух массивов данных (bags) по заданному
ключу
• По-умолчанию используется Inner Join
– Объединяются строки, у которых матчатся ключи
– Строки, у которых нет совпадений, не включаются в результат
Inner Join, пример
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
-- InnerJoin.pig
-- Загрузить записи в bag #1
posts = LOAD ‘data/user-posts.txt' USING PigStorage(',') AS
(user:chararray,post:chararray,date:long);
-- Загрузить записи в bag #2
likes = LOAD ‘data/user-likes.txt' USING PigStorage(',') AS
(user:chararray,likes:int,date:long);
userInfo = JOIN posts BY user, likes BY user;
DUMP userInfo;
Inner Join, пример
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
$ hdfs dfs –cat data/user-posts.txt
user1,Funny Story,1343182026191
user2,Cool Deal,1343182133839
user4,Interesting Post,1343182154633
user5,Yet Another Blog,13431839394
$ hdfs dfs –cat data/user-likes.txt
user1,12,1343182026191
user2,7,1343182139394
user3,0,1343182154633
user4,50,1343182147364
$ pig InnerJoin.pig
(user1,Funny Story,1343182026191,user1,12,1343182026191)
(user2,Cool Deal,1343182133839,user2,7,1343182139394)
(user4,Interesting Post,1343182154633,user4,50,1343182147364)
Inner Join, пример
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
grunt> DESCRIBE posts;
posts: {user: chararray,post: chararray,date: long}
grunt> DESCRIBE likes;
likes: {user: chararray,likes: int,date: long}
grunt> DESCRIBE userInfo;
UserInfo: {
posts::user: chararray,
posts::post: chararray,
posts::date: long,
likes::user: chararray,
likes::likes: int,
likes::date: long}
PigLatin: Outer Join
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Строки, которые не джойнятся с “другой” таблицей, все равно
будут включены в результат
• JOIN <bag #1> BY <join field>
LEFT OUTER, <bag #2> BY <join field>;
• JOIN <bag #1> BY <join field>
RIGHT OUTER, <bag #2> BY <join field>;
• JOIN <bag #1> BY <join field>
FULL OUTER, <bag #2> BY <join field>;
Left Outer Join, пример
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
--LeftOuterJoin.pig
posts = LOAD ‘data/user-posts.txt‘
USING PigStorage(',')
AS (user:chararray,post:chararray,date:long);
likes = LOAD ‘data/user-likes.txt'
USING PigStorage(',')
AS (user:chararray,likes:int,date:long);
userInfo = JOIN posts BY user LEFT OUTER, likes BY user;
DUMP userInfo;
Left Outer Join, пример
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
$ hdfs dfs –cat data/user-posts.txt
user1,Funny Story,1343182026191
user2,Cool Deal,1343182133839
user4,Interesting Post,1343182154633
user5,Yet Another Blog,13431839394
$ hdfs dfs –cat data/user-likes.txt
user1,12,1343182026191
user2,7,1343182139394
user3,0,1343182154633
user4,50,1343182147364
$ pig LeftOuterJoin.pig
(user1,Funny Story,1343182026191,user1,12,1343182026191)
(user2,Cool Deal,1343182133839,user2,7,1343182139394)
(user4,Interesting Post,1343182154633,user4,50,1343182147364)
(user5,Yet Another Blog,13431839394,,,)
Hive
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
Hive
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Решение Data Warehousing, работающее поверх
Hadoop
• Предоставляет SQL-подобный язык, который
называется HiveQL
– Минимальный порог вхождения для тех, кто знаком
с SQL
– Ориентир на аналитиков данных
• Изначально Hive был разработан в Facebook в
2007
• Сегодня Hive это проект Apache Hadoop
– http://hive.apache.org
Hive
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Hive предоставляет:
– Возможность структурировать различные
форматы данных
– Простой интерфейс для ad hoc запросов, анализа
и обобщения больших объемов данных
– Доступ к данных из различных источников, таких
как HDFS и HBase
Hive
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Hive НЕ предоставляет:
– Low latency или realtime-запросы
• Запрос даже небольших объемов данных
может занять минуты
• Разработан с учетом масштабируемости и
легкости использования
Client Machine
Hive
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Транслирует запросы HiveQL в набор MapReduce-задач,
которые затем выполняются на кластере Hadoop
HiveQL
CREATE TABLE posts (user
STRING, post STRING, time
BIGINT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',’
Hive
Hadoop
Execute
Report
Hive
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Для поддержки возможностей типа схемы или
партиционирования данных Hive хранит мета-
информацию в реляционной БД
– Поставляется с Derby, “легковесной” встроенной SQL
DB
• Derby по-умолчанию хорошо подходит для тестирования
• Схема данных не разделяется между пользователями, т.к.
каждый из них имеют свой собственный инстанс Derby
• Хранит данные в директории metastore_db, которая
находится в директории, откуда был запущен Hive
– Можно относительно легко переключиться на другу
БД, например, MySQL
Архитектура Hive
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
Hadoop HDFS и MapReduce
Metastore
Hive
Query Parser
Executor
CLI JDBC/Other
Hive Интерфейс
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Command Line Interface (CLI)
• Hive Web Interface
– https://cwiki.apache.org/confluence/display/Hive/H
iveWebInterface
• Java Database Connectivity (JDBC)
– https://cwiki.apache.org/confluence/display/Hive/H
iveClient
Концепция Hive
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Позаимствована из реляционных БД
– Database: Набор таблиц, для разрешения конфликта имен
– Table: Набор строк (rows), которые имеют одну схему (для колонок)
– Row: Запись, набор колонок
– Column: Представляет тип и значение элемента
ColumnRow
Table
Database
Hive: пример
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Создать таблицу
• Загрузить данные в таблицу
• Сделать запрос к таблице
• Удалить таблицу
Hive: Создание таблицы
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Загрузим данные из файлаdata/user-posts.txt
$ hive
hive> !cat data/user-posts.txt;
user1,Funny Story,1343182026191
user2,Cool Deal,1343182133839
user4,Interesting Post,1343182154633
user5,Yet Another Blog,13431839394
hive>
Выполнения локальных команд в CLI
Hive: Создание таблицы
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
hive> CREATE TABLE posts (user STRING, post STRING, time BIGINT)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ','
> STORED AS TEXTFILE;
OK
Time taken: 10.606 seconds
hive> show tables;
OK
posts
Time taken: 0.221 seconds
hive> describe posts;
OK
user string
post string
time bigint
Time taken: 0.212 seconds
-Создать таблицу из 3-х колонок
- Как файл будет парсится
- Как сохранять данные
Показать схему таблицы
Hive: Загрузка данных
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
hive> LOAD DATA LOCAL INPATH 'data/user-posts.txt'
> OVERWRITE INTO TABLE posts;
Copying data from file: data/user-posts.txt
Copying file: file: data/user-posts.txt
Loading data to table default.posts
Deleted /user/hive/warehouse/posts
OK
Time taken: 5.818 seconds
hive>
Существующие записи в таблице
posts удаляются
Данные из data/user-posts.txt
загружены в таблицу posts
$ hdfs dfs -cat /user/hive/warehouse/posts/user-posts.txt
user1,Funny Story,1343182026191
user2,Cool Deal,1343182133839
user4,Interesting Post,1343182154633
user5,Yet Another Blog,13431839394
По-умолчанию Hive хранит свои
таблицы в /user/hive/warehouse
Hive: Выполнение запроса
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
hive> select count (1) from posts;
Total MapReduce jobs = 1
Launching Job 1 out of 1
...
Starting Job = job_1343957512459_0004, Tracking URL =
http://localhost:8088/proxy/application_1343957512459_0004/
Kill Command = hadoop job -Dmapred.job.tracker=localhost:10040 -kill
job_1343957512459_0004
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2014-08-02 22:37:24,962 Stage-1 map = 0%, reduce = 0%
2014-08-02 22:37:31,577 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 0.87 sec
2014-08-02 22:37:32,664 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 2.64 sec
MapReduce Total cumulative CPU time: 2 seconds 640 msec
Ended Job = job_1343957512459_0004
MapReduce Jobs Launched:
Job 0: Map: 1 Reduce: 1 Accumulative CPU: 2.64 sec HDFS Read: 0 HDFS Write: 0
SUCESS
Total MapReduce CPU Time Spent: 2 seconds 640 msec
OK
4
Time taken: 14.204 seconds
- Считаем кол-во записей в таблице posts
- HiveQL преобразуется в 1 MapReduce
задачу
Hive: Выполнение запроса
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
hive> select * from posts where user="user2";
...
...
OK
user2 Cool Deal 1343182133839
Time taken: 12.184 seconds
hive> select * from posts where time<=1343182133839 limit 2;
...
...
OK
user1 Funny Story 1343182026191
user2 Cool Deal 1343182133839
Time taken: 12.003 seconds
hive>
Выбрать записи пользователя ‘user2’
- Фильтр по timestamp
- Ограничиваем число записей в
результате
Hive: Удаление таблицы
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
hive> DROP TABLE posts;
OK
Time taken: 1.234 seconds
hive> exit;
$ hdfs dfs -ls /user/hive/warehouse/
$
Hive: Нарушение схемы
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
hive> !cat data/user-posts-error.txt;
user1,Funny Story,1343182026191
user2,Cool Deal,2012-01-05
user4,Interesting Post,1343182154633
user5,Yet Another Blog,13431839394
hive> describe posts;
OK
user string
post string
time bigint
Time taken: 0.289 seconds
Hive: Нарушение схемы
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
hive> LOAD DATA LOCAL INPATH
> ‘data/user-posts-error.txt '
> OVERWRITE INTO TABLE posts;
OK
Time taken: 0.612 seconds
hive> select * from posts;
OK
user1 Funny Story 1343182026191
user2 Cool Deal NULL
user4 Interesting Post 1343182154633
user5 Yet Another Blog 13431839394
Time taken: 0.136 seconds
hive>
Hive: Joins
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Использовать joins в Hive просто
• Поддержка outer joins
– left, right и full joins
• Можно объединять множество таблиц
• По-умолчанию используется Inner Join
– Объединяются строки, у которых матчатся ключи
– Строки, у которых нет совпадений, не включаются в результат
Hive: Inner Join
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
hive> select * from posts limit 10;
OK
user1 Funny Story 1343182026191
user2 Cool Deal 1343182133839
user4 Interesting Post 1343182154633
user5 Yet Another Blog 1343183939434
hive> select * from likes limit 10;
OK
user1 12 1343182026191
user2 7 1343182139394
user3 0 1343182154633
user4 50 1343182147364
Time taken: 0.103 seconds
hive> CREATE TABLE posts_likes (user STRING, post STRING, likes_count INT);
OK
Hive: Inner Join
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
hive> INSERT OVERWRITE TABLE posts_likes
> SELECT p.user, p.post, l.count
> FROM posts p JOIN likes l ON (p.user = l.user);
OK
Time taken: 17.901 seconds
hive> select * from posts_likes limit 10;
OK
user1 Funny Story 12
user2 Cool Deal 7
user4 Interesting Post 50
Time taken: 0.082 seconds
hive>
Hive: Outer Join
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
• Строки, которые не джойнятся с “другой” таблицей, все равно будут включены
в результат
• Left Outer
SELECT p.*, l.*
FROM posts p LEFT OUTER JOIN likes l ON (p.user = l.user)
limit 10;
• RIGHT Outer
SELECT p.*, l.*
FROM posts p RIGHT OUTER JOIN likes l ON (p.user = l.user)
limit 10;
• FULL Outer
SELECT p.*, l.*
FROM posts p FULL OUTER JOIN likes l ON (p.user = l.user)
limit 10;
Hive: WordCount
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
CREATE TABLE docs (line STRING);
LOAD DATA INPATH 'docs' OVERWRITE INTO TABLE docs;
CREATE TABLE word_counts AS
SELECT word, count(1) AS count FROM
(SELECT explode(split(line, 's')) AS word FROM docs) w
GROUP BY word
ORDER BY word;
Ресурсы
Hadoop: The Definitive Guide
Tom White (Author)
O'Reilly Media; 3rd Edition
Chapter 11 Pig
Chapter 12 Hive
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
Ресурсы
Programming Pig
Alan Gates (Author)
O'Reilly Media; 1st Edition
Programming Hive
Edward Capriolo, Dean Wampler,
Jason Rutherglen (Authors)
O'Reilly Media; 1 edition
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
Вопросы?
ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE

More Related Content

PDF
Лекция 4. MapReduce в Hadoop (введение)
PDF
Лекция 12. Spark
PDF
Лекция 6. MapReduce в Hadoop (графы)
PDF
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
PPT
La veille sur internet en 5 étapes clés
PDF
Лекция 1. Введение в Big Data и MapReduce
PDF
Hadoop
PPTX
Hadoop Pig
Лекция 4. MapReduce в Hadoop (введение)
Лекция 12. Spark
Лекция 6. MapReduce в Hadoop (графы)
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
La veille sur internet en 5 étapes clés
Лекция 1. Введение в Big Data и MapReduce
Hadoop
Hadoop Pig

What's hot (13)

PPSX
Thinking big
PDF
Introdução ao Jornalismo de Dados
PDF
Linked Open Data Tutorial
PDF
Introduction à Cassandra - campus plex
PPTX
Aula 10 - Endereçamento IP.pptx
PPT
Web Server Technologies I: HTTP & Getting Started
PDF
ApreComo converter word para pdf mantendo os links clicáveis
PDF
Hadoop et son écosystème - v2
PDF
Tic recherche-scientifique
PPT
9. Document Oriented Databases
PPTX
O bibliotecário e a editoração de periódicos científicos: fazeres e competências
PPTX
PostgreSQL and JDBC: striving for high performance
PPT
Estudo de usuários - Biblioteca de Manguinhos (Fiocruz)
Thinking big
Introdução ao Jornalismo de Dados
Linked Open Data Tutorial
Introduction à Cassandra - campus plex
Aula 10 - Endereçamento IP.pptx
Web Server Technologies I: HTTP & Getting Started
ApreComo converter word para pdf mantendo os links clicáveis
Hadoop et son écosystème - v2
Tic recherche-scientifique
9. Document Oriented Databases
O bibliotecário e a editoração de periódicos científicos: fazeres e competências
PostgreSQL and JDBC: striving for high performance
Estudo de usuários - Biblioteca de Manguinhos (Fiocruz)
Ad

Viewers also liked (8)

PDF
Лекция 10. Apache Mahout
PDF
Лекция 3. Распределённая файловая система HDFS
PDF
Лекция 9. ZooKeeper
PDF
Лекция 5. MapReduce в Hadoop (алгоритмы)
PDF
Лекция 13. YARN
PDF
Лекция 14. Hadoop в Поиске Mail.Ru
PDF
Лекция 2. Основы Hadoop
PDF
Лекция 11. Вычислительная модель Pregel
Лекция 10. Apache Mahout
Лекция 3. Распределённая файловая система HDFS
Лекция 9. ZooKeeper
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 13. YARN
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 2. Основы Hadoop
Лекция 11. Вычислительная модель Pregel
Ad

More from Technopark (18)

PPTX
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
PPT
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
PPTX
СУБД 2013 Лекция №9 "Безопасность баз данных"
PPTX
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
PPTX
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
PPTX
СУБД 2013 Лекция №5 "Определение узких мест"
PPTX
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
PPTX
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
PPTX
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
PPTX
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
PPTX
СУБД 2013 Лекция №1 "Введение и начало проектирования"
PDF
Java осень 2014 занятие 8
PDF
Java осень 2014 занятие 7
PDF
Java осень 2014 занятие 6
PDF
Java осень 2014 занятие 5
PDF
Java осень 2014 занятие 3
PDF
Java осень 2014 занятие 1
PDF
Java осень 2014 занятие 2
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №1 "Введение и начало проектирования"
Java осень 2014 занятие 8
Java осень 2014 занятие 7
Java осень 2014 занятие 6
Java осень 2014 занятие 5
Java осень 2014 занятие 3
Java осень 2014 занятие 1
Java осень 2014 занятие 2

Лекция 7. Введение в Pig и Hive

  • 1. Методы распределенной обработки больших объемов данных в Hadoop Москва 2014 Лекция 7: Введение в Pig и Hive
  • 3. Pig ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Платформа для анализа больших коллекций данных, которая состоит из: – Языка высокого уровня для написания программ анализа – Инфраструктуры для запуска этих программ
  • 4. Pig ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Top Level Apache Project – http://pig.apache.org • Pig – это высокоуровневая платформа поверх Hadoop – Предоставляет язык программирования высокого уровня Pig Latin для обработки данных – Преобразует код такой программы в MapReduce задачи и выполняет их на кластере Hadoop • Используется во многих компаниях
  • 5. Pig и MapReduce ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Для написания задач MapReduce требуются программисты – Которые должны уметь думать в стиле “map & reduce” – Скорее всего должны знать язык Java • Pig предоставляет язык, который могут использовать – Аналитики – Data Scientists – Статистики • Изначально был разработан в компании Yahoo! в 2006 для предоставления аналитикам доступа к данным
  • 6. Основные возможности Pig ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Join Datasets • Sort Datasets • Filter • Data Types • Group By • Пользовательские функции
  • 7. Компоненты Pig ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Pig Latin – Язык, основанный на командах – Разработан специально для трансформации данных и последовательно обработки • Среда выполнения – Среда, в которой выполняются команды Pig Latin – Поддержка режимов выполнения Local и Hadoop • Компилятор Pig преобразует код Pig Latin в MapReduce – Компилятор оптимизирует процесс выполнения
  • 8. Режимы выполнения ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Local – Запускается в рамках одной JVM – Работает исключительно с локальной файловой системой – Отлично подходит для разработки, экспериментов и прототипов – $pig -x local • Hadoop – Также известен как режим MapReduce – Pig преобразует программу Pig Latin в задачи MapReduce и выполняет их на кластере – $pig -x mapreduce
  • 9. Запуск Pig ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Скрипт – Выполняются команды из файла – $pig script.pig • Grunt – Интерактивная оболочка для выполнения команд Pig – Запускается в случае отсутствия скрипта – Можно запускать скрипты из Grunt путем команда run или exec • Embedded – Выполнять команды Pig используя класс PigServer • По типу использования JDBS для исполнения SQL – Имеется программный доступ к Grunt через класс PigRunner
  • 10. Pig Latin ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Строительные блоки – Field (поле) – часть данных – Tuple (кортеж) – упорядоченный набор полей, заключенный в скобки “(” и “)” • Напр. (10.4, 5, word, 4, field1) – Bag (мешок) – коллекция кортежей, заключенная в скобки “{” и “}” • Напр. { (10.4, 5, word, 4, field1), (this, 1, blah) } • Схожесть с реляционными БД – Bag – это таблица в БД – Tuple – это строка в таблице – Bag не требует, чтобы все tuples содержали одно и то же число полей (в отличии от реляционной таблицы)
  • 11. Простой пример Pig Latin ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE $ pig grunt> cat /path/to/file/a.txt a 1 d 4 c 9 k 6 grunt> records = LOAD ‘/path/to/file/a.txt' as (letter:chararray, count:int); grunt> DUMP records; ... org.apache.pig.backend.hadoop.executionengine.mapReduceLayer .MapReduceLauncher - 50% complete 2014-07-14 17:36:22,040 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer .MapReduceLauncher - 100% complete ... (a,1) (d,4) (c,9) (k,6) Запуск Grunt в режиме MapRecue по умолчанию Grunt поддерживает системные команды Загрузить данные из текстового файла в таблицу records Вывести записи из таблицы records на экран
  • 12. Операции DUMP и STORE ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Никаких действий до тех пор, пока не встретятся команды DUMP или STORE – Pig будет парсить, проверять и анализировать выражения – Но не будет выполнять их • DUMP – выводит результат на экран • STORE – сохраняет результат (обычно в файл) grunt> records = LOAD ‘/path/to/file/a.txt' as (letter:chararray, count:int); ... ... ... ... grunt> DUMP records; Ничего не выполняется, только оптимизация скрипта
  • 13. Большой объем данных ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Данные в Hadoop, обычно, большого объема и нет смысла их все выводить на экран • Обычно данные находятся в HDFS/Hbase/etc – Команда STORE • Для целей отладки можно выводить только небольшую часть на экран grunt> records = LOAD ‘/path/to/file/big.txt' as (letter:chararray, count:int); grunt> toPrint = LIMIT records 5; grunt> DUMP toPrint; Показывать только 5 записей
  • 14. Команда LOAD ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE LOAD 'data' [USING function] [AS schema]; • data – имя директории или файла – Должно в одинарных кавычках • USING – определяет используемую функцию для загрузки – По-умолчанию, используется PigStorage, которая парсит каждую строку, используя разделитель • По-умолчанию, разделить знак табуляции (‘t’) • Разделить может быть задан, используя регулярные выражения • AS – назначает схему входным данным – Назначает имена полям – Объявляет тип полей
  • 15. Команда LOAD ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE records = LOAD '/path/to/file/some.log' USING PigStorage() AS (userId:chararray, timestamp:long, query:chararray);
  • 16. Типы данных для схемы ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE Тип Описание Пример Простые int Signed 32-bit integer 10 long Signed 64-bit integer 10L или 10l float 32-bit floating point 10.5F или 10.5f double 64-bit floating point 10.5 или 10.5e2 или 10.5E2 Массивы chararray Массив символов (string) в Unicode UTF-8 hello world bytearray Byte array (blob) Комплексные tuple ordered set of fields (19,2) bag collection of tuples {(19,2), (18,1)} map collection of tuples [open#apache]
  • 17. Pig Latin: средства диагностики ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Отобразить структуру Bag – grunt> DESCRIBE <bag_name>; • Отобразить план выполнения (Execution Plan) – grunt> EXPLAIN <bag_name>; – Варианты отчета: • Logical Plan • MapReduce Plan • Показать, как Pig преобразует данные – grunt> ILLUSTRATE <bag_name>;
  • 18. Pig Latin: группировка ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE grunt> chars = LOAD '/path/to/file/b.txt' AS (c:chararray); grunt> DESCRIBE chars; chars: {c: chararray} grunt> DUMP chars; (a) (k) ... (k) (c) (k) grunt> charGroup = GROUP chars by c; grunt> DESCRIBE charGroup; charGroup: {group: chararray,chars: {(c: chararray)}} grunt> dump charGroup; (a,{(a),(a),(a)}) (c,{(c),(c)}) (i,{(i),(i),(i)}) (k,{(k),(k),(k),(k)}) (l,{(l),(l)}) Создать новый bag с полями group и chars ‘chars’ – это bag,который содержит все tuples из bag ‘chars’которые матчат значение из ‘c’
  • 19. Pig Latin: группировка ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE grunt> chars = LOAD ‘/path/to/file/b.txt' AS (c:chararray); grunt> charGroup = GROUP chars by c; grunt> ILLUSTRATE charGroup; ------------------------------ | chars | c:chararray | ------------------------------ | | c | | | c | ------------------------------ ------------------------------------------------------------------------------------ | charGroup | group:chararray | chars:bag{:tuple(c:chararray)} | ------------------------------------------------------------------------------------ | | c | {(c), (c)} | -------------------------------------------------------------------------------------
  • 20. Pig Latin: Inner vs. Outer Bag ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE grunt> chars = LOAD ‘/path/to/file/b.txt' AS (c:chararray); grunt> charGroup = GROUP chars by c; grunt> ILLUSTRATE charGroup; ------------------------------ | chars | c:chararray | ------------------------------ | | c | | | c | ------------------------------ ------------------------------------------------------------------------------------ | charGroup | group:chararray | chars:bag{:tuple(c:chararray)} | ------------------------------------------------------------------------------------ | | c | {(c), (c)} | ------------------------------------------------------------------------------------- Inner Bag Outer Bag
  • 21. Pig Latin: Inner vs. Outer Bag ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE grunt> chars = LOAD '/path/to/file/b.txt' AS (c:chararray); grunt> charGroup = GROUP chars by c; grunt> dump charGroup; (a, {(a), (a), (a)}) (c, {(c), (c)}) (i, {(i), (i), (i)}) (k, {(k), (k), (k), (k)}) (l, {(l), (l)}) Inner Bag Outer Bag
  • 22. PigLatin: FOREACH ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • FOREACH <bag> GENERATE <data> – Итерация по каждому элементу в bag и его обработка – grunt> result = FOREACH bag GENERATE f1; grunt> records = LOAD ‘/path/to/file/a.txt' AS (c:chararray, i:int); grunt> DUMP records; (a,1) (d,4) (c,9) (k,6) grunt> counts = FOREACH records GENERATE i; grunt> DUMP counts; (1) (4) (9) (6) Для каждой строки вывести поле ‘i’
  • 23. PigLatin: FOREACH с функцией ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • FOREACH B GENERATE group, FUNCTION(A); – Вместе с Pig поставляется множество встроенных функций • COUNT, FLATTEN, CONCAT и т.д. – Можно реализовать свою функцию UDF (User Defined Functions) • Java, Python, JavaScript, Ruby или Groovy
  • 24. PigLatin: FOREACH с функцией ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE grunt> chars = LOAD 'data/b.txt' AS (c:chararray); grunt> charGroup = GROUP chars BY c; grunt> DUMP charGroup; (a, {(a),(a),(a)}) (c, {(c),(c)}) (i, {(i),(i),(i)}) (k, {(k),(k),(k),(k)}) (l, {(l),(l)}) grunt> DESCRIBE charGroup; charGroup: {group: chararray,chars: {(c: chararray)}} grunt> counts = FOREACH charGroup GENERATE group, COUNT(chars); grunt> DUMP counts; (a,3) (c,2) (i,3) (k,4) (l,2) Для каждой строки в ‘charGroup’ вывести поле ‘group’ и число элементов в ‘chars’
  • 25. PigLatin: функция TOKENIZE ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Разбивает строку на токены и возвращает результат в виде bag из токенов – Разделители: space, double quote("), coma(,), parenthesis(()), star(*) grunt> linesOfText = LOAD 'data/c.txt' AS (line:chararray); grunt> DUMP linesOfText; (this is a line of text) (yet another line of text) (third line of words) grunt> tokenBag = FOREACH linesOfText GENERATE TOKENIZE(line); grunt> DUMP tokenBag; ({(this),(is),(a),(line),(of),(text)}) ({(yet),(another),(line),(of),(text)}) ({(third),(line),(of),(words)}) grunt> DESCRIBE tokenBag; tokenBag: {bag_of_tokenTuples: {tuple_of_tokens: (token: chararray)}} Разбить каждую строку по пробелам и вернуть bag of tokens
  • 26. PigLatin: оператор FLATTEN ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Преобразует вложенные bag структуры данных • FLATTEN – это не функция, это оператор grunt> DUMP tokenBag; ({(this), (is), (a), (line), (of), (text)}) ({(yet), (another), (line), (of), (text)}) ({(third), (line), (of), (words)}) grunt> flatBag = FOREACH tokenBag GENERATE flatten($0); grunt> DUMP flatBag; (this) (is) (a) ... ... (text) (third) (line) (of) (words) Доступ к элементу может быть по индексу Вложенная структура: bag of bag of words Каждая строка раскладывается в bag простых токенов
  • 27. PigLatin: WordCount ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE input_lines = LOAD ‘copy-of-all-pages-on-internet' AS (line:chararray); -- Extract words from each line and put them into a pig bag -- datatype, then flatten the bag to get one word on each row words = FOREACH input_lines GENERATE FLATTEN(TOKENIZE(line)) AS word; -- filter out any words that are just white spaces filtered_words = FILTER words BY word MATCHES 'w+'; -- create a group for each word word_groups = GROUP filtered_words BY word; -- count the entries in each group word_count = FOREACH word_groups GENERATE COUNT(filtered_words) AS count, group AS word; -- order the records by count ordered_word_count = ORDER word_count BY count DESC; STORE ordered_word_count INTO ‘number-of-words-on-internet';
  • 28. PigLatin: Joins ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Pig поддерживает – Inner Joins – Outer Joins – Full Joins • Фазы join – Загрузить записи в bag из input #1 – Загрузить записи в bag из input #2 – Сделать join для двух массивов данных (bags) по заданному ключу • По-умолчанию используется Inner Join – Объединяются строки, у которых матчатся ключи – Строки, у которых нет совпадений, не включаются в результат
  • 29. Inner Join, пример ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE -- InnerJoin.pig -- Загрузить записи в bag #1 posts = LOAD ‘data/user-posts.txt' USING PigStorage(',') AS (user:chararray,post:chararray,date:long); -- Загрузить записи в bag #2 likes = LOAD ‘data/user-likes.txt' USING PigStorage(',') AS (user:chararray,likes:int,date:long); userInfo = JOIN posts BY user, likes BY user; DUMP userInfo;
  • 30. Inner Join, пример ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE $ hdfs dfs –cat data/user-posts.txt user1,Funny Story,1343182026191 user2,Cool Deal,1343182133839 user4,Interesting Post,1343182154633 user5,Yet Another Blog,13431839394 $ hdfs dfs –cat data/user-likes.txt user1,12,1343182026191 user2,7,1343182139394 user3,0,1343182154633 user4,50,1343182147364 $ pig InnerJoin.pig (user1,Funny Story,1343182026191,user1,12,1343182026191) (user2,Cool Deal,1343182133839,user2,7,1343182139394) (user4,Interesting Post,1343182154633,user4,50,1343182147364)
  • 31. Inner Join, пример ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE grunt> DESCRIBE posts; posts: {user: chararray,post: chararray,date: long} grunt> DESCRIBE likes; likes: {user: chararray,likes: int,date: long} grunt> DESCRIBE userInfo; UserInfo: { posts::user: chararray, posts::post: chararray, posts::date: long, likes::user: chararray, likes::likes: int, likes::date: long}
  • 32. PigLatin: Outer Join ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Строки, которые не джойнятся с “другой” таблицей, все равно будут включены в результат • JOIN <bag #1> BY <join field> LEFT OUTER, <bag #2> BY <join field>; • JOIN <bag #1> BY <join field> RIGHT OUTER, <bag #2> BY <join field>; • JOIN <bag #1> BY <join field> FULL OUTER, <bag #2> BY <join field>;
  • 33. Left Outer Join, пример ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE --LeftOuterJoin.pig posts = LOAD ‘data/user-posts.txt‘ USING PigStorage(',') AS (user:chararray,post:chararray,date:long); likes = LOAD ‘data/user-likes.txt' USING PigStorage(',') AS (user:chararray,likes:int,date:long); userInfo = JOIN posts BY user LEFT OUTER, likes BY user; DUMP userInfo;
  • 34. Left Outer Join, пример ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE $ hdfs dfs –cat data/user-posts.txt user1,Funny Story,1343182026191 user2,Cool Deal,1343182133839 user4,Interesting Post,1343182154633 user5,Yet Another Blog,13431839394 $ hdfs dfs –cat data/user-likes.txt user1,12,1343182026191 user2,7,1343182139394 user3,0,1343182154633 user4,50,1343182147364 $ pig LeftOuterJoin.pig (user1,Funny Story,1343182026191,user1,12,1343182026191) (user2,Cool Deal,1343182133839,user2,7,1343182139394) (user4,Interesting Post,1343182154633,user4,50,1343182147364) (user5,Yet Another Blog,13431839394,,,)
  • 36. Hive ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Решение Data Warehousing, работающее поверх Hadoop • Предоставляет SQL-подобный язык, который называется HiveQL – Минимальный порог вхождения для тех, кто знаком с SQL – Ориентир на аналитиков данных • Изначально Hive был разработан в Facebook в 2007 • Сегодня Hive это проект Apache Hadoop – http://hive.apache.org
  • 37. Hive ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Hive предоставляет: – Возможность структурировать различные форматы данных – Простой интерфейс для ad hoc запросов, анализа и обобщения больших объемов данных – Доступ к данных из различных источников, таких как HDFS и HBase
  • 38. Hive ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Hive НЕ предоставляет: – Low latency или realtime-запросы • Запрос даже небольших объемов данных может занять минуты • Разработан с учетом масштабируемости и легкости использования
  • 39. Client Machine Hive ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Транслирует запросы HiveQL в набор MapReduce-задач, которые затем выполняются на кластере Hadoop HiveQL CREATE TABLE posts (user STRING, post STRING, time BIGINT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',’ Hive Hadoop Execute Report
  • 40. Hive ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Для поддержки возможностей типа схемы или партиционирования данных Hive хранит мета- информацию в реляционной БД – Поставляется с Derby, “легковесной” встроенной SQL DB • Derby по-умолчанию хорошо подходит для тестирования • Схема данных не разделяется между пользователями, т.к. каждый из них имеют свой собственный инстанс Derby • Хранит данные в директории metastore_db, которая находится в директории, откуда был запущен Hive – Можно относительно легко переключиться на другу БД, например, MySQL
  • 41. Архитектура Hive ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE Hadoop HDFS и MapReduce Metastore Hive Query Parser Executor CLI JDBC/Other
  • 42. Hive Интерфейс ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Command Line Interface (CLI) • Hive Web Interface – https://cwiki.apache.org/confluence/display/Hive/H iveWebInterface • Java Database Connectivity (JDBC) – https://cwiki.apache.org/confluence/display/Hive/H iveClient
  • 43. Концепция Hive ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Позаимствована из реляционных БД – Database: Набор таблиц, для разрешения конфликта имен – Table: Набор строк (rows), которые имеют одну схему (для колонок) – Row: Запись, набор колонок – Column: Представляет тип и значение элемента ColumnRow Table Database
  • 44. Hive: пример ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Создать таблицу • Загрузить данные в таблицу • Сделать запрос к таблице • Удалить таблицу
  • 45. Hive: Создание таблицы ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Загрузим данные из файлаdata/user-posts.txt $ hive hive> !cat data/user-posts.txt; user1,Funny Story,1343182026191 user2,Cool Deal,1343182133839 user4,Interesting Post,1343182154633 user5,Yet Another Blog,13431839394 hive> Выполнения локальных команд в CLI
  • 46. Hive: Создание таблицы ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE hive> CREATE TABLE posts (user STRING, post STRING, time BIGINT) > ROW FORMAT DELIMITED > FIELDS TERMINATED BY ',' > STORED AS TEXTFILE; OK Time taken: 10.606 seconds hive> show tables; OK posts Time taken: 0.221 seconds hive> describe posts; OK user string post string time bigint Time taken: 0.212 seconds -Создать таблицу из 3-х колонок - Как файл будет парсится - Как сохранять данные Показать схему таблицы
  • 47. Hive: Загрузка данных ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE hive> LOAD DATA LOCAL INPATH 'data/user-posts.txt' > OVERWRITE INTO TABLE posts; Copying data from file: data/user-posts.txt Copying file: file: data/user-posts.txt Loading data to table default.posts Deleted /user/hive/warehouse/posts OK Time taken: 5.818 seconds hive> Существующие записи в таблице posts удаляются Данные из data/user-posts.txt загружены в таблицу posts $ hdfs dfs -cat /user/hive/warehouse/posts/user-posts.txt user1,Funny Story,1343182026191 user2,Cool Deal,1343182133839 user4,Interesting Post,1343182154633 user5,Yet Another Blog,13431839394 По-умолчанию Hive хранит свои таблицы в /user/hive/warehouse
  • 48. Hive: Выполнение запроса ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE hive> select count (1) from posts; Total MapReduce jobs = 1 Launching Job 1 out of 1 ... Starting Job = job_1343957512459_0004, Tracking URL = http://localhost:8088/proxy/application_1343957512459_0004/ Kill Command = hadoop job -Dmapred.job.tracker=localhost:10040 -kill job_1343957512459_0004 Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1 2014-08-02 22:37:24,962 Stage-1 map = 0%, reduce = 0% 2014-08-02 22:37:31,577 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 0.87 sec 2014-08-02 22:37:32,664 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 2.64 sec MapReduce Total cumulative CPU time: 2 seconds 640 msec Ended Job = job_1343957512459_0004 MapReduce Jobs Launched: Job 0: Map: 1 Reduce: 1 Accumulative CPU: 2.64 sec HDFS Read: 0 HDFS Write: 0 SUCESS Total MapReduce CPU Time Spent: 2 seconds 640 msec OK 4 Time taken: 14.204 seconds - Считаем кол-во записей в таблице posts - HiveQL преобразуется в 1 MapReduce задачу
  • 49. Hive: Выполнение запроса ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE hive> select * from posts where user="user2"; ... ... OK user2 Cool Deal 1343182133839 Time taken: 12.184 seconds hive> select * from posts where time<=1343182133839 limit 2; ... ... OK user1 Funny Story 1343182026191 user2 Cool Deal 1343182133839 Time taken: 12.003 seconds hive> Выбрать записи пользователя ‘user2’ - Фильтр по timestamp - Ограничиваем число записей в результате
  • 50. Hive: Удаление таблицы ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE hive> DROP TABLE posts; OK Time taken: 1.234 seconds hive> exit; $ hdfs dfs -ls /user/hive/warehouse/ $
  • 51. Hive: Нарушение схемы ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE hive> !cat data/user-posts-error.txt; user1,Funny Story,1343182026191 user2,Cool Deal,2012-01-05 user4,Interesting Post,1343182154633 user5,Yet Another Blog,13431839394 hive> describe posts; OK user string post string time bigint Time taken: 0.289 seconds
  • 52. Hive: Нарушение схемы ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE hive> LOAD DATA LOCAL INPATH > ‘data/user-posts-error.txt ' > OVERWRITE INTO TABLE posts; OK Time taken: 0.612 seconds hive> select * from posts; OK user1 Funny Story 1343182026191 user2 Cool Deal NULL user4 Interesting Post 1343182154633 user5 Yet Another Blog 13431839394 Time taken: 0.136 seconds hive>
  • 53. Hive: Joins ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Использовать joins в Hive просто • Поддержка outer joins – left, right и full joins • Можно объединять множество таблиц • По-умолчанию используется Inner Join – Объединяются строки, у которых матчатся ключи – Строки, у которых нет совпадений, не включаются в результат
  • 54. Hive: Inner Join ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE hive> select * from posts limit 10; OK user1 Funny Story 1343182026191 user2 Cool Deal 1343182133839 user4 Interesting Post 1343182154633 user5 Yet Another Blog 1343183939434 hive> select * from likes limit 10; OK user1 12 1343182026191 user2 7 1343182139394 user3 0 1343182154633 user4 50 1343182147364 Time taken: 0.103 seconds hive> CREATE TABLE posts_likes (user STRING, post STRING, likes_count INT); OK
  • 55. Hive: Inner Join ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE hive> INSERT OVERWRITE TABLE posts_likes > SELECT p.user, p.post, l.count > FROM posts p JOIN likes l ON (p.user = l.user); OK Time taken: 17.901 seconds hive> select * from posts_likes limit 10; OK user1 Funny Story 12 user2 Cool Deal 7 user4 Interesting Post 50 Time taken: 0.082 seconds hive>
  • 56. Hive: Outer Join ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE • Строки, которые не джойнятся с “другой” таблицей, все равно будут включены в результат • Left Outer SELECT p.*, l.* FROM posts p LEFT OUTER JOIN likes l ON (p.user = l.user) limit 10; • RIGHT Outer SELECT p.*, l.* FROM posts p RIGHT OUTER JOIN likes l ON (p.user = l.user) limit 10; • FULL Outer SELECT p.*, l.* FROM posts p FULL OUTER JOIN likes l ON (p.user = l.user) limit 10;
  • 57. Hive: WordCount ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE CREATE TABLE docs (line STRING); LOAD DATA INPATH 'docs' OVERWRITE INTO TABLE docs; CREATE TABLE word_counts AS SELECT word, count(1) AS count FROM (SELECT explode(split(line, 's')) AS word FROM docs) w GROUP BY word ORDER BY word;
  • 58. Ресурсы Hadoop: The Definitive Guide Tom White (Author) O'Reilly Media; 3rd Edition Chapter 11 Pig Chapter 12 Hive ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE
  • 59. Ресурсы Programming Pig Alan Gates (Author) O'Reilly Media; 1st Edition Programming Hive Edward Capriolo, Dean Wampler, Jason Rutherglen (Authors) O'Reilly Media; 1 edition ЛЕКЦИЯ 7: ВВЕДЕНИЕ В PIG И HIVE