superset教程
博客专区 > rootliu 的博客 > 博客详情
superset教程
rootliu 发表于1个月前
superset教程
  • 发表于 1个月前
  • 阅读 26
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

☰MENU

superset教程

22 MAY 2017

前言

为了刺激自己学习和使用superset的欲望,可以点击这里,先看下github上的动图,并且个人感觉SQL Lab也是一个特别赞的功能。

关于superset

  • 官网: 
    http://airbnb.io/projects/superset/
  • 文档: 
    http://airbnb.io/superset/
  • 主要功能: 
    • 快速创建可交互的、直观形象的数据集合
    • 有丰富的可视化方法来分析数据,且具有灵活的扩展能力
    • 具有可扩展的、高粒度的安全模型,可以用复杂规则来控制访问权限。目前支持主要的认证提供商:DB、OpenID、LDAP、OAuth、和Flask AppBuiler的REMOTE_USER
    • 使用简单的语法,就可以控制数据在UI中的展现方式
    • 与Druid深度结合,可快速的分析大数据
    • 配置缓存来快速加载仪表盘

下面从安装开始介绍superset。

安装Python

需要注意的是:superset是在Python2.7和Python3.4下测试的,Airbnb生产环境使用的Python版本是2.7.x,并且Airbnb不打算支持Python2.6。 
Python的安装步骤,在这里就不做说明了,因为Centos7自带的Python已经是2.7.x版本了,所以无需额外安装。可以通过python -V查看Python的版本。 
本文是在以下环境下测试的:

  • 操作系统:CentOS Linux release 7.3.1611 (Core)
  • Python:2.7.5
  • numpy:1.7.0
  • pandas:1.19.2
  • superset:0.18.2

安装setuptools

curl https://bootstrap.pypa.io/ez_setup.py | sudo python -  


安装完成之后,验证一下:

[vagrant@hadoop-slave-1 ~]$ easy_install --version
setuptools 33.1.1 from /usr/lib/python2.7/site-packages/setuptools-33.1.1-py2.7.egg (Python 2.7)  

安装依赖的软件包

sudo yum install -y gcc-c++ python-devel libffi libffi-devel openssl openssl-devel  cyrus-sasl-lib cyrus-sasl-devel cyrus-sasl gettext  

安装flask

sudo easy_install flask  

安装numpy 1.7.0

下载:

curl -o numpy-1.7.0.tar.gz  https://pypi.python.org/packages/e7/b8/0eec6203c783047760db02f86791814c860397a7c79c444ddabc8a2f1c69/numpy-1.7.0.tar.gz#md5=4fa54e40b6a243416f0248123b6ec332  


解压:

tar zxf numpy-1.7.0.tar.gz  


安装:

cd numpy-1.7.0/  
sudo python setup.py install  

安装pandas 0.19.2

下载:

curl -o pandas-0.19.2.tar.gz https://pypi.python.org/packages/08/9d/31ec596099f14528fc6ad39428248ac5360f0bb5205a3ee79a5d1cf260fb/pandas-0.19.2.tar.gz#md5=26df3ef7cd5686fa284321f4f48b38cd  


解压:

tar zxf pandas-0.19.2.tar.gz  


安装:

cd pandas-0.19.2/  
sudo python setup.py install  

安装superset 0.18.2

下载

curl -o superset-0.18.2.tar.gz  https://pypi.python.org/packages/56/53/83d8e2d6cd2c36d0318f82b7f611a07e534e7fb0afe3dd5424a57f114082/superset-0.18.2.tar.gz#md5=27ea370cc453a1937e9209778fc15ab0  


解压:

tar zxf superset-0.18.2.tar.gz  


安装:

cd superset-0.18.2/  
sudo python setup.py install  

至此,superset就安装完毕了,下面开始superset的入门教程。

superset入门教程

1,创建管理员账户

fabmanager create-admin --app superset  

在输入用户名,姓名,邮箱,密码之后,fabmanager会在用户的主目录下创建.superset隐藏目录,并在该目录下创建一个sqlite3数据库。执行下面的命令可以看到上一步创建的用户被保存到了ab_user表中: 
1.jpg

2,初始化数据库

superset db upgrade  

3,加载一些测试数据

superset load_examples  

4,创建默认的角色和权限

superset init  

5,启动web服务器

superset runserver  


web服务器的默认端口是8088,可以通过-p选项绑定其他的端口;也可以通过-d选项启动一个用于开发的服务器。 
需要注意的是: 
superset默认的应用服务器是gunicorn,但是gunicorn是无法在windows上工作的,所以在windows上只能使用用于开发的服务器。

启动web服务器之后,就可以使用浏览器访问superset了。

配置superset

可以通过创建一个叫做superset_config.py的模块,并将它放到PYTHONPATH下的方式,配置superset。下面是一个示例:

#---------------------------------------------------------
# Superset specific config
#---------------------------------------------------------
ROW_LIMIT = 5000  
SUPERSET_WORKERS = 4

SUPERSET_WEBSERVER_PORT = 8088  
#---------------------------------------------------------

#---------------------------------------------------------
# Flask App Builder configuration
#---------------------------------------------------------
# Your App secret key
SECRET_KEY = '\2\1thisismyscretkey\1\2\e\y\y\h'

# The SQLAlchemy connection string to your database backend
# This connection defines the path to the database that stores your
# superset metadata (slices, connections, tables, dashboards, ...).
# Note that the connection information to connect to the datasources
# you want to explore are managed directly in the web UI
SQLALCHEMY_DATABASE_URI = 'sqlite:////path/to/superset.db'

# Flask-WTF flag for CSRF
CSRF_ENABLED = True

# Set this API key to enable Mapbox visualizations
MAPBOX_API_KEY = ''  


在这个配置模块中,也可以定义被Flask App Builder(superset所使用的web框架)使用的参数,关于这部分配置,请查看这里。 其中有两个需要改变的参数:

  • SQLALCHEMY_DATABASE_URI 
    它的默认值是~/.superset/superset.db,该参数用来指定 保存superset元数据(比如slices、connections、tables、dashboards等)的数据库 的Sqlalchemy连接字符串(要搜索的数据源的连接信息是由web UI直接管理的)
  • SECRET_KEY 
    它是一个很长的随机字符串

数据库依赖

默认情况下,superset是把元数据保存到sqlite中的,所以除了sqlite之外,superset不依赖任何数据库。如果想要把superset元数据保存到其它的数据中,那么需要安装相应的驱动以及给SQLALCHEMY_DATABASE_URI参数指定一个正确的值。下面是一些推荐使用的数据库、数据库驱动以及对应的SQLAlchemy URI前缀:

2.jpg

缓存

superset使用Flask-Cache来缓存数据。在superset_config.py中,可以通过CACHE_CONFIG参数配置缓存所使用的后端。 
Flask-Cache支持多种缓存后端,比如Redis、Memcached、SimpleCache(in-memory)、local filesystem。以redis为例,首先应该安装Python的redis驱动:

sudo easy_install redis  

然后在superset_config.py中增加如下的配置:

CACHE_CONFIG = {  
        "CACHE_TYPE": "redis",
        "CACHE_REDIS_URL": "redis://[redis:<密码>]@<redis_host>:<redis_port>/<redis-db>",
        "CACHE_KEY_PREFIX": "A CACHE_KEY_PREFIX"
}

与SQLAlchemy的深度集成

在superset中可以通过SQLAchemy暴漏的参数调整数据库连接信息,在Database编辑页面,可以看到一个Extra域(值是一个Json串): 
1.png
在这个Json串中可以包含额外的配置选项。其中engine_params所指定的参数会传递给sqlalchemy.create_engine调用;metadata_params所指定的参数会传递给sqlalchemy.MetaData调用。更多详细信息,可以阅读SQLAlchemy的文档。

中间件

superset允许自定义中间件,方法是:

  • 编写自己的WSGI中间件
  • superset_config.py中增加ADDITIONAL_MIDDLEWARE参数,该参数的值是一个 中间件类 的列表

比如:

# superset_config.py

# other configuration...

class TestMiddleware(object):  
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        print("test middleware")
        return self.app(environ, start_response)
ADDITIONAL_MIDDLEWARE = [TestMiddleware]  

升级superset

sudo easy_install --upgrade superset  
superset db upgrade  
superset init  

SQL Lab

SQL Lab是一个非常强大的SQL IDE,它可以和所有与SQLAlchemy兼容的数据库一起使用。默认情况下,查询是在web请求的作用域中执行的,因此当web请求超时的时候,查询也会超时。 
为了支持运行时间超过web请求的超时时间的查询,superset支持异步查询,配置异步查询的方式如下:

  • 在创建数据源的时候,勾选Allow Run Async域 
    3.jpg
  • superset_config.py模块中,通过CELERY_CONFIG配置celery的broker和result backend,注意:worker和web服务进程应该使用相同的配置
  • 通过superset worker命令,启动一个或多个superset worker(本质上就是celery worker)
  • 为了设置result backend,应该在superset_config.py配置模块中给RESULTS_BACKEND键指定为werkzeug.contrib.cache.BaseCache的一个派生类实例。可以使用自带的Redis、Memcache、S3、内存、文件系统cache实现,也可以自己编写cache实现
# superset_config.py

# other configurations ...

class CeleryConfig(object):  
    BROKER_URL = 'redis://localhost:6379/0'
    CELERY_IMPORTS = ('superset.sql_lab', )
    CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'

CELERY_CONFIG = CeleryConfig

from werkzeug.contrib.cache import RedisCache  
RESULTS_BACKEND = RedisCache(  
    host='192.168.30.2', port=6379, db=3,
    key_prefix="superset_results:")

SQL Lab在查询的时候,也支持Jinja模版,可以通过superset配置文件中的JINJA_CONTEXT_ADDONS参数配置默认的Jinja上下文。比如:

JINJA_CONTEXT_ADDONS = {  
    'my_crazy_macro': lambda x: x*2,
}

1.jpg

连接到新的数据库

登陆之后点击: 
1.jpg
然后点击“+”,进入到Database view页面: 
1.jpg
在database view页面,填写数据库的名字以及SQLAlchemy连接字符串,想要了解更多关于SQLAlchemy连接字符串,请点击这个链接: 
1.jpg
然后点击“Test Connection”,如果运行superset服务的实例能够连接到数据库,会弹出类似下面的提示信息: 
1.jpg

同时要注意以下几项:

  • 执行“Test Connection”之后,在页面的底部会列出该数据库中都有哪些表 
    1.jpg
  • 如果想要在SQL Lab中显示这个数据库,那么应该勾选:Expose In SQL Lab 
    1.jpg
    保存之后,在SQL Lab中就可以看到这个数据库了: 
    1.jpg
  • 如果允许用户异步地执行SQL查询,那么应该勾选“Allow Run Async” 
    1.jpg

最后点击“Save”按钮,这个数据库就建立完成了。

添加一个新的表

首先,在上一步添加的数据库中,创建一张新表:

CREATE TABLE `grade_test` (  
  `course_id` int(10) unsigned NOT NULL,
  `student_id` int(10) unsigned NOT NULL,
  `grade` int(10) unsigned NOT NULL DEFAULT '0',
  `last_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `course_name` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 


然后,插入一些测试数据:

insert into grade_test(course_id, student_id, grade, course_name) values(1,1,80,"english"),(1,2,85,"english"),(2,1,90,"math"),(2,2,70,"math"),(1,3,99,"english"),(2,3,88,"math");  


接下来开始添加新的表: 
1.jpg
1.jpg
1.jpg
保存之后,重定向到的页面顶部会有一条提示信息: 
1.jpg

然后进入到“Table Model View”页面,点击新添加的表的表名前面的“Edit record”: 
1.jpg

在结果页面上,点击“List Table Column”标签: 
1.jpg

接下来,就可以定义对表中指定的列的使用方式了:

  • 如果想要使用某个列进行分组,那么将该列标记为Groupable
  • 如果想要使用某个列进行过滤,那么将该列标记为Filterable
  • 如果想要在某列上进行count distinct,那么将该列标记为Count Distinct
  • 如果想要对某列进行求和,或者进行简单的统计,那么将该列标记为SumMinMax
  • 任何时间或日期类型的列,都应该被标记为temporal

搜索数据

首先,进入到“Table Model View”: 
1.jpg
然后点击表名: 
1.jpg
默认情况下,展现的是Table View,并且默认的查询是获取表中的所有的记录数: 
1.jpg
接下来看“Time”区: 
1.jpg

  • Time Column:用来指定一个temporal类型的列
  • Time Grain:用来指定时间的粒度
  • Since过滤器:用来指定时间的下限(含)
  • Util过滤器:用来指定时间的上限(含)

“Time”区的下面是“Group By”区: 
1.jpg

  • Group By:用来指定按照那些列进行分组
  • Metrics:用来指定对哪些列进行何种统计(比如对某列求平均值)

比如,想要求每个学生的平均成绩和成绩总和: 
1.jpg
然后点击,左上角的Query,就可以在右侧看到结果了: 
1.jpg1.jpg

下面看一些其它有趣的功能:

  • Filters: 
    1.jpg
    点击页面右上角的Query按钮: 
    1.jpg
    Filters其实是以AND的方式加到where语句的条件中了

  • Options: 
    1.jpg

  • Row Limit:为SQL的limit子句指定一个值

  • Page Length:指定每页多少条记录

Superset支持很多表格类型,具体可以看官网提供的“画廊”

创建slice和dashboard

一个被保存的查询叫做slice。点解Query按钮右侧的Save as按钮就可以创建一个slice:
1.jpg
点击Save as,在Save as窗口填写slice的名字,同时也可以将slice添加到一个新创建的dashboard中,或已经已经存在的dashboard中,当然也可以不添加到任何dashboard中(所以说,一个dashboard可以一起展示0个或多个slice): 
1.jpg
接下来,我们就可以在slice和dashboard中分别看到刚才新建的slice和dashboard: 
1.jpg

进入到刚才新建的dashboard,可以通过拖拽表格的右下角,放大和缩小表格: 
1.jpg还可以通过右上角的 Move Chart来移动表格: 
1.jpg
修改dashboard之后,需要点击保存按钮进行保存: 
1.jpg

画出更漂亮的表格

在 superset入门教程 小节中,已经介绍过,可以通过superset load_examples命令导入一些测试数据,其中包含若干slice和dashboard,因此可以通过研究这些slice,来学习画出比Table View更“漂亮”的表格。

遇到的问题

  1. superset 0.18.2依赖pandas 0.19.2,pandas依赖numpy,但是当numpy版本高于1.7.0的时候,运行superset会报错,所以本文是先安装numpy 1.7.0,然后安装的pandas 0.19.2 和 superset 0.18.2,这点可能和其他的教程有所不同。

待解决的事项

  • 用户的权限控制
  • 与Apache kylin集成

感谢浏览tim chow的作品!

共有 人打赏支持
粉丝 2
博文 116
码字总数 1200
×
rootliu
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: