上期说道:http/2还属于一种不算普及的技术协议,可能目前只适合用于内部系统集成,现在开始大面积介入可能为时尚早。...毕竟用akka-grpc做了些事情,想想还是再写这篇跟大家分享使用kka-grpc的过程。 我说过,了解akka-grpc的主要目的还是在protobuf的应用上。这是一种高效率的序列化协议。...这里就需要仔细考虑图片在终端到平台、然后集群节点与点actor间的传输效率了。如何在akka系统里使用protobuf格式的数据正是本篇讨论和示范的目的。...shopId:posId就是代表为某用户构建的entityId,这个是通过用户在Request中提供的MetaData参数中jwt解析得出的。 可以看到,具体服务提供是通过集群的分片实现的。...err.getMessage}") } scala.io.StdIn.readLine() sys.terminate() } } 基本流程是:先通过getAuthToken获取jwt;在调用服务时通过
其中Cassandra和MongoDB属于分布式数据库,可以在集群中任何部署节点调用。而JDBC数据库则是非分布式的,无法部署在多个节点。...实际上使用akka-http需要的门槛很高,即使akka-http已经提供了许多帮助http操作的类型,但光是理解http协议内容及httprequest,httpresponse细节、构建、使用方法就花去了我几个星期的精力...这是在系统集成编程方面相对aka-http占优的一个亮点。protobuf格式数据可以很方便的转换成 json格式数据,支持对外部系统的的开放协议数据交换。...在scala编程世界里我们可以用scalaPB来实现对gRPC和protobuf的使用。...java数据类型和抽象服务框架 3、在java编程中可以直接调用编译产生的数据类型及对数据进行操作 4、继承并实现产生的服务类 scalaPB是一个scala版的protobuf编译器。
gRPC是google开源提供的一个RPC软件框架,它的特点是极大简化了传统RPC的开发流程和代码量,使用户可以免除许多陷阱并聚焦于实际应用逻辑中。...作为一种google的最新RPC解决方案,gRPC具备了以下这些强项: 1、gRPC在HTTP/2协议上用protobuf取代了json实现了最佳效率 2、用IDL(Interface Definition...在一个.proto字符类文件中用IDL来描述用户自定义的数据类型和服务 2、用protoc编译器编译文件并产生自定义数据类型和服务的api源代码 3、在server端实现.proto中定义的服务函数 4...、在client端通过自动产生的stub来调用服务 下面我们就来示范gRPC的编程流程。...在客户端调用服务并输出返回结果response: //build connection channel val channel = io.grpc.ManagedChannelBuilder
关于grpc,在前面的scalaPB讨论里已经做了详细的介绍:google gRPC是一种全新的RPC框架,在开源前一直是google内部使用的集成工具。...由于gRPC支持http/2协议,可以实现双向通讯duplex-communication,解决了独立request/response交互模式在软件编程中的诸多局限。...这是在系统集成编程方面相对akka-http占优的一个亮点。protobuf格式数据可以很方便的转换成 json格式数据,支持对外部系统的的开放协议数据交换。...在http/1应用中对二进制文件的传输交换有诸多限制和不便,特别是效率方面的问题。在protobuf这种序列化模式中对任何类型的数据格式都一视同仁,可以很方便的实现图片等文件的上传下载。...实际上,在使用scalaPB的过程中一直在关注akka-grpc的发展,直到v1.01发布。这是一个正式版本,相信不会在模式、风格、语法上再有大的改变,应该值得试着使用了。
任何类型的实例作为消息在两端独立系统的机器之间进行传递时必须经过序列化/反序列化serialize/deserialize处理过程。...protobuf是binary格式的,基本只包括实例值,所以数据传输效率较高。下面我们就介绍如何在akka系统中使用protobuf序列化。...在akka中使用自定义序列化方法包括下面的这些步骤: 1、在.proto文件中对消息类型进行IDL定义 2、用ScalaPB编译IDL文件并产生scala源代码。...这些源代码中包括了涉及的消息类型及它们的操作方法 3、在akka程序模块中import产生的classes,然后直接调用这些类型和方法 4、按akka要求编写序列化方法 5、在akka的.conf文件里...注意依赖项中的scalapb.runtime。PB.targets指明了产生源代码的路径。
在前面几篇讨论里我们介绍了scala-gRPC的基本功能和使用方法,我们基本确定了选择gRPC作为一种有效的内部系统集成工具,主要因为下面gRPC支持的几种服务模式: 1、Unary-Call:独立的一对...那么如果能把gRPC中ListenableFuture和StreamObserver这两种类型转成akka-stream的基本类型应该就能够实现所谓的reactive-gRPC了。...如果我们能用akka-stream编程方式实现gRPC服务调用的话,可能会遭遇下面的场景:在服务端我们只需要实现一种akka-stream的Flow把进来的request转化成出去的response,如下...下面是gRPCAkkaStream的使用示范。...在客户方调用服务函数genIncsFrom的方式如下: def genIncNumbers(len: Int): Source[Int,NotUsed] = { logger.info(s"Requesting
前面我们完成了一个CQRS模式的数据采集(录入)平台。可以预见:数据的产生是在线下各式各样的终端系统中,包括web、桌面、移动终端。...由于gRPC支持http/2通讯协议,支持持久连接方式及双向数据流。...这篇讨论焦点集中在gRPC的server,client两头的具体实现。刚才提过,gRPC是google公司的开源库,同时还提供了各种语言的客户端,有:java, C++,python,go ......2、另外就是客户端的channelbuilder:在scalaPB例子里使用的是ManagedChannelBuilder,这是一个实验阶段的东东: //build connection channel...所以必须使用同步客户端调用函数blockingStub。
经过编译后产生了SumOneToManyGrpc.scala文件,在这个文件里提供了有关RPC操作的api。...在调用addOneToMany函数时用户事先构建这个StreamObserver传给server,由server把结果通过这个结构传回用户。...scalaPB自动产生scala代码中的addManyToOne函数款式如下: def addManyToOne(responseObserver: StreamObserver[SumResponse...]): StreamObserver[SumRequest] 调用方提供StreamObserver[SumResponse]用作返回结果,函数返回客方需要的StreamObserver[SumRequest...注意:虽然在.proto文件中AddManyToOne的返回结果是单个SumResponse,但产生的scala函数则提供了一个StreamObserver[SumResponse]类型,所以需要谨记只能调用一次
SQLContext 用于处理在 SparkSQL 中动态注册的表,HiveContext 用于处理 Hive 中的表。...SQLContext.sql 即可执行 Hive 中的表,也可执行内部注册的表; 在需要执行 Hive 表时,只需要在 SparkSession.Builder 中开启 Hive 支持即可(enableHiveSupport...一个由普元技术部提供的基于 SparkSQL 的开发模型; 一个可二次定制开发的大数据开发框架,提供了灵活的可扩展 API; 一个提供了 对文件,数据库,NoSQL 等统一的数据开发视界语义; 基于 SQL...Targets 为定义输出,table_name 的值需在 source 或者 Transformer 中定义。 SparkSQL Flow 支持的Sourse ?...Path 指定地址需要使用协议,如:file:// 、 hdfs://,否则跟 core-site.xml 配置密切相关; SparkSQL Flow DB Source <source type="
使用gRPC作为云平台和移动前端的连接方式,网络安全应该是必须考虑的一个重点。gRPC是支持ssl/tls安全通讯机制的。用了一个周末来研究具体使用方法,实际上是一个周末的挖坑填坑过程。...gRPC的ssl/tls的原理是在服务端安装安全证书公用certificate和私钥key, 在客户端安装公共证书就可以了,gRPC代码是这样写的: // Server SslContext sslContext...不过客户端在使用了证书后仍然无法连接到服务端。没办法,又要再去查资料了。看来现在应该是证书的问题了。先看看是不是因为使用的证书是自签的self-signed-certificate。...grpc-java里提供了一些测试用的证书和私钥和说明文档。...在测试程序里使用了它们提供的server1.pem,server1.key,ca.pem: package learn.grpc.server import io.grpc.
DataFrame与RDD的主要区别在于,DataFrame带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。 Spark SQL性能上比RDD要高。...三者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action行动算子如foreach时,三者才会开始遍历运算。 三者有许多共同的函数,如filter,排序等。...使用相同的方式连接不同的数据源。 兼容Hive 在已有的仓库上直接运行SQL或者HQL。 标准的数据连接。...通过JDBC或者ODBC来连接 二、Spark SQL编程 1、SparkSession新API 在老的版本中,SparkSQL提供两种SQL查询起始点: 一个叫SQLContext,用于Spark自己提供的...// save ("…"):在"csv"、"orc"、"parquet"和"text"(单列DF)格式下需要传入保存数据的路径。
此外RDD与Dataset相比较而言,由于Dataset数据使用特殊编码,所以在存储数据时更加节省内存。 ?...与RDD相比:保存了更多的描述信息,概念上等同于关系型数据库中的二维表; 与DataFrame相比:保存了类型信息,是强类型的,提供了编译时类型检查,调用Dataset的方法先会生成逻辑计划,然后被Spark...在数据集的核心 API是一个称为编码器的新概念,它负责在JVM对象和表格表示之间进行转换。表格表示使用Spark内部Tungsten二进制格式存储,允许对序列化数据进行操作并提高内存利用率。...也就是说, 在 SparkSQL 中, 开发者的代码即使不够优化, 也会被优化为相对较好的形式去执行。 为什么 SparkSQL 提供了这种能力?...Catalyst 为了解决过多依赖 Hive 的问题, SparkSQL 使用了一个新的 SQL 优化器替代 Hive 中的优化器, 这个优化器就是 Catalyst, 整个 SparkSQL 的架构大致如下
gRPC Streaming的操作对象由服务端和客户端组成。在一个包含了多个不同服务的集群环境中可能需要从一个服务里调用另一个服务端提供的服务。...这时调用服务端又成为了提供服务端的客户端了(服务消费端)。...服务提供方在Flow内部对需求进行处理后再把结果返回来,请求方run这个连接的stream应该就可以得到需要的结果了。...服务其实就是一个akka-stream的Flow[R1,R2,M],它把收到的数据R1处理后转换成R2输出。...,第二个节点把加工的消息传给另一个服务并连接它的运算结果作为本身最终的输出。
在 pyecharts 中,图表的一切皆通过 options来修饰调整。...在pyecharts中,图表完成制作后通过render()函数输出为html文件,你可以在render()中传递输出地址参数,将html文件保存到自定义的位置。...html格式 如果想在notebook中直接展示图表,需要调用render_notebook()函数。...pyecharts所有方法都支持链式调用,当然如果你喜欢单独调用也可以的,像这样: geo = Geo() geo.add_schema(maptype="china") geo.add("geo",...BMap百度地图 pyecharts支持开发者使用百度地图,当然需要申请开发者AK码才能调用API。
SparkSession新的起始点 在老的版本中,SparkSQL提供两种SQL查询起始点:一个叫SQLContext,用于Spark自己提供的SQL查询;一个叫HiveContext,用于连接Hive...在使用一些特殊的操作时,一定要加上import spark.implicits._不然toDF、toDS无法使用。 RDD、DataFrame、DataSet ?...在SparkSQL中Spark为我们提供了两个新的抽象,DataFrame跟DataSet,他们跟RDD的区别首先从版本上来看 RDD(Spark1.0) ----> DataFrame(Spark1.3...默认数据源Parquet Parquet是一种流行的列式存储格式,可以高效的存储具有嵌套字段的记录,Parquet格式经常在Hadoop生态圈使用,它也支持SparkSQL的全部数据类型,SparkSQL...输出数据格式: ?
在 Dataset 中可以轻易的做到使用 SQL 查询并且筛选数据,然后使用命令式 API 进行探索式分析。...SparkSQL由4个部分构成: Core:负责处理数据的输入/输出,从不同的数据源获取数据(如RDD、Parquet文件),然后将查询结果输出成DataFrame Catalyst:负责处理查询语句的整个过程...在Analyzer过程中处理由解析器(SqlParser)生成的未绑定逻辑计划Tree时,就定义了多种Rules应用到该Unresolved逻辑计划Tree上。...因为单次函数调用就要处理掉一个partition所有的数据,如果内存不够,垃圾回收时是无法回收掉太多对象的,很可能出现OOM异常。所以使用这类操作时要慎重!...无论是行式存储还是列式存储,都可以在将过滤条件在读取一条记录之后执行以判断该记录是否需要返回给调用者,在Parquet做了更进一步的优化,优化的方法时对每一个Row Group的每一个Column Chunk
:hdfs dfs -chmod -R 755 / 25、经验:Spark的Driver只有在Action时才会收到结果 26、经验:Spark需要全局聚合变量时应当使用累加器(Accumulator...脚本格式:$Hadoop_home/bin/start-balancer.sh -threshold,参数3是比例参数,表示3%,也就是平各个DataNode直接磁盘使用率偏差在3%以内 77、经验...:sparkSQL UDAF中update函数的第二个参数 input: Row 对应的并非DataFrame的行,而是被inputSchema投影了的行 78、Error: No TypeTag...和java的混合项目 解决方法:使用指令 mvn clean scala:compile compile package 84、sparkSQL的udf无法注册UDAF聚合函数 解决方法:把UDAF...contains at least one immense term in field=XXX 解决方法:在ES中创建索引时对长文本字段要分词 87、maven shade打包资源文件没有打进去
DataFrame与RDD的主要区别在于,前者带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。...中提供一个函数:toDF,通过指定列名称,将数据类型为元组的RDD或Seq转换为DataFrame,实际开发中也常常使用。...中数据处理方式 在SparkSQL模块中,将结构化数据封装到DataFrame或Dataset集合中后,提供两种方式分析处理数据,正如前面案例【词频统计WordCount】两种方式: 第一种:...原因:在SparkSQL中当Job中产生Shuffle时,默认的分区数(spark.sql.shuffle.partitions )为200,在实际项目中要合理的设置。...在构建SparkSession实例对象时,设置参数的值 好消息:在Spark3.0开始,不用关心参数值,程序自动依据Shuffle时数据量,合理设置分区数目。
* '}' Struct 结构是 Thrift 中的基本组合类型。 每个字段的名称在结构中必须是唯一的。...强烈建议不要使用此功能 Union 联合类似于结构,除了它们提供了一种方法来传输一组可能的字段中的一个字段,就像 C++ 中的 union {} 一样。...读取:必填字段始终被读取,并应包含在输入流中。 默认值:始终写入 如果在读取期间缺少必填字段,则预期的行为是向调用者指示不成功的读取操作,例如 通过抛出异常或返回错误。...默认值:设置 isset 标志时写入 大多数语言实现使用所谓的“isset”标志的推荐做法来指示是否设置了特定的可选字段。 仅写入设置了此标志的字段,相反,仅当从输入流中读取字段值时才设置该标志。...相反,如果将默认值写入输出数据,则 IDL 中的默认值可以随时更改,而不会影响序列化数据。 XSD 选项 注意:这些在 Facebook 有一些内部用途,但在 Thrift 中没有当前用途。
领取专属 10元无门槛券
手把手带您无忧上云