hive 分桶

1、hive分桶可以加速JOIN速度。
2、hive可以独立分桶,也可以先分区,再进行分桶。

参考资料:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables

3、可以执行抽样查询:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Sampling

4、其他优点可以参考:

https://www.qubole.com/blog/5-tips-for-efficient-hive-queries/

 

首先创建表,这里创建的是先分区再分桶。其实我们是可以不先分区,直接分桶,具体根据你的需求:

CREATE TABLE user_info_bucketed(user_id BIGINT, firstname STRING, lastname STRING)
COMMENT 'A bucketed copy of user_info'
PARTITIONED BY(ds STRING)
CLUSTERED BY(user_id) INTO 256 BUCKETS;

这时候可以在spark的任务栏里面看见,多了一个stage,这个stage的任务数正好等于分桶数256.这时我们再检查HDFS中该表目录下的数据文件数量正好也等于256个。

然后进行表插入。

set hive.enforce.bucketing = true; -- (Note: Not needed in Hive 2.x onward)
FROM user_id
INSERT OVERWRITE TABLE user_info_bucketed
PARTITION (ds='2009-02-25')
SELECT userid, firstname, lastname WHERE ds='2009-02-25';

分桶后,可以再HDFS中看到该表目录下存在多个子文件目录:

——————————————————————–

—-不启用bucket join

select *
from ods.p_t_contract_master m
left outer join ods.p_t_customer c on m.applicant_id = c.customer_id
limit 100;

2018-08-28 17:34:06,160 Stage-4_0: 192(+174)/735 Stage-5_0: 0/1099
Status: Finished successfully in 660.92 seconds

select *
from ods.p_t_contract_master m
left outer join t_customer_bucket c on m.applicant_id = c.customer_id
limit 100;

2018-08-28 17:49:00,042 Stage-6_0: 472/472 Finished Stage-7_0: 0(+180)/1099
Time taken: 728.227 seconds, Fetched: 100 row(s)

select *
from t_contract_master_bucket m
left outer join ods.p_t_customer c on m.applicant_id = c.customer_id
limit 100;
2018-08-28 17:55:06,944 Stage-8_0: 0(+192)/808 Stage-9_0: 0/1099
Time taken: 845.256 seconds, Fetched: 100 row(s)

select *
from t_contract_master_bucket m
left outer join t_customer_bucket c on m.applicant_id = c.customer_id
limit 100;

2018-08-28 18:09:32,400 Stage-10_0: 0(+192)/545 Stage-11_0: 0/1099
Time taken: 707.371 seconds, Fetched: 100 row(s)

——-启用bucket join
set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;

select *
from ods.p_t_contract_master m
left outer join t_customer_bucket c on m.applicant_id = c.customer_id
limit 100;

select *
from t_contract_master_bucket m
left outer join ods.p_t_customer c on m.applicant_id = c.customer_id
limit 100;

select *
from t_contract_master_bucket m
left outer join t_customer_bucket c on m.applicant_id = c.customer_id
limit 100;

2018-08-28 18:21:32,583 Stage-12_0: 0(+8)/472 Stage-13_0: 0/1099
Status: Finished successfully in 661.10 seconds

hive parquet表启用压缩

1、首先表必须是要确保是parquet表,之后的语句才会有效。因为是对hive中的parquet表进行压缩。

2、
SET parquet.compression=SNAPPY;
SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
SET mapred.output.compression.type=BLOCK;

该设置其实只对插入数据有效,对查询是默认有效的。

CREATE TABLE t_r_cust_cont0720_snappy(
ecif_id string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS PARQUET
TBLPROPERTIES ("parquet.compression"="SNAPPY"); ---表级的压缩

3、检查压缩是否有效
desc formatted t_r_cust_cont0720_snappy;

压缩后的表:

4、经过计算压缩比为:1:6.压缩后的数据为原来的六分之一。

————————————————————————————
虽然从数据文件上看来是进行了压缩,但是不知道为什么里面的compressd依然为NO。


这里面我之前有个错误。没有分清totaldatasize和rawdatasize。简单理解就是rawdatasize是原始文件大小,即压缩前;totaldatasize是实际存储文件大小,即压缩后。

下面对一张表进行压缩前的情况

下面是压缩后的情况

比较明显的就是使用snappy压缩后文件数量降低了,同时totaldatasize降低了一倍,但是rawdatasize一致。同时compresed始终为NO,只能通过parquet.compression为Snappy辨别表是否为压缩表。

接着我使用了压缩表进行脚本测试。性能和压缩前几乎一致,同时还减少了存储空间。

blocksize为128m 不压缩 23mins

blocksize为128m 只压缩新表 26mins

blocksize为128m 压缩 24mins

Centos7 安装WordPress

首先,我不得不吐槽说真难装。搞了大半天。

按照步骤来讲主要如下:

1、安装apache(省略)

2、安装php(所有问题都是它的)

3、安装mysql(省略。参考官网:https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html 非常详细)

4、安装wordpress(没啥问题。就是数据库连接不上,问题根源都是PHP的问题)

这里主要说说我遇到的问题

1、安装php

a)安装错误的版本:使用yum安装的时候,默认安装的5.X版本,后来查看了wordpress的要求,必须使用7.2以上版本。要安装7.2以上版本,请参考:https://www.cyberciti.biz/faq/how-to-install-php-7-2-on-centos-7-rhel-7/

b)安装好后,始终在apache的modules目录下没有libphp7.so

我把认为php72所有的相关包都安装了一遍,结果这个文件在php72-php包中。

安装这个包以后,连apache的php.conf都不用自己去瞎整了。它会自动生成一个conf文件。看了下内容,相当高级,就不用自己去写了。

c)上面处理完后,还是连接不上mysql。原因是php.ini默认没有启用mysqli的extension。找到/etc/php.ini,注释掉这行即可:

再执行apache重启即可。

systemctl restart httpd