Руководство по программированию Hive-Заметки-2

Примечание: «Улей фактических боевых действий практический улей руководство по системе хранилища данных 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. Запретите декартово произведение
    истинности запроса : строгие режимы 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;

рекомендация

отblog.51cto.com/9990261/2551665
рекомендация