最具影响力的数字化技术在线社区

168主编 发表于 2018-12-27 16:28:47

基于hadoop生态圈的数据仓库实践 — OLAP与数据可视化(二)

本帖最后由 168主编 于 2018-12-27 16:31 编辑

四、数据可视化与Hue简介
1. 数据可视化简介
      数据可视化在维基百科上是这样定义的:指一种表示数据或信息的技术,它将数据或信息编码为包含在图形里的可见对象(如点、线、条等),目的是将信息更加清晰有效地传达给用户,是数据分析或数据科学的关键技术之一。简单地说,数据可视化就是以图形化方式表示数据。决策者可以通过图形直观地看到数据分析结果,从而更容易理解业务变化趋势或发现新的业务模式。使用可视化工具,可以在图形或图表上进行下钻,以进一步获得更细节的信息,交互式地观察数据改变和处理过程。


(1)数据可视化的重要性
      从人类大脑处理信息的方式看,使用图形图表观察大量复杂数据要比查看电子表格或报表更容易理解。数据可视化就是这样一种以最为普通的方式,向人快速、简单传达信息的技术。通过数据可视化能够有效地利用数据,帮助人们给诸如以下问题快速提供答案:
需要注意的问题或改进的方向。
影响客户行为的因素。
确定商品放置的位置。
销量预测。
      通过增加数据可视化的使用,能够使企业更快地发现所要追求的价值。创建更多的信息图表,让人们更快地使用更多的资源,获得更多的信息。同时使人们意识到已经知道很多信息,而这些信息先前就应该是很明显的,从而增加了人们能够提出更好问题的可能。它创建了似乎没有任何联系的数据点之间的连接,让人们能够分辨出有用的和没用的数据,这样,就能最大限度的提高生产力,让信息的价值最大化。


(2)数据可视化的用途
      快速理解信息
      通过使用业务信息的图形化表示,企业可以以一种清晰的、与业务联系更加紧密的方式查看大量的数据,根据这些信息制定决策。并且由于相对于电子表格的数据分析,图形化格式的数据分析要更快,因此企业可以更加及时地发现问题、解决问题。
      标识关系和模式
      即使面对大量错综复杂的数据,图形化表示也使数据变得可以理解。企业能够识别高度关联、互相影响的多个因素。这些关系有些是显而易见的,有些则不易发现。识别这些关系可以帮助组织聚焦于最有可能影响其重要目标的领域。
      确定新兴趋势
      使用数据可视化,可以辅助企业发现业务或市场趋势,准确定位超越竞争对手的自身优势,最终影响其经营效益。企业更容易发现影响产品销量和客户购买行为的异常数据,并把小问题消灭于萌芽之中。
      方便沟通交流
      一旦从可视化分析中对业务有了更新的深入了解,下一步就需要在组织间沟通这些情况。使用图表、图形或其它有效的数据可视化表示在沟通中是非常重要的,因为这种表示更能吸引人的注意,并能快速获得彼此的信息。


(3)实施数据可视化需要考虑的问题
      实施一个新技术,需要采取一些步骤。除了扎实地掌握数据外,还需要理解目标、需求和受众。在组织准备实施数据可视化技术时,先要做好以下功课:
明确试图可视化的数据,包括数据量和基数(一列数据中不同值的个数)。
确定需要可视化和传达的信息种类。
了解数据的受众,并领会他们如何处理可视化信息。
使用一种对受众来说最优、最简的可视化方案传达信息。
      在关于数据的属性和作为信息消费者的受众的相关问题有了答案后,就需要准备与大量的数据打交道了。大数据给可视化带来新的挑战,4V(Volume、Velocity、Variety、Veracity)是必须要考虑的问题,而且数据产生的速度经常会比其被管理和分析的速度快。需要可视化的列的基数也是应该重点考虑的因素,高基数意味着该列有大量不同值(如银行账号等),而低基数则说明该列有大量重复值(如性别列)。


(4)几种主要的数据可视化工具
Tableau Desktop(主流桌面BI)
Business Object(SAP收购的BI公司)
Hyperion(Oracle收购的BI公司)
Cognos(IBM收购的BI公司)
Pentaho Report(最流行的开源BI)
2. Hue简介
      前面讨论了数据可视化,那么在Hadoop生态圈中,有哪些图形化的用户界面可以做数据可视化呢?这里就简单介绍一个常用的Hadoop组件——Hue。
(1)Hue是什么
      Hue是Hadoop User Experience的缩写,是一个开源的Apache Hadoop UI系统,最早是由Cloudera Desktop演化而来,由Cloudera贡献给开源社区,它是基于Python Web框架Django实现的。
      我使用的CDH 5.7.0自带的Hue是3.9.0版本。通过使用CDH的Hue Web应用,可以与Hadoop集群进行交互。在Hue中可以浏览HDFS和作业,管理Hive元数据,运行Hive、Impala查询或Pig脚本,浏览HBase,用Sqoop导出数据,提交MapReduce程序,用Solr建立定制的搜索引擎,调度重复执行的Oozie工作流等。
      Hue应用运行在Web浏览器中,不需要安装客户端。其体系结构如下图所示。
https://img-blog.csdn.net/20160829142422587?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


      Hue Server是Web应用的容器,位于CDH和浏览器之间,是所有Hue Web应用的宿主,负责与CDH组件通信。


(2)Hue功能快速预览
      可以从CDH Manager中的连接登录Hue。点击集群中的Hue服务,如下图所示。
https://img-blog.csdn.net/20160829142507479?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
      在Hue页面点击Hue Web UI链接,如下图所示。
https://img-blog.csdn.net/20160829142535877?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
      这时会打开登录页面,要求输入用户名/密码,首次登录输入任意字符串,会自动作为管理员的用户名和密码,如下图所示。
https://img-blog.csdn.net/20160829142642236?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
      登录后Hue会进行配置检查、安装示例、创建或导入用户等向导步骤,然后进入Hue主页。我的Hue主页如下图所示。
https://img-blog.csdn.net/20160829142704283?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
      图中最上面是导航条,11个图标都有超链接。Hue图标是“关于 Hue”链接,点击进入刚登录后的向导步骤页面。第二个是主页图标,点击进入“我的文档”页面。后面依次为“查询数据”、“管理数据”、“使用 Oozie 的计划”、“管理HDFS”、“管理作业”、“管理”、“文档”、“演示教程”和“注销”子菜单或超链接。“查询数据”子菜单包括Hive、Impala、DB查询、Pig和作业设计器。“管理数据”子菜单包括Metastore表和Sqoop 传输。“使用 Oozie 的计划”包括WorkFlow、Coordinator、Bundles三种Oozie工作流的仪表板和编辑器。“管理”包括编辑配置文件和管理用户子菜单。
      这些是Hue主要的功能,每个主功能下面的详细页面这里就不展示了,都是页面操作,感兴趣的点击试一下便知。在这些功能特性集合中,“查询数据”与数据可视化关系最为密切,也是最常使用的功能。在后面实例部分,将会看到与查询相关的图形化表示,还会演示其它一些Hue的常用功能。


(3)配置元数据存储
      像Hadoop的其它组件一样,Hue也有很多配置选项,每个选项的具体含义和配置说明可以从CDH Manager的Hue配置页或相关文档中找到。在这需要说明一下的是Hue自身的元数据存储配置。
      Hue服务器需要一个SQL数据库存储诸如用户账号信息、提交的作业、Hive查询等少量数据。CDH 5.7.0缺省安装时,Hue的元数据存储在一个嵌入式数据库SQLite中,但这种配置并不适用于生产环境。Hue也支持MariaDB、MySQL、PostgreSQL、Oracle等几种外部数据库。Cloudera强烈推荐在Hue多用户环境,特别是生产环境中使用外部数据库。CDH 5所支持的数据库完整列表链接在http://www.cloudera.com/document ... rsions.html#topic_2。
      下面说明使用CDH Manager配置Hue服务器在MySQL中存储元数据的详细步骤(注意:Cloudera推荐使用InnoDB作为Hue的MySQL存储引擎。CDH 5的Hue需要InnoDB)。


         配置前需求:
安装所用操作系统需要的所有类库。如CentOS/RHEL需要的类库如下:
            Oracle's JDK (read more here)
            ant
            asciidoc
            cyrus-sasl-devel
            cyrus-sasl-gssapi
            cyrus-sasl-plain
            gcc
            gcc-c++
            krb5-devel
            libffi-devel
            libtidy (for unit tests only)
            libxml2-devel
            libxslt-devel
            make
            mvn (from apache-maven package or maven3 tarball)
            mysql
            mysql-devel
            openldap-devel
            python-devel
            sqlite-devel
            openssl-devel (for version 7+)
            gmp-devel
            各操作系统需要的类库完整列表链接在https://github.com/cloudera/hue#development-prerequisites。
确认Hue Server运行在Python 2.6或以上版本上。
安装了MySQL数据库(MySQL数据库的安装配置详见http://www.cloudera.com/document ... html#cmig_topic_5_5)。
在Cloudera Manager管理控制台中,从服务列表中点击“Hue”进入Hue服务状态页面。
选择“操作” > “停止”,停止Hue服务,如下图所示。
https://img-blog.csdn.net/20160829143520085?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
选择“操作” > “转储数据库”,将元数据库转储为一个json文件中。
注意在“转储数据库”命令执行窗口中,确认转储文件所在的主机,如下图所示。
https://img-blog.csdn.net/20160829143551414?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


在该主机上打开一个终端窗口,编辑/tmp/hue_database_dump.json文件,去掉文件中useradmin.userprofile段中的所有JSON对象,例如:
{
"pk": 14,
"model": "useradmin.userprofile",
"fields":
{ "creation_method": "EXTERNAL", "user": 14, "home_directory": "/user/tuser2" }
},
在/etc/my.cnf文件中设置MySQL严格模式。

sql_mode=STRICT_ALL_TABLES
在MySQL中建立一个新的数据库并授予一个Hue用户该库的管理员权限,例如:
mysql> create database hue;
Query OK, 1 row affected (0.01 sec)
mysql> grant all on hue.* to 'hue'@'localhost' identified by 'secretpassword';
Query OK, 0 rows affected (0.00 sec)
在Cloudera Manager管理控制台,点击“Hue”服务。
点击“配置”标签。
“类别”选择“数据库”。
指定Hue数据库的类型、主机名、端口、用户名、密码和数据库名。例如下图所示。
https://img-blog.csdn.net/20160829144000650?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
在新数据库还原Hue的元数据。
            a. 选择“操作” > “同步数据库”。
            b. 确认外键,如下图所示。
$ mysql -uhue -psecretpassword
mysql > SHOW CREATE TABLE auth_permission\G
mysql > SHOW CREATE TABLE desktop_document\G
mysql > SHOW CREATE TABLE django_admin_log\G


https://img-blog.csdn.net/20160829144214182?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
            c. 删除上一步查出的外键。


mysql > ALTER TABLE auth_permission DROP FOREIGN KEY content_type_id_refs_id_d043b34a;
mysql > ALTER TABLE desktop_document DROP FOREIGN KEY content_type_id_refs_id_800664c4;
mysql > ALTER TABLE django_admin_log DROP FOREIGN KEY content_type_id_refs_id_93d2d1f8;
            d. 删除django_content_type表里的数据。
DELETE FROM hue.django_content_type;
            e. 在Hue服务页,点击“操作” > “加载数据库”。
            f. 添加c步删除的外键。
mysql > ALTER TABLE auth_permission ADD FOREIGN KEY (content_type_id) REFERENCES django_content_type (id);
mysql > ALTER TABLE desktop_document ADD FOREIGN KEY (content_type_id) REFERENCES django_content_type (id);
mysql > ALTER TABLE django_admin_log ADD FOREIGN KEY (content_type_id) REFERENCES django_content_type (id);
      13. 启动Hue服务。
      如果在上述步骤中报类似“libmysqlclient.so.16: cannot open shared object file: No such file or directory”这种错误,说明MySQL的类库和Hue所需的不兼容,这时只需下载兼容版本的库文件,并放置到/usr/lib64目录,再操作就不会报错了。


五、Hue、Zeppelin比较
      上一节简单介绍了Hue这种Hadoop生态圈的数据可视化组件,本节讨论另一种类似的产品——Zeppelin。首先介绍一下Zeppelin,然后说明其安装的详细步骤,之后演示如何在Zeppelin中添加MySQL翻译器,最后从功能、架构、使用场景几方面将Hue和Zeppelin做一个比较。
1. Zeppelin简介
      Zeppelin是一个基于Web的软件,用于交互式地数据分析。一开始是Apache软件基金会的孵化项目,2016年5月正式成为一个顶级项目(Top-Level Project,TLP)。Zeppelin描述自己是一个可以进行数据摄取、数据发现、数据分析、数据可视化的笔记本,用以帮助开发者、数据科学家以及相关用户更有效地处理数据,而不必使用复杂的命令行,也不必关心集群的实现细节。Zeppelin的架构图如下所示。





https://img-blog.csdn.net/20160830155525589?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
    从图中可以看到,Zeppelin具有客户端/服务器架构,客户端一般就是指浏览器。服务器接收客户端的请求,并将请求通过Thrift协议发送给翻译器组。翻译器组物理表现为JVM进程,负责实际处理客户端的请求并与服务器进行通信。
      翻译器是一个插件式的体系结构,允许任何语言/后端数据处理程序以插件的形式添加到Zeppelin中。特别需要指出的是,Zeppelin内建Spark翻译器,因此不需要构建单独的模块、插件或库。Spark翻译器的架构图如下所示。
https://img-blog.csdn.net/20160830155708217?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
   当前的Zeppelin已经支持很多翻译器,如Zeppelin 0.6.0版本自带的翻译器有alluxio、cassandra、file、hbase、ignite、kylin、md、phoenix、sh、tajo、angular、elasticsearch、flink、hive、jdbc、lens、psql、spark等18种之多。插件式架构允许用户在Zeppelin中使用自己熟悉的特定程序语言或数据处理方式。例如,通过使用%spark翻译器,可以在Zeppelin中使用Scala语言代码。
      在数据可视化方面,Zeppelin已经包含一些基本的图表,如柱状图、饼图、线形图、散点图等,任何后端语言的输出都可以被图形化表示。
      用户建立的每一个查询叫做一个note,note的URL在多用户间共享,Zeppelin将向所有用户实时广播note的变化。Zeppelin还提供一个只显示查询结果的URL,该页不包括任何菜单和按钮。用这种方式可以方便地将结果页作为一帧嵌入到自己的web站点中。


2. Zeppelin安装配置
      下面用一个典型的使用场景——使用Zeppelin运行SparkSQL访问Hive表,在一个实验环境上说明Zeppelin的安装配置步骤。
(1)安装环境
      12个节点的Spark集群,以standalone方式部署,各个节点运行的进程如下表所示。
主机名


运行进程


nbidc-agent-03


NameNode、Spark Master


nbidc-agent-04


SecondaryNameNode


nbidc-agent-11


ResourceManager、DataNode、NodeManager、Spark Worker


nbidc-agent-12


DataNode、NodeManager、Spark Worker


nbidc-agent-13


DataNode、NodeManager、Spark Worker


nbidc-agent-14


DataNode、NodeManager、Spark Worker


nbidc-agent-15


DataNode、NodeManager、Spark Worker


nbidc-agent-18


DataNode、NodeManager、Spark Worker


nbidc-agent-19


DataNode、NodeManager、Spark Worker


nbidc-agent-20


DataNode、NodeManager、Spark Worker


nbidc-agent-21


DataNode、NodeManager、Spark Worker


nbidc-agent-22


DataNode、NodeManager、Spark Worker




      操作系统:CentOS release 6.4
      Hadoop版本:2.7.0
      Hive版本:2.0.0
      Spark版本:1.6.0


(2)在nbidc-agent-04上安装部署Zeppelin及其相关组件
      前提:nbidc-agent-04需要能够连接互联网。
安装Git:在nbidc-agent-04上执行下面的指令。
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install gcc perl-ExtUtils-MakeMaker
yum remove git
cd /home/work/tools/
wget https://github.com/git/git/archive/v2.8.1.tar.gz
tar -zxvf git-2.8.1.tar.gz
cd git-2.8.1.tar.gz
make prefix=/home/work/tools/git all
make prefix=/home/work/tools/git install
安装Java:在nbidc-agent-03机器上执行下面的指令拷贝Java安装目录到nbidc-agent-04机器上。



scp -r jdk1.7.0_75 nbidc-agent-04:/home/work/tools/



安装Apache Maven:在agent-04上执行下面的指令。
cd /home/work/tools/
wget ftp://mirror.reverse.net/pub/apa ... en-3.3.9-bin.tar.gz
tar -zxvf apache-maven-3.3.9-bin.tar.gz
安装Hadoop客户端:在nbidc-agent-03机器上执行下面的指令拷贝Hadoop安装目录到nbidc-agent-04机器上。
scp -r hadoop nbidc-agent-04:/home/work/tools/
安装Spark客户端:在nbidc-agent-03机器上执行下面的指令拷贝Spark安装目录到nbidc-agent-04机器上。
scp -r spark nbidc-agent-04:/home/work/tools/
安装Hive客户端:在nbidc-agent-03机器上执行下面的指令拷贝Hive安装目录到nbidc-agent-04机器上。
scp -r hive nbidc-agent-04:/home/work/tools/
安装phantomjs:在nbidc-agent-04上执行下面的指令。
cd /home/work/tools/
tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
下载最新的zeppelin源码:在nbidc-agent-04上执行下面的指令。
cd /home/work/tools/
git clone https://github.com/apache/incubator-zeppelin.git
设置环境变量:在nbidc-agent-04上编辑/home/work/.bashrc文件,内容如下。
vi /home/work/.bashrc
# 添加下面的内容
export PATH=.:$PATH:/home/work/tools/jdk1.7.0_75/bin:/home/work/tools/hadoop/bin:/home/work/tools/spark/bin:/home/work/tools/hive/bin:/home/work/tools/phantomjs-2.1.1-linux-x86_64/bin:/home/work/tools/incubator-zeppelin/bin;
export JAVA_HOME=/home/work/tools/jdk1.7.0_75
export HADOOP_HOME=/home/work/tools/hadoop
export SPARK_HOME=/home/work/tools/spark
export HIVE_HOME=/home/work/tools/hive
export ZEPPELIN_HOME=/home/work/tools/incubator-zeppelin
# 保存文件,并是设置生效
source /home/work/.bashrc
编译zeppelin源码:在nbidc-agent-04上执行下面的指令。
cd /home/work/tools/incubator-zeppelin
mvn clean package -Pspark-1.6 -Dspark.version=1.6.0 -Dhadoop.version=2.7.0 -Phadoop-2.6 -Pyarn -DskipTests
(3)配置zeppelin

[*]配置zeppelin-env.sh文件:在nbidc-agent-04上执行下面的指令。
cp /home/work/tools/incubator-zeppelin/conf/zeppelin-env.sh.template/home/work/tools/incubator-zeppelin/conf/zeppelin-env.sh
vi /home/work/tools/incubator-zeppelin/conf/zeppelin-env.sh
# 添加下面的内容
export JAVA_HOME=/home/work/tools/jdk1.7.0_75
export HADOOP_CONF_DIR=/home/work/tools/hadoop/etc/hadoop
export MASTER=spark://nbidc-agent-03:7077


配置zeppelin-site.xml文件:在nbidc-agent-04上执行下面的指令。


cp /home/work/tools/incubator-zeppelin/conf/zeppelin-site.xml.template/home/work/tools/incubator-zeppelin/conf/zeppelin-site.xml
vi /home/work/tools/incubator-zeppelin/conf/zeppelin-site.xml
# 修改下面这段的value值,设置zeppelin的端口为9090
<property>
<name>zeppelin.server.port</name>
<value>9090</value>
<description>Server port.</description>
</property>


将hive-site.xml拷贝到zeppelin的配置目录下:在nbidc-agent-04上执行下面的指令。
cd /home/work/tools/incubator-zeppelincp /home/work/tools/hive/conf/hive-site.xml .


(4)启动zeppelin
      在nbidc-agent-04上执行下面的指令。
zeppelin-daemon.sh start(5)测试
      从浏览器输入http://nbidc-agent-04:9090/,如下图所示。https://img-blog.csdn.net/20160830160649700?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
   点击‘Interpreter’菜单,配置并保存spark解释器,如下图所示。
https://img-blog.csdn.net/20160830160713529?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


配置并保存hive解释器,如下图所示。


https://img-blog.csdn.net/20160830160736779?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
点击‘NoteBook’->‘Create new note’子菜单项,建立一个新的查询并执行,结果如下图所示。


https://img-blog.csdn.net/20160830161011483?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center




说明:这是一个动态表单SQL,SparkSQL语句为:
%sql
select * from wxy.t1 where rate > ${r}
    第一行指定解释器为SparkSQL,第二行用${r}指定一个运行时参数,执行时页面上会出现一个文本编辑框,输入参数后回车,查询会按照指定参数进行,如图会查询rate > 100的记录。


3. 在Zeppelin中添加MySQL翻译器
      数据可视化的需求很普遍,如果常用的如MySQL这样的关系数据库也能使用Zeppelin查询,并将结果图形化显示,那么就可以用一套统一的数据可视化方案处理大多数常用查询。Zeppelin本身还不带MySQL翻译器,幸运的是已经有MySQL翻译器插件了。下面说明该插件的安装步骤及简单测试。
(1)编译MySQL Interpreter源代码
cd /home/work/tools/
git clone https://github.com/jiekechoo/zeppelin-interpreter-mysql
mvn clean package
(2)部署二进制包



mkdir /home/work/tools/incubator-zeppelin/interpreter/mysql
cp /home/work/tools/zeppelin-interpreter-mysql/target/zeppelin-mysql-0.5.0-incubating.jar /home/work/tools/incubator-zeppelin/interpreter/mysql/
# copy dependencies to mysql directory
cp commons-exec-1.1.jar mysql-connector-java-5.1.6.jar slf4j-log4j12-1.7.10.jar log4j-1.2.17.jar slf4j-api-1.7.10.jar /home/work/tools/incubator-zeppelin/interpreter/mysql/
vi /home/work/tools/incubator-zeppelin/conf/zeppelin-site.xml



在zeppelin.interpreters 的value里增加一些内容“,org.apache.zeppelin.mysql.MysqlInterpreter”,如下图所示。


https://img-blog.csdn.net/20160830161210144?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


(3)重启Zeppelin
zeppelin-daemon.sh restart(4)加载MySQL Interpreter
打开主页http://nbidc-agent-04:9090/,‘Interpreter’ -> ‘Create’,完成类似下图的页面,完成点击‘Save’https://img-blog.csdn.net/20160830161303161?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center



(5)测试

[*]创建名为mysql_test的note,如下图所示。
https://img-blog.csdn.net/20160830162005467?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center



[*]输入下面的查询语句,按创建日期统计建立表的个数。
%mysql
select date_format(create_time,'%Y-%m-%d') d, count(*) c
from information_schema.tables
group by date_format(create_time,'%Y-%m-%d')
order by d;




查询结果的表格表示如下图所示。


https://img-blog.csdn.net/20160830162059984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
   查询结果的柱状图表示如下图所示。
https://img-blog.csdn.net/20160830162137081?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


   查询结果的饼图表示如下图所示。
https://img-blog.csdn.net/20160830162159032?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


查询结果的堆叠图表示如下图所示。


https://img-blog.csdn.net/20160830162248378?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


   查询结果的线形图表示如下图所示。
https://img-blog.csdn.net/20160830162428301?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


查询结果的散点图表示如下图所示。


https://img-blog.csdn.net/20160830162452254?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
      报表模式的饼图表示如下图所示。https://img-blog.csdn.net/20160830162513020?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
      可以点击如下图所示的链接单独引用此报表
https://img-blog.csdn.net/20160830162534051?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

      单独的页面能根据查询的修改而实时变化,比如将查询修改为:select date_format(create_time,'%Y-%m-%d') d, count(*) c
from information_schema.tables
where create_time > '2016-06-07'
group by date_format(create_time,'%Y-%m-%d')
order by d;

增加了where子句,在运行此查询,结果如下图所示。
      单独链接的页面也随之自动发生变化,如下图所示。

5. Hue与Zeppelin比较(1)功能Zeppelin和Hue都能提供一定的数据可视化的功能,都提供了多种图形化数据表示形式。单从这点来说,个人认为功能类似,大同小异,Hue可以通过经纬度进行地图定位,这个功能我在Zeppelin 0.6.0上没有找到。Zeppelin支持的后端数据查询程序较多,0.6.0版本缺省有18种,原生支持Spark。而Hue的3.9.0版本缺省只支持Hive、Impala、Pig和数据库查询。Zeppelin只提供了单一的数据处理功能,包括前面提到的数据摄取、数据发现、数据分析、数据可视化等都属于数据处理的范畴。而Hue的功能相对丰富的多,除了类似的数据处理,还有元数据管理、Oozie工作流管理、作业管理、用户管理、Sqoop集成等很多管理功能。从这点看,Zeppelin只是一个数据处理工具,而Hue更像是一个综合管理工具。(2)架构Zeppelin采用插件式的翻译器,通过插件开发,可以添加任何后端语言和数据处理程序。相对来说更独立和开放。Hue与Hadoop生态圈的其它组件密切相关,一般都与CDH一同部署。(3)使用场景Zeppelin适合单一数据处理、但后端处理语言繁多的场景,尤其适合Spark。Hue适合与Hadoop集群的多个组件交互、如Oozie工作流、Sqoop等联合处理数据的场景,尤其适合与Impala协同工作。
https://img-blog.csdn.net/20160902143006714?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
六、Hue数据可视化实例      本节先用Impala、DB查询示例说明Hue的数据查询和可视化功能,然后交互式地建立一个定期执行销售订单示例ETL任务的工作流,说明在Hue里是如何操作Oozie工作流引擎的。1. Impala查询      在Impala OLAP实例一节中执行了一些查询,现在在Hue里执行查询,直观看一下结果的图形化表示效果。(1)登录Hue,点击图标进入“我的文档”页面。(2)点击创建一个名为“销售订单”的新项目。(3)点击进入Impala查询编辑页面,创建一个新的Impala文档。(4)在Impala查询编辑页面,选择olap库,然后在编辑窗口输入下面的查询语句。-- 按产品分类查询销售量和销售额select t2.product_category pro_category,           sum(order_quantity) sum_quantity,       sum(order_amount) sum_amount   from sales_order_fact t1, product_dim t2 where t1.product_sk = t2.product_sk group by pro_category order by pro_category;
-- 按产品查询销售量和销售额select t2.product_name pro_name,           sum(order_quantity) sum_quantity,       sum(order_amount) sum_amount   from sales_order_fact t1, product_dim t2 where t1.product_sk = t2.product_sk group by pro_name order by pro_name;      点击“执行”按钮,结果显示按产品分类的销售统计,如下图所示。接着点击“下一页”按钮,结果会显示按产品的销售统计。

(5)点击“全屏查看结果”按钮,会全屏显示查询结果。      产品统计结果如下图所示。


      产品统计柱状图如下图所示。
      从图中可以看到,按销售额从大到小排序的产品依次为Hard Disk Drive、Floppy Drive、Flat Panel、Keyboard和LCD Panel。
(6)回到查询编辑页,点击“另存为...”按钮,保存成名为“按产品统计”的查询。(7)点击“新查询”按钮,按同样的方法再建立一个“按地区统计”的查询。SQL语句如下:-- 按州查询销售量和销售额select t3.state state,       count(distinct t2.customer_sk) sum_customer_num,       sum(order_amount) sum_order_amount   from sales_order_fact t1 inner join customer_dim t2 on t1.customer_sk = t2.customer_sk inner join customer_zip_code_dim t3 on t1.customer_zip_code_sk = t3.zip_code_sk group by state order by state;
-- 按城市查询销售量和销售额select t3.city city,       count(distinct t2.customer_sk) sum_customer_num,       sum(order_amount) sum_order_amount   from sales_order_fact t1 inner join customer_dim t2 on t1.customer_sk = t2.customer_sk inner join customer_zip_code_dim t3 on t1.customer_zip_code_sk = t3.zip_code_sk group by city order by city;      城市统计饼图如下图所示。

      从图中可以看到,mechanicsburg市的销售占整个销售额的一半。
(8)再建立一个“按年月统计”的查询,这次使用动态表单功能,运行时输入年份。SQL语句如下。-- 按年月查询销售量和销售额select t4.year*100 + t4.month ym,       sum(order_quantity) sum_quantity,       sum(order_amount) sum_amount   from sales_order_fact t1    inner join order_date_dim t4 on t1.order_date_sk = t4.date_sk where (t4.year*100 + t4.month) between $ym1 and $ym2 group by ym order by ym;      注意$ym1和$ym2是动态参数,执行此查询,会出现输入框要求输入参数,如下图所示。
      查询2016一年的销售情况,ym1输入201601,ym2输入201612,然后点击“执行查询”,结果线形图如下图所示。
      此结果按查询语句中的order by子句排序。      至此,我们定义了三个Impala查询,进入“我的文档”页面可以看到default项目中有三个文档,而“销售订单”项目中没有文档,如下图所示。
(9)把这三个文档移动到“销售订单”项目中。      点击右面列表中的“default”按钮,会弹出“移动到某个项目”页面,点击“销售订单”,如下图所示。

      将三个查询文档都如此操作后,在“销售订单”项目中会出现此三个文档,如下图所示。
      以上用销售订单的例子演示了一下Hue中的Impala查询及其图形化表示。严格地说,无论是Hue还是Zeppelin,在数据可视化上与传统的BI产品相比还很初级,它们只是提供了几种常见的图表,还缺少基本的上卷、下钻、切块、切片、百分比等功能,如果只想用Hadoop生态圈里的数据可视化工具,也只能期待其逐步完善吧。
(10)最后提供一个Hue文档中通过经纬度进行地图定位的示例,其截图如下所示。

2. DB查询      缺省情况下Hue没有启用DB查询,如果点击“Query Editors” -> “DB 查询”,会提示“当前没有已配置的数据库。”,如下图所示。
      按如下方法配置DB查询。(1)进入CDH Manager的“Hue” -> “配置”页面,在“类别中选择“服务范围” -> “高级”,然后编辑“hue_safety_valve.ini 的 Hue 服务高级配置代码段(安全阀)”配置项,填写类似如下内容:[]    [[]]      # Name to show in the UI.      nice_name="MySQL DB"      name=hive      engine=mysql      host=172.16.1.102      port=3306      user=root      password=mypassword      这里配置的是一个MySQL数据库,如下图所示。

(2)点击“保存更改”按钮,然后点击“操作” -> “重启”,重启Hue服务。      此时再次在Hue里点击“Query Editors” -> “DB 查询”,则会出现MySQL中hive库表,此库存放的是Hive元数据。此时就可以输入SQL进行查询了,如下图所示。




3. 建立定期执行销售订单示例的ETL工作流      下面说明建立工作流的详细步骤。(1)登录Hue的Web主页,点击“Workflows” -> “编辑器” -> “Workflow”,打开“Workflow 编辑器”页面,如下图所示。

(2)点击“Create”按钮,新建一个工作流,页面如下图所示。
      从图中看到,工作流预定义了16种操作,而且Start、End、Kill节点已经存在,不需要(也不能)自己定义。
(3)点击图标,打开工作区页面,如下图所示。


(4)点击图标,显示HDFS上的工作区目录。(5)执行下面的命令,将相关依赖文件拷贝至工作区目录。hdfs dfs -put -f /root/mysql-connector-java-5.1.38/mysql-connector-java-5.1.38-bin.jar /user/hue/oozie/workspaces/hue-oozie-1472779112.59hdfs dfs -put -f /etc/hive/conf.cloudera.hive/hive-site.xml /user/hue/oozie/workspaces/hue-oozie-1472779112.59hdfs dfs -put -f /root/regular_etl.sql /user/hue/oozie/workspaces/hue-oozie-1472779112.59hdfs dfs -put -f /root/month_sum.sql /user/hue/oozie/workspaces/hue-oozie-1472779112.59(6)回到“Workflow 编辑器”页面,拖拽添加三个“Sqoop 1”操作,如下图所示。
      可以看到,因为三个Sqoop并行处理,所以工作流中自动添加了fork节点和join节点。(7)编辑三个“Sqoop 1”操作。      第一个“Sqoop 1”操作改名为“sqoop-customer”      a. Sqoop 命令填写如下命令,用import全量装载客户表:import --connect jdbc:mysql://cdh1:3306/source?useSSL=false --username root --password mypassword --table customer --hive-import --hive-table rds.customer --hive-overwrite      b. 点击“文件”,在“选择文件”页面点击“工作区”,选择hive-site.xml文件。      c. 再次点击“文件”,在“选择文件”页面点击“工作区”,选择mysql-connector-java-5.1.38-bin.jar文件。      第二个“Sqoop 1”操作改名为“sqoop-product”      a. Sqoop 命令填写如下命令,用import全量装载产品表:import --connect jdbc:mysql://cdh1:3306/source?useSSL=false --username root --password mypassword --table product --hive-import --hive-table rds.product --hive-overwrite      b. 点击“文件”,在“选择文件”页面点击“工作区”,选择hive-site.xml文件。      c. 再次点击“文件”,在“选择文件”页面点击“工作区”,选择mysql-connector-java-5.1.38-bin.jar文件。      第三个“Sqoop 1”操作改名为“sqoop-sales_order”      a. Sqoop 命令填写如下命令,用job增量装载销售订单表:job --exec myjob_incremental_import --meta-connect jdbc:hsqldb:hsql://cdh2:16000/sqoop      b. 点击“文件”,在“选择文件”页面点击“工作区”,选择hive-site.xml文件。      c. 再次点击“文件”,在“选择文件”页面点击“工作区”,选择mysql-connector-java-5.1.38-bin.jar文件。(8)修改工作流的名称为“regular_etl”,添加工作流的描述为“销售订单定期ETL”,fork节点的名称为“fork-node”,join节点的名称为“join-node”。现在的工作流如下图所示。
(9)在“join-node”节点下,拖拽添加一个“Hive 脚本”操作,“脚本”选择工作区目录下的regular_etl.sql文件,“Hive XML”选择工作区目录下的hive-site.xml文件。修改操作名称为“hive-every-day”。此操作每天执行ETL主流程。(10)在“hive-every-day”操作下,拖拽添加一个“Hive 脚本”操作,“脚本”选择工作区目录下的month_sum.sql文件,“Hive XML”选择工作区目录下的hive-site.xml文件。修改操作名称为“hive-every-month”。此操作每个月执行一次,生成上月汇总数据快照。现在的工作流如下图所示(“join-node”及其以下部分)。
(11)这步要使用一个小技巧。hive-every-month是每个月执行一次,我们是用天做判断,比如每月1日执行此操作,需要一个decision节点完成date eq 1的判断。在Hue的工作流编辑里,decision节点是由fork节点转换来的,而fork节点是碰到并发操作时自动添加的。因此需要添加一个和“hive-every-month”操作并发的操作来自动添加fork节点。这里选择“停止”操作。现在的工作流如下图所示(“hive-every-day”及其以下部分)。
(12)点击“转换为决策”,条件是如果${date eq 1}转至“hive-every-month”,否则转至“End”。因为不是1号时会转至缺省的“End”节点,所以此时已经不再需要刚才添加的“停止”操作,将其删除。现在的工作流如下图所示(“hive-every-day”及其以下部分)。
      至此我们的regular_etl工作流已经定义完成,点击图标保存,在非编辑模式下,完整的工作流如下图所示。
(13)点击“设置”,在弹出的“Workflow 设置”页面里点击“添加参数”链接,参数名为“date”,值设置为1,如下图所示。

(14)关闭“Workflow 设置”页面,点击 “提交”,弹出“提交 regular_etl?”页面,参数date值为1,如下图所示。

(15)点击“提交”按钮,工作流执行,执行成功结果如下图所示。
      前面的步骤定义了Workflow工作流,要让它定时执行还要定义Coordinator工作流。
(16)点击“Workflows” -> “编辑器” -> “Workflow”,打开“Coordinator 编辑器”页面,如下图所示。
(17)点击“Create”按钮,新建一个工作流,页面如下图所示。
(18)点击“选择 Workflow”链接,在弹出的页面中选择“regular_etl”,如下图所示。
(19)“频率”配置不变,保持缺省的每天一次。(20)点击“添加参数”链接,将${coord:formatTime(coord:actualTime(), 'd')}作为regular_etl里变量date的值,传递给Workflow。(21)修改Coordinator工作流的名称为“regular_etl-coord”,点击保存。      至此我们的Coordinator工作流已经定义完成,现在的工作流在非编辑模式下如下图所示。
(22)点击“提交”,等待Coordinator工作流执行,执行成功结果如下图所示。
--------------------- 作者:wzy0623 来源:CSDN 原文:https://blog.csdn.net/wzy0623/article/details/52386016
页: [1]
查看完整版本: 基于hadoop生态圈的数据仓库实践 — OLAP与数据可视化(二)