edge-computing-128x128.png

定义

边缘计算,顾名思义就是在边缘实现计算(运算),超出云计算以外的任何运算都可以泛称为边缘计算。云计算在大数据上运行,边缘计算在即时数据上运行,即时数据就是由现场传感器、用户或设备生成的实时数据。将云端数据运算能力下移或下沉到边缘端,可以降低带宽,提高运行效率。

概念

随着物联网 IoT 设备数量不断的增加,相应的数据也会呈指数型上升,完全传输到云端运算处理无意是对带宽的极大考验,即使在今天,5G 网络提高了更高的带宽和更低的时延,对数据中心的网络出入口也是非常的挑战。边缘端与云端过多的传输中间过程数据,显然是不合适的,也是低效率的,在边缘端运算处理将是改变这种问题的最好手段。我们可以利用现有的智能手机、数据网关、网络设备等,执行一些具有边缘代表性的任务,通过将云端计算服务移至边缘,可以提供内容缓存、服务交付、存储、网络管理和物联网管理。

文章部分内容来自于 https://wikipedia.org/wiki/Edge_computing

什么是SPARK SQL?

官方有详细的说明,请参考:http://spark.apache.org/docs/latest/sql-programming-guide.html

什么是JDBC?

JDBC(Java Data Base Connectivity, java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。

为什么是ThriftServer?

SPARK 将数据表注册到HiveContext,再启动 ThriftServer 提供JDBC服务器,JDBC客户端连接ThriftServer,完美结合,外部可以访问spark内部(内存)数据。

thriftserver.png

当然,也可以参考之前的博客【SPARK】Spark写入Parquet,暴露JDBC引擎,实现准实时SQL查询 来了解数据处理相关内容。

上源码才是王道

1、Spark 1.6需要开启SingleSession,否则看不见TempTable。

    sparkConf.set("spark.sql.hive.thriftServer.singleSession", "true")

2、初始化 HiveContext,注意是HiveContext不是SqlConctext。

    val hiveContext = new HiveContext(sc)

3、创建DataFrame

    val df = hiveContext.createDataFrame(line) //创建DataFrame

4、注册临时表

    df.registerTempTable("logs")
    top10SrcIp24Hour.registerTempTable("top10")

5、启动ThriftServer

    hiveContext.setConf("hive.server2.thrift.port", "19898") //自定义端口
    HiveThriftServer2.startWithContext(hiveContext)

JDBC连接,看效果

启动spark自带的JDBC 客户端 beeline,连接ThriftServer,查询表。

    $SPARK_HOME/bin/beeline
    
    Beeline version 1.6.1 by Apache Hive
    beeline> !connect jdbc:hive2://localhost:19898
    Connecting to jdbc:hive2://localhost:19898
    Enter username for jdbc:hive2://localhost:19898: 
    Enter password for jdbc:hive2://localhost:19898: 
    Connected to: Spark SQL (version 1.6.1)
    Driver: Spark Project Core (version 1.6.1)
    Transaction isolation: TRANSACTION_REPEATABLE_READ
    0: jdbc:hive2://localhost:19898> show tables;
    +------------+--------------+--+
    | tableName  | isTemporary  |
    +------------+--------------+--+
    | top10      | true         |
    | logs       | true         |
    +------------+--------------+--+
    2 rows selected (0.184 seconds)
    0: jdbc:hive2://localhost:19898> select * from top10;
    +------------------+--------+--+
    |    ipAddress     | count  |
    +------------------+--------+--+
    | 223.166.68.96    | 87     |
    | 125.39.160.25    | 22     |
    | 199.101.117.71   | 17     |
    | 101.226.66.180   | 10     |
    | 116.53.227.116   | 4      |
    | 110.173.17.149   | 1      |
    | 36.231.22.250    | 1      |
    | 42.120.160.30    | 1      |
    | 180.153.185.118  | 1      |
    +------------------+--------+--+
    9 rows selected (2.233 seconds)
    0: jdbc:hive2://localhost:19898> select count(*) from logs;
    +------+--+
    | _c0  |
    +------+--+
    | 144  |
    +------+--+
    1 row selected (2.602 seconds)
    0: jdbc:hive2://localhost:19898> 

看,这些数据都来自Spark内存,是不是很神奇?

SaaS 应用程序,需要满足以下 7 个条件:

1. 应用程序必须支持多租户

多租户是决定 SaaS 效率的关键因素。通常,应用程序支持多个用户,但是前提是它认为所有用户都来自同一个组织。这种模型适用于未出现 SaaS 的时代,组织会购买一个软件应用程序供自己的成员使用。但是在 SaaS 和云的世界中,许多组织都将使用同一个应用程序;他们必须能够允许自己的用户访问应用程序,但是应用程序必须只允许每个组织自己的成员访问其组织的数据。

能够让多个组织(SaaS 中的术语称为租户)共存于相同的应用程序,同时不会破坏这些组织的数据的安全性,具备这种能力的应用程序就可以称之为多租户应用程序。

2. 应用程序必须具备某种程度的自助注册功能

应用程序必须具备某种程度的自助注册功能,即便仅仅是一种请求机制,即产生一种向应用程序添加租户的业务流程。

3. 必须具备订阅/记账机制

必须提供订阅和记账机制。因为 SaaS 应用程序被设计为根据各种因素进行支付,如每个租户的用户数、应用程序选择,还可能包括使用时间等,必须通过某种方式来跟踪和管理应用程序的使用,然后生成可由租户管理人员访问的记账信息。

4. 应用程序必须能够有效地扩展

必须能够随着订阅的增长进行扩展。云基础架构是实现这一目的的逻辑方式,因为它嵌入了许多功能,可以支持您实现有效的、高效的扩展。

同样,必须提供治理和应用程序管理功能,以监视、配置和管理应用程序及所有租户。

5. 必须能够监视、配置和管理应用程序和租户

必须提供一种机制,可以对所有的用户进行监视和配置,并且可以管理租户使用的应用程序模块。SaaS运营商那,必须具备管理平台能够统一管理这些信息。

6. 必须有一种机制能够支持惟一的用户标识和身份验证

需要提供一种机制以支持用户标识和身份验证,允许用户拥有惟一的身份标识。由于多租户要求识别注册到系统中的所有用户,从而确定他们所属的租户,因此必须有一种明确的关系来将用户识别为属于某个特定租户。这种用户与租户的关系是非常重要的信息,用于限制用户可以访问的数据。

电子邮件地址是实现这一目的的一种典型方法,通过这种方式可以确保惟一性,每个用户可以被识别和标识为属于某个特定租户。

有多种身份验证机制和集成方法,因此必须具备一种灵活的机制来识别用户。通常,某个特定的租户需要能够利用其现有的 LDAP 或其他目录服务或身份验证机制来支持对 SaaS 应用程序的单点登录。尽管这种外部的用户身份验证非常重要,但是,需要由 SaaS 应用程序确定已识别的用户是属于它们所宣称的租户的成员。

7. 必须有一种机制能够支持对每个租户进行某种程度的自定义

必须提供一种机制来支持对每个租户进行一定程度的基本自定义,从而使它们具有惟一的 URL、登入页面、标识、配色方案、字体,甚至包括语言。

对每个租户的基本配置是预期的功能,但是要真正地满足多租户的需求,必须在基本配置的基础上对每个租户实现一定程度的自定义。

所需的典型定制类似于租户对内部应用程序版本所作出的定制。包括添加字段甚至是表格,设置特殊的业务逻辑,或集成另一种应用程序。在每个租户的基础上能够进行这类自定义,同时无需建立单独的实例(否则会降低多租户设计的效率),这就是高性能 SaaS 架构的典型特征。

安装Zeppelin

到官网下载二进制包(http://zeppelin.apache.org/download.html),当然,你要是愿意,可以下载源码自己编译。

wget http://apache.fayea.com/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating-bin-spark-1.4.0_hadoop-2.3.tgz
tar -zxvf zeppelin-0.5.0-incubating-bin-spark-1.4.0_hadoop-2.3.tgz

至此,安装完毕,是不是非常简单?

运行Zeppelin(启动/停止)

启动Zeppelin

bin/zeppelin-daemon.sh start

停止Zeppelin

bin/zeppelin-daemon.sh stop

是不是超级简单?打开浏览器: http://192.168.1.230:8080,界面就出现了。

1.png

什么是Interpreter?

Zeppelin Interpreter是一门后端语言。例如,要在Zeppelin使用Scala代码,你需要scala解释器(interpreter)。简单说,你要运行MySQL代码,你需要MySQL解释器,这个需要一些小小的开发。

开发MySQL Interpreter

编译代码

去我的github下载源码并且编译,这个很重要!!!

git clone https://github.com/jiekechoo/zeppelin-interpreter-mysql
mvn clean package

部署二进制包

假装你的zeppelin安装在 /opt/zeppelin目录

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

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

<value>org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.spark.SparkSqlInterpreter,org.apache.zeppelin.spark.DepInterpreter,org.apache.zeppelin.markdown.Markdown,org.apache.zeppelin.angular.AngularInterpreter,org.apache.zeppelin.shell.ShellInterpreter,org.apache.zeppelin.hive.HiveInterpreter,org.apache.zeppelin.tajo.TajoInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,org.apache.zeppelin.mysql.MysqlInterpreter</value>

重启zeppelin即可

bin/zeppelin-daemon.sh restart

运行MySQL代码

加载mysql interpreter

登录管理界面,Interpreter -> Create, 类似下面的页面,完成点击 Save

2.png

创建 Notebook,完成你的可视化

点击右上角的setting,并且确保mysql被选中,保存Save

3.png

输入你要执行的SQL语句,相信你再熟悉不过了

%mysql

SELECT datetime, count FROM Syslog.PerformanceLog WHERE datetime > DATE_SUB(CURDATE(), INTERVAL 7 DAY);

点击运行按钮,结果出现了,是不是很神奇?

4.png

可以做成报表模式,更好看更爽了

5.png

可以在其他地方引用这张报表

6.png

将链接作为框架引入你的代码中吧

7.png

几张效果图

8.png

9.png

前面有篇文章,介绍Zeppelin MySQL Interpreter 的功能,可以访问MySQL数据库,并实现数据可视化,今天,有更好更方便的方式来访问MySQL,那就是 Zeppelin JDBC 方式,当然,你得有Spark和scala编程知识。虽然是一大挑战,但是值得你付出。不行咱们来看……

理解概念

  • Zeppelin: Apache Zeppelin 是一个让交互式数据分析变得可行的基于网页的notebook。Zeppelin提供了数据可视化的框架。Zeppelin提供了数据分析、数据可视化等功能。使用Spark作为数据获取方式,更加方便可靠。
  • 可视化: 可视化(Visualization)是利用计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕上显示出来,并进行交互处理的理论、方法和技术。它涉及到计算机图形学、图像处理、计算机视觉、计算机辅助设计等多个领域,成为研究数据表示、数据处理、决策分析等一系列问题的综合技术。目前正在飞速发展的虚拟现实技术也是以图形图像的可视化技术为依托的。
  • SPARK: Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
  • JDBC: JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序.

需求描述

其实,对于很多时候,大家的可视化需求都差不多,最容易让人体验到的是:WEB展示方式,JDBC连接方便(Oracle, MySQL, MSSQL, PostgreSQL等),SQL语句,图表化,最好可以随时调整。对了,就是这样的需求。

1.png

实现方式

1. 推荐下载zeppelin 0.5.5版本,找一个离你最近的站点,

wget http://www.apache.org/dyn/closer.cgi/incubator/zeppelin/0.5.5-incubating/zeppelin-0.5.5-incubating-bin-all.tgz
tar -zxvf zeppelin-0.5.5-incubating-bin-all.tgz
cd zeppelin-0.5.5-incubating-bin-all

下载MySQL jdbc driver,并复制到 zeppelin-0.5.5-incubating-bin-all/lib 目录下,启动zeppelin:

bin/zeppelin-daemon.sh start

2. MySQL服务器需要开启zeppelin服务器的访问权限,这里不做说明;

3. 在MySQL服务器上把SQL语句跑一遍,保证SQL没有问题。

4. Zeppelin新建一个Notebook,把Spark语句放进去:

输入如下信息,点击运行Run:

// MySQL连接信息
val properties = new java.util.Properties()
properties.setProperty("user", "user")
properties.setProperty("password", "password")

// 获取数据内容
val users = sqlContext.read.jdbc("jdbc:mysql://20.1.1.130:3306/mydb", "mytable", Array("ip='192.168.1.24'"), properties)

// 创建临时查询表
users.registerTempTable("users")

// 检查临时表是否存在,实际应用中可以去除
sqlContext.tableNames().foreach(println)

新建一个操作框,把SQL语句放进去,点击运行Run:

%sql
SELECT * FROM users

实现效果

至于图表展示,根据自己的需求灵活定义,下面来放几张样例参考一下:

最近数据量统计——柱状图

2.png

最近数据量统计——折线图

3.png

最近数据量饼图

4.png

数据库操作响应时间——散点图

5.png