presto安装和Hive优化

presto安装

create table t_order(id string,amount int,user_id int)
row format delimited fields terminated by ','
stored AS orc tblproperties("orc.compress" = "snappy");

create table t_mid_order(id string,amount int,user_id int)
row format delimited fields terminated by ','

insert overwrite table t_order
select * from t_mid_order sort by amount desc;

select
 "to"."id" as "id","amount","user_name","age","sex"
from
hive."default"."t_order" AS "to"
left outer join
mysql."1801e"."t_user" AS "tu" on "to"."user_id" = "tu"."id"
where "to"."amount" > 10000


select
t_order.id as oid,amount,user_id,name,sex,age
from "hive"."test"."t_order" as t_order
join "mysql"."1710e"."t_student" as stu
on t_order.user_id=stu.id

presto对hive要求的存储优化
1)hive表要合理设置分区
  Presto读取hive元数据,合理设置hive分区可以减少presto读取数据的量,从而提高查询性能
2)hive表使用列式存储
  Presto对orc文件读取做了特定优化,因此在hive中创建presto使用的表的时候,建议采用orc格式存储,相对于Parquet,Presto对Orc支持更好
3)使用压缩,由于即席查询需要快速解压,所以建议用Snappy压缩hive表
4) 对于hive中要使用presto查询的表,如果有经常过滤的字段,可以将字段预排序后,插入orc格式的表中
在查询的过滤阶段,orc格式支持跳过不必要的数据,从而可以增加筛选速度

t_score
id,name,score
parquet+lzo

t_score_presto
store as orc snappy

insert into t_score_prest
select
from t_score
order by score

select * from t_score_presto where score > 80

presto sql语句的查询优化

1)只选择必要字段
  select * 最好不要使用
  select column1,cloumn2,... from是好的
2)过滤条件中最好有分区
  如果where后面跟分区条件的话,presto读取的数据就会少很多
3)group by语句的优化
 将group by语句后面的字段按照每个字段的基数进行降序排

t_stu
uid sex score
select from t_stu group by sex,uid是不好的,因为uid的基数大,sex的基数少
select from t_stu group by uid,sex这样是好的

4)Order by时最好后面跟Limit
如果加了limit就是求的topn,可以减少内存压力
order by排序是把数据搞到一个worker节点中进行排,但是我我读数据是很多maptask去读
如果不limit,那么所有maptask中读取的数据全都要reduce到一个worker上去排序,
但是如果Limit了,那么maptask会在自己的内存中先排,然后取自己排序的前10个,这样所有maptask聚合到一个reduce上的时候,只返回自己那个map的前10个

例如有10个maptask,每个maptask读了一万条数据,如果不用limit的话,那reduce要处理10W条
如果用limit 10的话,每个maptask只返回十条,那reduce就只用处理100条就可以了

select * from t1 order by score limit 10是好的
select * from t1 order by score

5) presto提供一些近似聚合函数
   count(distinct x)可以使用approx_distinct代替,误差大概2%-3%,但是查询速度大大提升

6) presto对join的一些优化
  presto的join默认算法为broadcast join,所以在join的时候将数据量大的表放到左边,数据量小的表放右边
  a(大表) join b(小表)

 presto还有一种join算法为hash join

 7)row_number函数尽量用rank_number代替,presto的rank_number性能比较好

 8)尽量使用with语句
 with xxx as
 (

 )
 select

 from a
 union all
 xxx
 因为union all(竖着)连表比join(横着)效率要高的多

 9)多多利用子查询,当频繁的使用一张表的时候,要把这个表作为一个子查询剥离出来,避免重复read
with语句就是其中一种

当presto查询hive报错
Unable to create input format org.apache.hadoop.mapred.TextInputFormat
去hadoop/share目录下将
hadoop-hdfs-2.8.0.jar
hadoop-common-2.8.0.jar
hadoop-mapreduce-client-common-2.8.0.jar
hadoop-mapreduce-client-app-2.8.0.jar
hadoop-mapreduce-client-shuffle-2.8.0.jar
hadoop-mapreduce-client-jobclient-2.8.0.jar
hadoop-lzo-0.4.21-SNAPSHOT.jar
复制到presto/plugin/hive-hadoop2下

使用snappy压缩
hadoop安装snappy库
yum  install gcc c++, autoconf, automake, libtool
下载snappy
wget http://snappy.googlecode.com/files/snappy-1.1.1.tar.gz
解压
cd snappy-1.1.1
使用
./configure
make && make install
默认安装路径:/usr/local/lib下面,不要修改默认路径
将/usr/local/lib目录下的全部文件分发到集群的所有机器上
检查安装是否成功
ls /usr/local/lib/libsn*

下载hadoop-snappy源码包
https://github.com/electrum/hadoop-snappy
或者取谷歌代码库下
解压
cd hadoop-snappy-master
mvn clean package
cd hadoop-snappy-master/target
tar -zxvf hadoop-snappy-0.0.1-SNAPSHOT.tar.gz
cd hadoop-snappy-0.0.1-SNAPSHOT/lib
将其中的文件拷贝到hadoop安装路径的lib下
cp hadoop-snappy-0.0.1-SNAPSHOT.jar /usr/local/hadoop-2.7.3/lib
cd native
cp -r Linux-amd64-64/ /usr/local/hadoop-2.7.3/lib/native/
然后分发cd /usr/local/hadoop-2.7.3
scp -r lib hadoop2:$PWD

安装protobuf2.5
下载protobuf2.5
https://github.com/protocolbuffers/protobuf/releases/tag/v2.5.0
tar -zxvf protobuf-2.5.0.tar.gz -C /usr/local/src
cd /usr/local/src/protobuf-2.5.0
./configure --prefix=/usr/local/protobuf
make
make check
make install
添加环境变量
vi /etc/profile
PROTOBUF_HOME=/usr/local/protobuf
PATH=$PATH:PROTOBUF_HOME/bin
export PROTOBUF_HOME PATH

安装maven

下载hadoop-2.7.3-src源代码
yum install -y cmake zlib zlib-devel openssl openssl-devel
解压,进入目录
mvn package -Pdist,native -DskipTests -Dtar -rf :hadoop-common -Drequire.snappy -X

编译完成后
cd hadoop-2.2.0-src/hadoop-dist/target/hadoop-2.7.3
将里面的lib/native目录下的文件全部覆盖到现有环境hadoop安装路径的lib/native下

cd /usr/local/hadoop-2.7.3/etc/hadoop
vi hadoop-env.sh
添加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
vi core-site.xml
添加
<property>
    <name>io.compression.codecs</name>
    <value>org.apache.hadoop.io.compress.GzipCodec,
            org.apache.hadoop.io.compress.DefaultCodec,
            org.apache.hadoop.io.compress.BZip2Codec,
            org.apache.hadoop.io.compress.SnappyCodec,
            com.hadoop.compression.lzo.LzoCodec,
            com.hadoop.compression.lzo.LzopCodec
    </value>
</property>

vi mapred-site.xml
<property>
    <name>mapred.child.env</name>
    <value>LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib:/usr/local/hadoop-2.7.3/lib/native/Linux-amd64-64</value>
</property>
分发两个文件到集群全部机器

-

重启hdfs,使用
hadoop checknative -a
检查hdfs是否已经支持snappy

如果还需要hbase支持snappy
cd /usr/local/hbase-1.3.3/conf/
vi hbase-env.sh
添加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
export HBASE_LIBRARY_PATH=$HBASE_LIBRARY_PATH:$HBASE_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
重启hbase

mapreduce使用snappy压缩

再mapred-site.xml中设置
<!--map到reduce的中间计算结果使用snappy压缩-->
<property>  
   <name>mapreduce.map.output.compress</name>  
    <value>true</value>  
</property>  
 
<property>  
    <name>mapreduce.map.output.compress.codec</name>  
    <value>org.apache.hadoop.io.compress.SnappyCodec</value>  
</property>

<property>  
    <name>mapred.child.env</name>  
    <value>LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib:/usr/local/hadoop-2.7.3/lib/native/Linux-amd64-64</value>  
</property>

也可以在代码中设置
Configuration conf = new Configuration();
conf.set("mapreduce.map.output.compress","true");
conf.set("mapreduce.map.output.compress.codec","org.apache.hadoop.io.compress.SnappyCodec");

如果要在reduce阶段输出最终的文件为snappy
需要在代码中设置
conf.set("mapreduce.output.fileoutputformat.compress","true");
conf.set("mapreduce.output.fileoutputformat.compress.type","RECORD");
conf.set("mapreduce.output.fileoutputformat.compress.codec","org.apache.hadoop.io.compress.SnappyCodec");

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值