Kapua Getting Start

https://www.eclipse.org/kapua/getting-started.php

Kapua docker 应用启动后,数据都在docker容器中,一旦重启容器,数据将丢失。

经过分析,需要将两部分的数据持久化到宿主主机磁盘上。

分两步:
1、启动docker compose实例,将sql容器中的数据拷贝出来,ca58ae61b875 是sql 容器的id;

docker cp ca58ae61b875:/var/opt/h2/data/kapuadb.mv.db .

2、修改docker-compose.xml,在特定位置增加下面volumes, 在映射宿主主机文件系统到docker 容器;

  db:
    volumes:
      - ./sql:/var/opt/h2/data
es:
    volumes:
      - ./es:/usr/share/elasticsearch/data

至此,Kapua 测试环境就可以当做准生产环境了。

systick.c
定义1Hz

/*!
    \brief      configure systick
    \param[in]  none
    \param[out] none
    \retval     none
*/
void systick_config(void)
{
    /* setup systick timer for 1Hz interrupts */
    if (SysTick_Config(SystemCoreClock / 1000 / 1000)){
        /* capture error */
        while (1);
    }
    /* configure the systick handler priority */
    NVIC_SetPriority(SysTick_IRQn, 0x00);
}

阻塞式延时函数

/*!
    \brief      delay a time in milliseconds
    \param[in]  count: count in milliseconds
    \param[out] none
    \retval     none
*/
void delay_1us(uint32_t count)
{
    delay = count;

    while(0 != delay);
}

void delay_1ms(uint32_t count)
{
    delay = count * 1000;

    while(0 != delay);
}

gd32f1x0_it.c
中断处理函数中调用led_spark(),实现led翻转

/*!
    \brief      this function handles SysTick exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void SysTick_Handler(void)
{
    led_spark();
    delay_decrement();
}

main.c
led 翻转函数

/*!
    \brief      toggle the led every 500ms
    \param[in]  none
    \param[out] none
    \retval     none
*/
void led_spark(void)
{
    static __IO uint32_t timingdelaylocal = 0;

    if(timingdelaylocal){

        if(timingdelaylocal < 500*1000){
            gd_eval_ledon(LED2);
        }else{
            gd_eval_ledoff(LED2);
        }

        timingdelaylocal--;
    }else{
        timingdelaylocal = 1000*1000;
    }
}

日常阻塞式翻转

int main(void)
{
    gd_eval_ledinit(LED2);

    systick_config();
    
    while(1)
    {
      gd_eval_ledon(LED2);
      delay_1us(500*1000);
      gd_eval_ledoff(LED2);
      delay_1us(200*1000);
    }
}

解压缩:
xz -d some.img.xz
dd bs=4m if=some.img of=/dev/disk3

压缩img:
xz -z some.img

压缩xz文件写入外置存储器:
xzcat console.img.xz | dd of=/dev/disk3

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内存,是不是很神奇?