在AWS EC2中部署和使用Apache Superset的方案
大纲
- 1 Superset部署
- 1.1 启动AWS EC2
- 1.2 下载Superset Docker文件
- 1.3 修改Dockerfile
- 1.4 配置管理员
- 1.5 结果展示
- 1.6 检查数据库驱动
- 1.7 常见错误处理
- 2 Glue(可选参考)
- 3 IAM与安全组
- 3.1 使用AWS Athena
- 3.2 使用AWS RedShift或AWS RDS
- 3.2.1 查看AWS Redshift集群VPC安全组
- 3.2.2 设置Superset所在AWS EC2实例的安全组
- 3.2.3 添加入站规则
- 4 Superset配置数据源并创建Dashboard
- 4.1 连接AWS Athena
- 4.2 连接AWS Redshift
- 5 Superset教程
本文将讲解如何在AWS EC2中部署Apache Superset,并通过AWS Glue连接AWS S3、AWS RDS、AWS RedShift中的数据,进行可视化展现。
1 Superset部署
1.1 启动AWS EC2
启动一台Amazon Linux EC2并安装启动docker环境,需要机型为t.xlarge及以上,EBS盘20GB以上。
sudo yum update -y
# install python3 gcc
sudo yum install -y python3 libpq-dev python3-dev
sudo yum install -y gcc gcc-c++
# add following into ~/.bashrc
echo "export PATH=/usr/local/bin:$PATH" >> ~/.bashrc
echo "alias python=python3" >> ~/.bashrc
echo "alias pip=pip3" >> ~/.bashrc
source ~/.bashrc
python --version
# install docker
sudo yum -y install docker
sudo usermod -a -G docker ec2-user
sudo systemctl start docker
sudo systemctl status docker
sudo systemctl enable docker
sudo chmod 666 /var/run/docker.sock
docker ps
# install docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
1.2 下载Superset Docker文件
sudo yum install -y git curl
git clone https://github.com/apache/incubator-superset/
1.3 修改Dockerfile
cd incubator-superset
vi Dockerfile
在末尾添加
RUN pip install PyAthenaJDBC \ #这个是athena连接
&& pip install PyAthena \ #这个是athena连接
&& pip install psycopg2 \
&& pip install sqlalchemy-redshift # 这个是redshift连接
构建
docker-compose build
docker-compose up
1.4 配置管理员
需要配置管理员用户权限,在docker/docker-init.sh中默认创建用户admin(密码也是admin)但权限并没有更新,通过以下命令更新权限。
#进入docker
docker-compose exec superset bash
superset init
1.5 结果展示
配置成功后,Superset默认使用8088端口,使用http://<EC2 公有IP>:8088访问,默认用户名和密码均为admin 可在Dockerfile、docker中命令、管理页面更改。
1.6 检查数据库驱动
查看数据库驱动是否安装成功。
若没有
#进入docker
docker-compose exec superset bash
#安装 athena 和redshift驱动
pip install PyAthenaJDBC \
&& pip install PyAthena \
&& pip install psycopg2 \
&& pip install sqlalchemy-redshift
1.7 常见错误处理
build中如果出现error
ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
原因:
- docker 没有启动
sudo systemctl start docker
- 用户不再docker用户组里面
sudo gpasswd -a ${USER} docker
如果是第二个,请退出shell 再次登陆
2 Glue(可选参考)
- 创建Glue
见《基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(一)——创建Glue》 - 数据清洗、转换
见《基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(二)——数据清洗、转换》
3 IAM与安全组
部署Superset的AWS EC2附加的IAM角色需要有AWS Athena查询和Glue Catalog的权限,为方便起见可以赋予AthenaFullAccess和GlueFullAccess。但实际情况请按照最小权限原则来保障安全。
3.1 使用AWS Athena
如果在 Amazon Athena中运行查询时,出现 “Access Denied”(拒绝访问)错误。
Your query has the following errors:Access denied when writing output to url: s3://my-athena-result-bucket/Unsaved/2021/05/07/example_query_ID.csv . Please ensure you are allowed to access the S3 bucket. If you are encrypting query results with KMS key, please ensure you are allowed to access your KMS key
向 IAM 用户授予所需的权限。以下 IAM 策略允许源数据存储桶和查询结果存储桶的最低权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::【数据源的s3名称】"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::【数据源的s3名称】/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:AbortMultipartUpload",
"s3:PutObject",
"s3:ListMultipartUploadParts"
],
"Resource": [
"arn:aws:s3:::【存储Athena查询结果的s3名称】",
"arn:aws:s3:::【存储Athena查询结果的s3名称】/*"
]
}
]
}
请务必在此示例策略中替换【】中的内容。
3.2 使用AWS RedShift或AWS RDS
此处以AWS RedShift集群为例。
3.2.1 查看AWS Redshift集群VPC安全组
3.2.2 设置Superset所在AWS EC2实例的安全组
3.2.3 添加入站规则
4 Superset配置数据源并创建Dashboard
此处提供了AWS Athena与AWS RedShift的连接教程,其他JDBC语法请看官方文档。
4.1 连接AWS Athena
awsathena+rest://@athena.{region}.amazonaws.com.cn/<Glue数据库表>?s3_staging_dir=<用来存储查询结果的S3地址>
测试连接
4.2 连接AWS Redshift
redshift+psycopg2://<userName>:<DBPassword>@<AWS End Point>:<port>/<Database Name>
创建连接
5 Superset教程
- 简单教学
- superset官方文档