Примечание: «Улей фактических боевых действий практический улей руководство по системе хранилища данных hadoop» в дальнейшем именуемое ульем фактических боевых действий, некоторые из них были добавлены к нему.
Глава 7 Просмотр
7.1
из ()
выбор из;
- Этой формулировки нет в Oracle, она похожа на ее заимствование. In with
- создать представление
создать представление, если не существует stock_basic_test_view (stock_id, stock_name) comment'stock
view '
tblproperties (' creator '=' zhangyt ')
as select stock_id, stock_name from stock_basic_test; --поля в
представлении можно опустить
create view if not exists stock_basic_partition_view
comment '股票视图'
tblproperties('creator'='zhangyt')
as
select
stock_id,
stock_name ,
count(*)
from stock_basic_partition
group by stock_id,stock_name ;
-- 如果属性字段没有指定列名会是cN这个样式
describe stock_basic_test_view ;
使用like 创建视图
create view stock_basic_test_view2 as select * from stock_basic_test_view;
删除视图
drop view stock_basic_test_view2;
Глава VII Индекс
8.1 для создания индекса
Общий индекс:
Создание индекса stock_basic_index
НА Таблице stock_basic_test (STOCK_ID)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
с отложенными перестроениями
в таблице index_table
Комментарий 'stock_basic_partition index ;
说明:as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' 是指定了索引处理器,也就是一个java类 大小写严格一致
in table 表示 不一定需要在新标中保留索引数据。
注意 但是每个索引只能用一次这个表 下次就报错表已经存在 建议不加这个
partition by (stock_id) 表示索引分区了
其实在 comment 之前可以加上 stored as , row format, location 等字段。
create index stock_basic_index_map
on table stock_basic_test(stock_id)
as 'bitmap'
with deferred rebuild
in table index_table2
comment 'stock_basic_partition indexed by stock_id ';
bitmap索引
只需要 将 as 'org.apache.hadoop.hive.ql.index.compact.compactindexhandler' 替换为 as 'bitmap' 和 in table
8.2-8.4重建索引和删除索引
show formatted index on stock_basic_test;
alter index stock_basic_index_map on stock_basic_test rebuild;
drop index stock_basic_index_map on stock_basic_test;
/**
分区索引 --报错后续研究下
create index stock_basic_partition_index
on table stock_basic_partition(stock_id)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
with deferred rebuild
in table index_table partitioned by (stock_id)
comment 'stock_basic_partition indexed by stock_id '
alter index stock_basic_partition_index on table stock_basic_partition partition(stock_id=) rebuild;
**/
Глава 9 Mode Design
9.2 О
сокращении карты разделов преобразует задачу (задание) в несколько задач.По умолчанию каждая задача представляет собой новый экземпляр jvm, который требует дополнительных затрат на открытие и уничтожение.Каждый небольшой файл соответствует
задаче. . В некоторых случаях время открытия и уничтожения JVM может быть больше, чем фактическое время обработки данных.
Обработка множества данных с помощью 9.4:
то есть функция для вставки таблицы из множества таблиц
из table_all
INSERT Overwrite Table table_a SELECT WHERE table_all.column_name_id = '. 1'
INSERT Overwrite Table table_b SELECT WHERE table_all.column_name_id = '. 1';
9,6 баллов Хранилище данных таблицы
сегментов : если для хранения используется таблица разделов, а раздел первого уровня - это дата, а раздел второго уровня предназначен для пользовательского кодирования, существует слишком много разделов второго уровня, что приведет к образованию большого количества небольших файлов. Вы можете построить перегородку на первом уровне и построить ведро на втором уровне.
создать таблицу stock_basic_par_clust (
stock_name string comment'namestock '
, stock_date string comment'stock date'
, stock_start_price DECIMAL (15,3) comment'opening price '
, stock_max_price DECIMAL (15,3) comment'highest price'
, stock_min_price DECIMAL (15,3) comment'самая низкая цена '
, stock_end_price DECIMAL (15,3) comment'closing price'
, stock_volume DECIMAL (15,3) comment'volume '
, stock_amount DECIMAL (15,3) comment'transaction Amount '
) разделен по (stock_id string) сгруппирован по (stock_date) на 10 сегментов; # Обратите внимание,
что разделение на разделы отличается от сегментирования. Поле сегмента все еще присутствует в операторе создания таблицы, а раздел - нет.
from stock_basic
insert overwrite table stock_basic_par_clust partition (stock_id='000001') select
stock_name
,stock_date
,stock_start_price
,stock_max_price
,stock_min_price
,stock_end_price
,stock_volume
,stock_amount
where stock_id='000001';
注意:书中虽然说了要设置 set hive.enforce.bucketing=true 才能执行插入语句,但实际没设置也可以 该参数已经被移除了
《hive实战》分桶表注意事项
选择唯一值的个数比较多的桶键,这样会减少出现倾斜的可能
如果桶键中数据是倾斜的,为倾斜的值单独创建桶,这可以通过列表分桶来实现
使用质数作为桶的编号
分桶对于常用链接在一起的事实表很有用
需要连接在一起的分桶表,其桶的个数必须一致,或者一个桶的个数是另外一个的因子
等等
9.8 使用列存储表
具体等到15.3.2 看
Глава 10 Настройка
10.1 Использование EXPLAIN
Задача куста будет состоять из нескольких этапов, и разные этапы будут иметь зависимости.
Этап может быть задачей mapreduce, этапом выборки, этапом слияния или этапом ограничения.
Hive обычно выполняет один этап за раз. Если не требуется параллельное выполнение.
10.2 Использование расширенного объяснения
Обратите внимание, что расширенное объяснение содержит больше данных, чем объяснение. Изначально слишком много расположений файлов?
10.3 Настройка лимита
аналогична настройке limit для предотвращения возврата всех результатов в cli.
set hive.limit.optimize.enable = true;
set hive.limit.row.max.size = 100; # Это бесполезно. По умолчанию в системе установлено значение 10000. Он по-прежнему показывает очень много изменений.
set hive.limit.optimize.limit.file = 10;
Но это еще ничего. Используйте
10.4join для оптимизации mapjoin. Это плохо.
10.5 Локальный режим
10.6 Параллельное выполнение
задачи куста будет иметь несколько этапов. Если они разные, задачи без зависимостей могут выполняться параллельно
set hive.exec.parallel = true;
10.7 Строгий режим
set hive.exec.dynamic.partition.mode = строгий;
set hive.exec.dynamic.partition.mode = nonstrict;
Преимущества: 1. Таблица разделов должна быть разбита на разделы, иначе она не будет работать
2. При использовании order by необходимо добавить лимит.
-
Запретите декартово произведение
истинности запроса : строгие режимы 1 и 2 могут выполняться без разделения в строгом режиме и могут выполняться без ограничений,
но не могут выполнять декартово произведение
внимания, даже если установлено hive.exec. dynamic.partition.mode = nonstrict;
также не может выполнять декартово произведение, но также установить для следующих параметров значение false, чтобы можно было
установить hive.strict.checks.cartesian.product = false;
10.8 Отрегулируйте количество преобразователей и редукторов для
поддержания баланса Это необходимо. Слишком много преобразователей и редукторов вызывают чрезмерные накладные расходы на этапе запуска, планирования и выполнения задания. Если количество преобразователей и редукторов слишком мало,
параллелизм хадупа не отображается.
Интерфейс командной строки может видеть приблизительное количество необходимых редукторов:
Количество задач сокращения, определенных во время компиляции: 10
Количество задач сокращения, не указанных. Оценка по размеру входных данных: 3
количество преобразователей: 3; количество редукторов: 1
Hive контролирует количество ruducers размером входных данных. Вы можете использовать следующую команду для расчета входного размера
hdfs dfs -count hdfs: // master: 9000 / hive_dir / stock_basic / stock_info2020414.txt Примечание: значение 760035648B属性 hive.exec.reducers.bytes.per.reducer 默认为 1GB(课本值) 256000000B(查得值) 通过设置这个值进而可以reducer数量调整 (不知道是书上说的不准还是实际的有变化,并不是两个除的值) 一个系统的插槽数(map reduce 个数)是固定的。可以设置属性 hive.exec.reducers.max防止某些大的job消耗完所有插槽。 建议值:reduce槽位个数*1.5/执行中的查询的平均个数
10.9 повторное использование jvm:
личное понимание: когда много маленьких файлов, нужно включить jvm. Это приведет к большим накладным расходам. Благодаря повторному использованию jvm, jvm для одного и того же задания можно использовать n раз. Значение n контролируется параметром mapred.job.reuse.jvm.num.tasks.
Но у этой функции есть недостаток: открытая JVM всегда будет занимать используемый слот задачи. Знайте, что задача превышает
10,10. Индекс немного
меньше 10,11. Регулировка динамического раздела, см. Выше.
10.12. Спекулятивное выполнение: понимание: необходимо вернуться, чтобы обнаружить некоторые медленно выполняющиеся задачи и добавить их в черный список, а затем запустить несколько новых повторяющихся задач. Таким образом, он будет потреблять больше ресурсов из-за повторяющихся вычислений данных.
По maped.map.tasks.speculative.execution и maped.reduce.tasks.speculative.execution
10.13 Множественная группа по в одном MP: Поместите запрос с несколькими группами в одну задачу MP: (но нет Я нашел это, его нужно было изменить)
set hive.multigroupby.singlemr = false
10.14 Виртуальный столбец: На самом деле, когда данные отображаются, они не беспорядочные, а аккуратно отображаются: (я чувствую себя бесполезным)
set hive.exec.rowoffset = true;
Глава 11: Формат файла и метод сжатия
11.1 Определение
набора кодеков установки io.compression.codecs; # Не использовать, не искать
11.2 Выберите код сжатия / декодер.
Высокая степень сжатия увеличит загрузку ЦП. Накладные расходы. Категория: GZIP, BZip2, snappy, LZO
BZip2 имеет самую высокую степень сжатия, а GZIP - лучший выбор для степени сжатия / скорости распаковки.
Snappy, степень сжатия LZO не так хороша, как у первых двух, но скорость распаковки
является еще одним соображением для сжатия: если файл можно разделить, mapreduce необходимо разделить очень большой входной файл (обычно блок файла кратен 64M).
Если его нельзя разделить, появится отдельная задача для чтения всего
файла.GZIP и snappy неделимы, поскольку информация о границах замаскирована. BZip2 и LZO обеспечивают сжатие на уровне блоков.
11.3 Включить промежуточный
набор сжатия hive.exec.compress.intermediate = true
Кодек сжатия по умолчанию для куста - DefaultCodec, то есть org.apache.hadoop.io.compress.DefaultCodec может быть установлен с помощью mapred.map.output.compression.codec, чтобы установить рекомендуемый
набор SnappyCodec mapred.map.output.compression.codec = org.apache.hadoop.io.compress.SnappyCodec;
11.4 Сжатие конечного результата вывода:
set hive.exec.compress.output = true Режим
сжатия может быть установлен с помощью mapred.output.compression.codec Рекомендуется использовать GZIP, но учтите, что GZIP неделим.
установить mapred.output.compression.codec = org.apache.hadoop.io.compress.GzipCodec
Файл последовательности 11.5 поддерживает три уровня сжатия без записи (по умолчанию) блок можно разделить
создать таблицу xxxx (a int), хранящуюся как файл последовательности;
вы можете установить уровень сжатия: set mapred.output.compression.type = BLOCK;
11.6 практика сжатия слегка приводит только к сжатию Исходная 1/4 действительно эффективна.
11.7. О разделе архива см.
Главу 12. Разработка (опущено). Это бесполезно
. Глава 13 Функции (опущено). Вам нужно разработать код Java для написания пользовательских функций udf. Я не хочу рассматривать
главу 14 Streaming.
Подобно потоковой передаче hadoop, вы можете вызывать написанные сценарии python и linux для обработки данных и затем возврата. Эффективность немного ниже, чем у функции UDF. Но вы можете избежать написания кода java. Ха-ха
14.1 Преобразование идентичности select transform (stock_id, stock_name) с использованием '/ bin / cat' как (a, b) из stock_basic_bak limit 100; - Обратите внимание, что вы можете
изменить тип с круглыми скобками или без них.14.2 Изменить тип select transform ( stock_id, stock_name) с использованием '/ bin / cat' как двойника, b из stock_basic_bak;
14.3 Преобразование проекции выберите преобразование (stock_id, stock_name) с использованием '/ bin / cut -f1' в качестве a, b из предела stock_basic_bak 100;
14.4 Операция трансформации select transform (stock_id, stock_name, stock_max_price) с использованием '/ bin / sed s / 0 / tt / g' в качестве a, b, c из предела stock_basic_bak 100;
выберите преобразование (stock_id, stock_name) с помощью '/ bin / sed s / 0 / tt / 'как a, b от предела stock_basic_bak 100;
Дивергенция: изменился ли формат данных различных типов полей после преобразования? Вывод: Тип поля также был изменен после преобразования.
14.5–14.7 Использование распределенной памяти для создания нескольких строк из одной строки:
Добавление файлов в распределенный кеш: это просто позволяет задаче преобразования напрямую использовать сценарий, не определяя, где найти эти файлы.
добавить файл /tmp/python_hive_code/hive_test_1.py # Обратите внимание, что это
преобразование выбора локального пути (строка) с использованием 'python hive_test_1.py' как a, b, c из test_stream_split;
на самом деле, следующее также может быть выполнено напрямую:
выберите преобразование (строка), используя 'python /tmp/python_hive_code/hive_test_1.py' как a, b, c из test_stream_split;
После сценария, использованного в книге, нет никакого python. Возможно, версия другая и синтаксис другой. Здесь вам нужно добавить python и
прикрепить код hive_test_1 следующим образом:- - кодировка: utf-8 - -
SYS Import
# sys.stdout.write (': \ n-')
для строки в sys.stdin.readlines ():
OUT = line.split (',')
Print ('\ t'.join (OUT))
имеют Остающаяся проблема:
в выходных данных есть пустые строки 14.7-8 для дальнейшего исследования - продолжение следует
Глава 15: Формат файла и записи
15.1-15.2 Формат файла и записи Владелец таблицы куста - системный пользователь Linux, а не по умолчанию, и по умолчанию - dbname.15.3
Формат файла:
1. sequencefile: двоичный файл, содержащий пары ключ-значение,
2. rcfile, степень сжатия относительно высока, и нет необходимости физически хранить некоторые пустые столбцы.
3.
Улей текстовых файлов может указывать другой формат ввода и тип формата вывода: все равно, имя пакета должно быть чувствительным к регистру
create table tt (a int)
ФОРМАТ СТРОКИ SERDE'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe '
хранится как
inputformat'org.apache.hadoop.hive.ql.io.RCFileInputFormat '
outputformat'org.apache.hadoop.hive.ql.io.RCFileOutputFormat';
注意必须要 ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe' 否则用text类的表插入数据会报错,建表不会报错。。很奇怪.
hdfs dfs -cat 命令无法查看rcfile 不过 hive --service rcfilecat可以查看rcfile文件
hive --service rcfilecat hdfs://master:9000/hive_dir/tt/000000_0 虽然可以看 但是和查出来的数字类数据不一样,可能是序列化的问题.中文不受影响
附:自定义输入格式:
15.4 记录格式:serde是序列化和反序列化的简写。 引用见15.3
15.5 csv 和tsv serde
create table stock( stock_id string ,stock_name string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS TEXTFILE;
#待验证,又是csv 又是STORED AS TEXTFILE不知道是什么意思。
15.6-15.8略
15.9 xpath 相关函数:百度吧
15.10 验证了 with serdeproperties 没啥用
json serde: org.apache.hive.hcatalog.data.JsonSerDe org.apache.hadoop.hive.contrib.serde2.JsonSerde
drop table test_json_t;
create table test_json_t
(
id string,
index string ,
guid string ,
balance string
) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
with serdeproperties
(
"id"="s._id",
"index"="s.index",
"guid"= "s.guid",
"balance"= "s.balance"
)
stored as textfile;
load data local inpath '/tmp/json_data/' overwrite into table test_json_t ;
《hive实战》 提取json数据
1.使用udf查询:CREATE TABLE json_table (json string);
load data local inpath '/tmp/json_data/' into table json_table;
SELECT get_json_object(json_table.json, '$') as json FROM json_table;
select get_json_object(json_table.json,'$.balance') as balance,
get_json_object(json_table.json, '$.gender') as gender,
get_json_object(json_table.json, '$.phone') as phone,
get_json_object(json_table.json, '$.friends.name') as friendname
from json_table;
2.使用Serde查询
先增加jar包:hive自带
add jar /opt/tools/apache-hive-2.3.6-bin/hcatalog/share/hcatalog/hive-hcatalog-core-2.3.6.jar
drop table json_serde_table;
CREATE TABLE json_serde_table (
id string,
index string,
guid string,
balance string
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
WITH SERDEPROPERTIES ( "mapping._id" = "id" );
load data local inpath '/tmp/json_data/' into table json_serde_table;
带下划线的暂时不知道怎么搞
《hive实战》 orc file 也是列式存储
create table stock_test_orc_file stored as orc as select * from stock_basic limit 200000; --10.59M
create table stock_test_normal_file as select * from stock_basic limit 200000; --1.68M
create table stock_test_rc_file --9.28 感觉效果不明显 还是用 orc file 吧
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe'
stored as
inputformat 'org.apache.hadoop.hive.ql.io.RCFileInputFormat'
outputformat 'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'
as select * from stock_basic limit 200000;
对比的确压缩了很多
orc 或者rc file 的小文件合并: alter table stock_test_orc_file concatenate;
hdfs dfs -cat hdfs://master:9000/hive_dir/stock_test_normal_file/000000_0
hive --service rcfilecat hdfs://master:9000/hive_dir/stock_test_rc_file/000000_0
rcfilecat 看不了orc file 百度下怎么看
Глава 16: Служба бережливости Hive:
16.1 Запустите
куст экономичного сервера --service hiveserver2 и
проверьте, успешно ли запущен мониторинг
netstat -nl | grep 10000
16.2 Настройка groovy Использовать версию jdk для HiveServer неуместно. Откажитесь от
главы XVII: безопасность (Нет)
18.2 hive проверьте
новый файл, чтобы установить разрешения по умолчанию umask value
set hive.files.umask.value = 0002; # одновременно не
установите следующее true (по умолчанию false), если у пользователя нет разрешения на удаление таблиц базовые данные, куст не позволит пользователю удалить таблицу:
sET hive.metastore.authorization.storage.checks = true;
18.3hive управление правами
только нижнее значение установлено на true перед запуском функции разрешений по умолчанию false
на sET Hive .security.authorization.enabled
18.3.1 набор пользователей, групп и ролей
hive.security.authorization.enabled = true; больше не может быть установлен во время выполнения и помещен в hive-site.xml для его установки, но это не работает.
Просмотр системы набора имен пользователей : user.name;
полностью не работает. . Позже, см.
Главу 18 Блокировка:
19.1 Улей и смотритель зоопарка поддерживают функцию блокировки.
Сначала установите zookeeper в соответствии с установленным методом zookeeper,
а затем добавьте конфигурацию в hive-site.xml, чтобы добавить следующие атрибуты
<property>
<name>hive.zookeeper.quorum</name>
<value>master,slaves1,slaves2</value>
</property>
<property>
<name>hive.support.concurrency</name>
<value>true</value>
</property>
在hive中 show locks; 查看锁
19.2 显式锁和独占锁
lock table stock_basic exclusive;
select * from stock_basic limit 10 ;
执行极慢在本身的窗口执行也很慢 应该都被锁了 :疑问,如果本身的窗口都不能进行操作,锁表他有什么意义呢
解锁表 解锁后马上查询就有结果
unlock table stock_basic;
«Hive Actual Combat»:
создание отчетов об ошибках невозможно установить hive.execution.engine; просмотреть движок улья по умолчанию mr [mr, tez, spark]
выбрать количество (*) из stock_basic; - 69,859 секунд
установить hive.execution.engine = tez;
установить улей .prewarm.enabled = true;
установить hive.prewarm.numcontainers = 10;
Формат хранения: orc and parquet и vectorized query
parquet: еще один столбчатый формат хранения. Постоянно храните все данные каждого столбца на диске, поэтому он имеет преимущества в производительности, аналогичные
таблице сброса orc stock_test_orc_file;
создать таблицу stock_test_orc_file, хранящуюся как orc, как выбрать из stock_basic;
выбрать count ( ) из stock_test_orc_file; --0.98 с
Векторизованный запрос: механизм выполнения запросов по умолчанию обрабатывает одну строку за раз, поэтому во вложенных циклах требуется несколько вызовов виртуальных методов, что очень неэффективно с точки зрения ЦП.
Функция куста в векторизованном запросе. Его цель - считывать данные в 1024 строках на пакет и каждый раз обрабатывать весь набор записей, тем самым устраняя эти неэффективные проблемы.
Для типичных операций запроса: сканирование, фильтрация, суммирование и связывание доказали, что скорость выполнения вектора увеличилась на порядок,
но векторизованные запросы требуют
набора хранения в формате orc hive.vectorized.execution.enabled = true;