使用 Hue 玩转 Amazon EMR(SparkSQL, Phoenix) 和 Amazon Redshift

news2025/1/23 4:43:32

现状

Apache Hue 是一个基于 Web 的交互式 SQL 助手,通过它可以帮助大数据从业人员(数仓工程师,数据分析师等)与数据仓库进行 SQL 交互。在 Amazon EMR 集群启动时,通过勾选 Hue 进行安装。在 Hue 启用以后,将原先需要登录主节点进行 SQL 编写及提交的工作转移到 web 前端,不仅方便统一管理日常开发需求,而且保证了集群的接入安全性。另一方面 Hue 自己独特的优势可以使用 SparkSQL 进行 Spark 任务的远程提交,相比于额外为 Amazon EMR 集群配置 Hive on Spark,或者使用代码进行 Livy 远程提交这两种方式而言,大大的提升了开发和运维效率。本文也介绍了如何通过 Hue 整合 Amazon Redshift 数仓, 以及远程提交 Phoenix 任务同 HBase 交互,将 Hue 打造为数据仓库的统一 SQL 访问平台。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

方案架构总览

image.png

方案介绍

通过 Livy 提交 SparkSQL Job

执行引擎现状

首先,我们简单比对一下几种流行的执行引擎的现状:

  • 由于处理客户查询需要高磁盘 IO,Apache MapReduce 是最慢的查询执行引擎。
  • 在保持磁盘 IO 不变的情况下,Apache Tez 明显快于 Apache MapReduce。
  • Apache Spark 比没有 IO 阻塞的 Apache Tez 稍快,和Apache Tez 一样以 DAG 方式处理数据,Spark 更加通用,提供内存计算,实时流处理,机器学习等多种计算方式,适合迭代计算。

Apache Livy 简介

Apache Livy 是一项服务,可通过 REST API 与 Spark 集群轻松交互。此方案中的配置方式可将 Hue 页面编写的 SparkSQL 通过 Livy 接口提交到 EMR 集群。

EMR Hue 处理 SparkSQL 默认行为

当在 Hue 的面板上 Editor 选择 SparkSQL 并提交 SQL 任务时,我们根据 application_id((Executing on YARN cluster with App id application_1656071365605_0006))去 Resource Manager 控制台上查询到对应的 Application Type 是 Tez:

image.png

image.png

当我们打开 hue 的配置文件(/etc/hue/conf/hue.ini)看到[[[sql]]] 处配置如下图,interface 配置的是 hiveserver2 便知道了此时的 SparkSQL 走的仍是 hiveserver2,因此使用的是 Tez 引擎(EMR上的Hive执行引擎默认是Tez),这代表着并未真的使用 Spark 执行引擎在运行上述的 Query。

image.png

在 EMR Hue 中通过 Livy 提交 SparkSQL 任务

(1)修改 Hue 配置文件(/etc/hue/conf/hue.ini)中的执行引擎,并重启 Hue 服务

image.png

sudo systemctl restart hue.service
sudo systemctl status hue.service

重新提交 SparkSQL 任务后,看到该 Application 的 ApplicationType 已经为 SPARK。

image.png

生产场景中的性能调优:

上述 Application 通过 Spark 管理界面查看 Environment 细节:

image.png

看到 spark.driver.memory 和 spark.executor.memory 均设置为1G

image.png

这是因为 Hue 源码中直接将上述两个参数的值设定为1G:

https://github.com/cloudera/hue/blob/bd6324a79c2e6b6d002ddd6767b0e63883373320/desktop/libs/notebook/src/notebook/connectors/spark_shell.py

{
	      "name": "driverMemory",
	      "nice_name": _("Driver Memory"),
	      "help_text": _("Amount of memory to use for the driver process in GB. (Default: 1). "),
	      "type": "jvm",
	      "is_yarn": False,
	      "multiple": False,
	      "defaultValue": '1G',
	      "value": '1G',
	},
…
{
	      "name": "executorMemory",
	      "nice_name": _("Executor Memory"),
	      "help_text": _("Amount of memory to use per executor process in GB. (Default: 1)"),
	      "type": "jvm",
	      "is_yarn": True,
	      "multiple": False,
	      "defaultValue": '1G',
	      "value": '1G',
	    }

如果用默认参数值容易在任务执行中触发 OOM 异常,导致任务运行失败,我们可选择通过以下方法进行调优:

cp /usr/lib/hue/desktop/libs/notebook/src/notebook/connectors/spark_shell.py /usr/lib/hue/desktop/libs/notebook/src/notebook/connectors/spark_shell.py.bak
sudo vi /usr/lib/hue/desktop/libs/notebook/src/notebook/connectors/spark_shell.py


将 ‘driverMemory’ 和 ‘executorMemory’ 的配置删除,重启 Hue 服务

sudo systemctl restart hue.service
sudo systemctl status hue.service

image.png

再次运行 SparkSQL,从 Environment 看到两个内存参数已经更新,和 /etc/spark/conf/spark-defaults.conf 内定义一致:

image.png

image.png

Hue 配置 Phoenix 提交 HBase 任务

Apache Phoenix 简介

Apache Phoenix 是一个开源的,大规模并行的关系数据库引擎,支持使用 Apache HBase 作为其后备存储的 OLTP for Hadoop。Phoenix 提供了一个 JDBC 驱动程序,该驱动程序隐藏了 noSQL 存储的复杂性,使用户能够创建,删除和更改 SQL 表,视图,索引和序列。

配置 Phoenix

(1)准备 Hue Python Virtual Environment

sudo /usr/lib/hue/build/env/bin/pip install phoenixdb

(2)修改 Hue 配置文件:

在 /etc/hue/conf/hue.ini的[notebook] [[interpreters]]部分加入:

[[[phoenix]]]
name=HBase Phoenix
interface=sqlalchemy
options='{"url": "phoenix:// ip-172-31-37-125.ap-southeast-1.compute.internal:8765/"}'

重启 Hue 服务

sudo systemctl restart hue.service
sudo systemctl status hue.service

(3) Hue 页面提交 Phoenix 任务:

Hue – Editor 部分因为配置文件的更新,出现了 HBase Phoenix 的选项, 创建和查询 Table :

image.png

CREATE TABLE user (id varchar PRIMARY KEY,name varchar,passwd varchar)
upsert into user(id, name, passwd) values('001', 'admin', 'admin')
select * from user

image.png

HBase 显示列名乱码修正

(1)当完成上述操作时,回到 HBase Shell 查看表内容,发现列名为乱码:

image.png

使用 Phoenix 命令行(/usr/lib/phoenix/bin/sqlline.py, 不透过Hue)创建表仍能重现该问题,且乱码不会在 Phoenix JDBC 连接中出现:

image.png

(2)在 Phoenix 创建表时最后加上 COLUMN_ENCODED_BYTES= 0可规避该问题:

CREATE TABLE user02 (id varchar PRIMARY KEY,name varchar,passwd varchar) COLUMN_ENCODED_BYTES= 0
upsert into user02(id, name, passwd) values('002', 'admin', 'admin')
select * from user02

HBase Shell 查看结果,列名已经显示正常:

image.png

Hue 连接 Redshift 提交任务

当数仓平台中涉及 Amazon EMR 和 Amazon Redshift 等多种服务时,通过 Hue 丰富的 Connectors 扩展种类,可以轻松实现统一交互的功能。

(1)准备 Hue Python Virtual Environment

cd /usr/lib/hue/
sudo ./build/env/bin/pip install sqlalchemy-redshift
sudo /usr/lib/hue/build/env/bin/pip2.7 install psycopg2-binary

(2)修改 Hue 配置文件:

在/etc/hue/conf/hue.ini的[notebook] [[interpreters]]部分加入:

[[[redshift]]]
name = Redshift
interface=sqlalchemy
  options='{"url": "redshift+psycopg2://username:password@host.amazonaws.com:5439/database"}'

重启 Hue 服务

sudo systemctl restart hue.service
sudo systemctl status hue.service

(3) Hue 页面提交 Redshift 任务:

Hue – Editor 部分因为配置文件的更新,出现了 Reshift 的选项:

image.png

提交 SQL 查询,轻松获取 Amazon Redshift 数仓数据:

image.png

总结

本文主要帮助使用 Amazon EMR 的用户,通过 Hue 实现统一数仓平台开发工具,一方面集中管理数仓 SQL 开发任务,另一方面为其它部门提供自主分析的平台,对数仓建设有一定的推动作用。

本篇作者

image.png

Sunny Fang Amazon 技术客户经理,主要支持金融,互联网行业客户的架构优化、成本管理、技术咨询等工作,并专注在大数据和容器方向的技术研究和实践。在加入 Amazon 之前,曾就职于 Citrix 和微软等科技公司,拥有8年虚拟化与公有云领域的架构优化和支持经验。

image.png

张尹 Amazon 技术客户经理,负责企业级客户的架构和成本优化、技术支持等工作。有多年的大数据架构设计,数仓建模等实战经验。在加入 Amazon 之前,长期负责头部电商大数据平台架构设计、数仓建模、运维等相关工作。

文章来源:https://dev.amazoncloud.cn/column/article/630b3f0176658473a3220015?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=CSDN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/966066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Scratch 画画的技巧

前言 美术是一种艺术,且不局限于纸张,就像电脑绘图也属于美术。我至今已有三年多的画龄,经验丰富,尤其擅长在scratch造型编辑器上画矢量图。今天给大家分享一些实用的技巧。 1.讲解 用橡皮工具给一个圆擦出“橡皮洞” 橡皮工具&a…

2511. 最多可以摧毁的敌人城堡数目

文章目录 Tag题目来源题目解读解题思路复杂度分析写在最后 Tag 【数组】 题目来源 2511. 最多可以摧毁的敌人城堡数目 题目解读 在数组 forts 中,forts[i] 有三种数值: -1: 表示第 i 个位置没有城堡,是空地;0&…

【计算机知识】Base64 编码说明

一、理论 Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法,由于 2^664,所以每 6 个比特为一个单元,对应某个可打印字符。 Base64 常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括…

程序员自由创业周记#2:前期准备

感恩 上次公开了创业的决定后,得到了很多亲朋好友和陌生朋友的鼓励或支持,以不同的形式,感动之情溢于言表。这些都会记在心里,大恩不言谢~ 创业方向 笔者是一名资质平平的iOS开发程序猿,创业项目也就是开发App卖&am…

图的深度优先与广度优先遍历

上篇博客介绍了图的概念与图的存储(邻接矩阵、邻接表): 接下来就是介绍图的遍历。 图的遍历 给定一个图G和其中任意一个顶点v0,从v0出发,沿着途中各边访问图中的所有顶点,且每个顶点仅被遍历一次。"遍历"即对结点进行…

读SQL学习指南(第3版)笔记09_条件逻辑与事务

1. 条件逻辑 1.1. SQL逻辑根据特定列或表达式转向不同的分支来处理 1.2. 在程序执行时从多个路径中选取一个路径的能力 1.3. case表达式 1.3.1. 所有的主流数据库服务器都提供了旨在模拟大多数编程语言中if-then-else 语句的内建函数 1.3.1.1. Oracle的decode()函数 1.3.…

T113-S3-ov5640摄像头调试

目录 前言 一、ov5640模组介绍 1. 图像传感器特性 2. 接口和控制 3. 图像处理能力 4. 应用领域 二、原理图连接 三、设备树配置 四、驱动配置 五、ov5640使用 六、异常记录 总结 前言 摄像头模块是嵌入式系统中常见的外设,用于捕获图像和视频。在本篇文章…

一不留神就掉坑

乘除顺序问题 在据卡特兰数[1]公式,解决leetcode-96 不同的二叉搜索树[2]时,遇到一个非常诡异的问题, package mainimport "fmt"func main() { for i : 0; i < 40; i { fmt.Printf("第%d个卡特兰数为:%d\n", i, numTrees(i)) }}func numTrees(n int) i…

【超详细~KVM】KVM概述、安装及简单操作-------从小白到大神之路之学习运维第91天

第四阶段提升 时 间&#xff1a;2023年8月30日 参加人&#xff1a;全班人员 内 容&#xff1a; KVM概述、安装及简单操作 目录 一、KVM 概述 二、KVM工作原理 三、KVM应用场景 四、centos7 下安装部署 五、新建虚拟机步骤 1、创建存储池并创建存储卷 2、点击号创建…

MPI之通信模式(标准,缓存,同步,就绪)

MPI缓冲区 由MPI自行维护的一块内存区域&#xff0c;也可由用户(MPI_Bsend)自行维护&#xff1b;发送方 维护一块发送缓冲区&#xff1b; 接收方 维护一块接收缓冲区。 数据收发过程&#xff1a; 当发送端将数据拷贝到自身的数据缓冲区后(注意这里是拷贝&#xff0c;即数据到…

Redis——认识Redis

简单介绍 Redis诞生于2009年&#xff0c;全称是Remote Dictionary Server&#xff0c;远程词典服务器&#xff0c;是一个基于内存的键值型NoSQL数据库。 特征 键值&#xff08;Key-value&#xff09;型&#xff0c;value支持多种不同数据结构&#xff0c;功能丰富单线程&…

多线程专栏------多线程的实现方式(三)

目录 1、使用线程池1.1、什么是线程池1.2、使用线程池的优点1.3、线程池的核心工作流程1.3、线程池的五种状态生命周期1.3.1、RUNNING1.3.2、SHUTDOWN1.3.3、STOP1.3.4、TIDYING1.3.5、TERMINATED 1.4、创建线程池的方式1.4.1、通过 ThreadPoolExecutor 创建1.4.1.1、线程池的核…

类的静态成员变量 static member

C自学精简教程 目录(必读) 类的静态成员 static member 变量全局只有一份副本&#xff0c;不会随着类对象的创建而产生副本。 static 静态成员 在类的成员变量前面增加static关键字&#xff0c;表示这个成员变量是类的静态成员变量。 #include <iostream> using name…

kaggle赛后总结

1. 宽表 2.缺失值的处理方法 最简单粗暴的就是删除&#xff0c;这种情况是凡是有缺失值行数很少。均值替代。缺失值的行数比较多一点儿的时候&#xff0c;直接删除会影响样本数量&#xff0c;那就均值替代&#xff0c;或者中位数替代等方法。还有复杂的方法&#xff0c;把有缺…

NMS(非极大值抑制)的 Python 实现

文章目录 1. NMS的步骤2. Python代码 非极大值抑制&#xff08;Non-Maximum Suppression&#xff0c;NMS&#xff09;是一种在目标检测中常用的技术。 NMS的目的是消除重叠区域中冗余的边界框&#xff0c;并选择最具代表性的目标作为最终结果。通过调整重叠阈值&#xff0c;可…

400电话号码怎么开通

开通400电话是企业提供客户服务的重要步骤。下面是一些步骤和注意事项&#xff0c;帮助您顺利开通400电话。 第一步&#xff1a;选择400电话服务提供商 选择一家可靠的400电话服务提供商非常重要。您可以通过搜索引擎、咨询行业内人士或者参考其他企业的经验来选择合适的服务提…

FLASH读写数据

目录 嵌入式 Flash大概了解 数据手册2.3.2章节 结构图f407 等待周期 Flash 控制寄存器解锁 编程/擦除并行位数 擦除 编程&#xff08;写入&#xff09; 工程程序 嵌入式 Flash大概了解 可以从flash区域启动程序&#xff1b;大概是程序区可以在flash&#xff0c;所以是可以…

python调用git出错:ImportError: Failed to initialize: Bad git executable.

报错信息 #报错信息 Traceback (most recent call last): File “”, line 1, in File “C:\Python27\lib\site-packages\git_init_.py”, line 85, in raise ImportError(‘Failed to initialize: {0}’.format(exc)) ImportError: Failed to initialize: Bad git executab…

春秋云镜 CVE-2018-16283

春秋云镜 CVE-2018-16283 WordPress Plugin Wechat Broadcast LFI 靶标介绍 WordPress Plugin Wechat Broadcast LFI 启动场景 漏洞利用 exp # Exploit Title: WordPress Plugin Wechat Broadcast 1.2.0 - Local File Inclusion # Author: Manuel Garcia Cardenas # Date:…

图论-01-图的基本表示-邻接矩阵和邻接表-Java

文章目录 邻接矩阵邻接表邻接表的问题和改进总结 邻接矩阵 import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner;public class AdjMatrix {private int V;private int E;private int[][] adj;// 构造函数&#xff0c;从文…