Presto和Redis结合使用

官方文档:https://prestodb.io/docs/current/connector/redis.html

说明:

版本Redis 2.8.0+

不支持redis cluster

只支持Redis string 和 hash类型的 value,不支持 sets 和 zsets 类型的value

1.安装redis

mkdir /data/redis

cd /data/redis

mkdir conf pidfiles log data script

解压

cd /opt/redis

tar -xzvf redis-4.0.11.tar.gz

cd redis-4.0.11

make

make test

安装

make install PREFIX=/data/redis

配置

cd /data/redis/conf

vi redis.conf

 

文件内容如下:

 

# 后台运行服务
daemonize yes
# 服务pid保存位置
pidfile /data/redis/pidfiles/redis.pid
# 绑定服务ip (注意修改)
bind 192.168.6.12
# 服务端口
port 6379
# 开启防护模式
protected-mode yes
# 当前节点最大内存(根据数据量进行估算)
maxmemory 10gb
# 过期策略 (根据业务进行修改,如果数据能能丢就采用当前模式。详情参考下面含义)
maxmemory-policy noeviction
# TCP监听的最大连接数
tcp-backlog 32768
# 连接空闲超时时间(如果是长链接保持不变,如果短连接建议修改)
timeout 0 
# tcp 心跳间隔
tcp-keepalive 30
# 日志级别
loglevel notice
# 日志位置
logfile /data/redis/log/redis.log
# 配置持久化目录
dir /data/redis/data
# 持久化rdb文件名称
dbfilename redis.rdb
# 持久化失败后,不允许执行写入操作
stop-writes-on-bgsave-error no
# 持久化条件(是否生成rdb持久化文件,一般采用自动备份和定时备份,save "" 表示关闭自动备份,定时备份通过定时任务触发bgsave完成)
# 下面不进行自动备份
#save "" 
# 下面表示打开自动备份
save 900 1
save 300 10
save 60 3000
# aof持久化(aof持久化比较及时,但恢复慢,文件大。一般跟rdb一样都打开,除非定时任务触发备份)
appendonly yes
# 开启慢查询记录
slowlog-log-slower-than 10000
slowlog-max-len 128
# 配置客户端最大连接数
maxclients 15000
# 配置lua脚本最大执行时长
lua-time-limit 5000
# 优化存储编码
hash-max-ziplist-entries 512
hash-max-ziplist-value 2048
zset-max-ziplist-entries 512
zset-max-ziplist-value 512
set-max-intset-entries 512

启动

 

/data/redis/bin/redis-server /data/redis/conf/redis.conf 1>> /data/redis/log/redis.log 2>&1

测试

/data/redis/bin/redis-cli -c -h 192.168.6.12 -p 6379

set foo bar

get foo

 

关闭

./redis-cli  -h 192.168.6.12 -p 6379 shutdown  关闭

2.在presto中配置redis相关参数

vi etc/catalog/redis.properties

connector.name=redis redis.table-names=default.test,default.simple 
redis.nodes=192.168.6.12:6379
# 需要查询的表要都要写在这里,而且需要在etc/redis目录下定义对应表的json文件,
#每次修改后需要重启presto生效 

 

3.在presto中配置redis的table信息

表test

 

vi etc/redis/test.json

{
   "tableName": "test",
   "schemaName": "default",
   "key": {
       "dataFormat": "raw",
       "fields": [
            {
                "name":"redis_key",
                "type":"VARCHAR",
                "hidden":"false"
           }
       ]
   },
   "value": {
       "dataFormat": "json",
       "fields": [
           {
                "name":"row_number",
                "mapping":"rowNumber",
                "type":"BIGINT"
           },
           {
                "name":"customer_key",
                "mapping":"customerKey",
                "type":"BIGINT"
           },
           {
                "name":"name",
                "mapping":"name",
                "type":"VARCHAR"
           }
      ]
    }
}

表simple

vi etc/redis/simple.json

{
   "tableName": "simple",
   "schemaName": "default",
   "key": {
       "dataFormat": "raw",
       "fields": [
            {
                "name":"redis_key",
                "type":"VARCHAR",
                "hidden":"false"
           }
       ]
   },
   "value": {
       "dataFormat": "raw",
       "fields": [
           {
                "name":"redis_value",
                "type":"VARCHAR"
           }
      ]
    }
}

 

4.写数据到redis中

 

/data/redis/bin/redis-cli -c -h 192.168.6.12 -p 6379

在redis命令行下执行:

set key1 "{\"rowNumber\":1,\"customerKey\":1,\"name\":\"Customer#000000001\"}"

 set key2 "{\"rowNumber\":3,\"customerKey\":3,\"name\":\"Customer#000000003\"}"

 set key3 "{\"rowNumber\":5,\"customerKey\":5,\"name\":\"Customer#000000005\"}"

 set key4 "{\"rowNumber\":7,\"customerKey\":7,\"name\":\"Customer#000000007\"}"

 set key5 "{\"rowNumber\":9,\"customerKey\":9,\"name\":\"Customer#000000009\"}"

 set key6 "{\"rowNumber\":9,\"customerKey\":19,\"name\":\"Customer#0000000019\"}"

 

5.查询数据

bin/launcher restart

bin/presto --server 192.168.6.12:8080 --catalog redis --schema default

6.遇到问题

定义了两张表,simple表两个字段,分别对应key和value;test表四个字段,需要把redis的value的json值解析成相应的字段值。查询simple表正常,查test表报错了,后来发现是有一条数据foo/bar,value值不是json,删掉这条数据后正常。

 

 

7、生成批量测试数据

用redis自带的debug命令生成测试数据

在redis-cli客户端下执行,生成1千万测试数据

debug populate 10000000

#debug创建的测试数据内容为:key:#->value:#,比如key:123->value:123

查看当前数据量:

/data/redis/bin/redis-cli -c -h 192.168.6.12 -p 6379

dbsize

 

 

8、在presto中查询

/opt/presto/presto-server-0.215/bin/presto --server 192.168.6.12:8080 --catalog redis --schema default

查看表

show tables;

不支持删表

drop table test;

 

统计表数据量,1千万的数据量,统计用时3分钟多

select count(*) from simple;

查询全部数据

select * from simple;

控制台会直接输出一部分数据,按回车会显示更多数据,在web页面可以看到查询进度;过了一段时间发现报错了

com.facebook.presto.spi.PrestoException: Query 20190118_094926_00012_4dxq5 has not been accessed since 2019-01-18T17:49:26.869+08:00: currentTime 2019-01-18T17:54:27.170+08:00

 

带where条件查询,应该遍历所有的数据,速度很慢

select * from simple where redis_key='key:6019788';

 

总结:

Presto和Redis结合使用效果并不理想,所以不建议这样使用。 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Presto和Spark是两种用于大数据处理的开源工具,它们在某些方面有所不同。以下是它们之间的一些区别[^1]: 1. **架构和设计**:Presto是一个分布式SQL查询引擎,它使用内存计算和分布式执行来实现高性能查询。它采用了MPP(Massively Parallel Processing)架构,将查询分解为多个任务并在多个节点上并行执行。相比之下,Spark是一个通用的大数据处理框架,它提供了分布式数据处理、机器学习和图计算等功能。Spark使用RDD(Resilient Distributed Datasets)作为其核心数据结构,并通过DAG(Directed Acyclic Graph)调度任务。 2. **查询性能**:在涉及BI类型查询时,Presto表现出色,因为它专注于快速查询和低延迟。Presto的查询优化器和执行引擎针对交互式查询进行了优化。而Spark SQL在大型分析查询方面表现出色,它利用了Spark的内存计算和分布式执行能力,适用于复杂的数据处理和分析任务。 3. **易用性和配置**:在配置方面,Presto相对较容易设置和管理。它使用基于文本的配置文件,并提供了易于理解和调整的参数。相比之下,Spark SQL的配置相对复杂,需要更多的配置和调优。 4. **应用场景**:Presto和Spark SQL都是用于处理大数据的工具,但它们在应用场景上有所不同。Presto适用于需要快速查询和低延迟的BI类型查询,例如实时分析和交互式查询。而Spark SQL适用于大型分析查询和复杂的数据处理任务,例如批处理、机器学习和图计算。 综上所述,Presto和Spark在架构、查询性能、易用性和应用场景等方面存在一些区别。选择使用哪个工具取决于具体的需求和场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值