阅读更多

1顶
0踩

编程语言
6月11日(美国时间),Spark 1.4版本正式发布,在Spark Core、Spark Streaming、Spark SQL(DataFrame)、Spark ML/MLlib等升级之外,新版本更加入了数据科学家们望眼欲穿的SparkR组件。长话短说,下面一起看Databricks Blog上关于SparkR的介绍,以及七牛技术总监陈超在ChinaScala微信号上对组件升级的总结。

项目历史

SparkR源于AMPLab,是将R易用性和Spark扩展性整合的一个探索。在这个前提之下,SparkR开发者预览版最早在2014年1月开源。随后的一年,SparkR在AMPLab得到了飞速发展,而在许多贡献者的努力下,SparkR在性能和可用性上得到了显著提升。最近,SparkR被合并到Spark项目,并在1.4版本中作为alpha组件发布。

SparkR DataFrames

在Spark 1.4中,SparkR 的核心组件是SparkR DataFrames——在Spark上实现的一个分布式data frame。data frame 是R中处理数据的基本数据结构,而当下这个概念已经通过函数库(比如Pandas)扩展到其它所有语言。而像dplyr这样的项目更去除了基于data frames数据操作任务中存在的大量复杂性。在SparkR DataFrames中,一个类似dplyr和原生R data frame的API被发布,同时它还可以依托Spark,对大型数据集进行分布式计算。

下面例子将展示SparkR DataFrames API的一些特性。(你可以在这里看到完整示例)



更全面的 DataFrames介绍参见SparkR编程指南

SparkR整合的好处

在更易用的API之外,SparkR从Spark的紧密整合中继承了诸多好处。这些包括:
  • Data Sources API:通过Spark SQL的数据源API,API SparkR可以从包括Hive tables、JSON files、Parquet files等各种来源中读取数据。
  • Data Frame优化:SparkR DataFrames还继承了计算引擎中的大量优化,比如代码生成和内存管理。例如,下面图表是单机R、Python和Scala在1000万整数对上的group-by聚合操作运行时性能对比(使用了相同的数据集,参考这里)。如图所示,在计算引擎中优化可以使SparkR的性能表现类似于Scala和Python。




  • 可便捷地扩展到多核和多主机:在SparkR DataFrames 上执行的操作会被自动分配到Spark群集中所有可用的内核和机器上。因此,在配备了数千主机后,SparkR DataFrames 可以被用于TB数据的处理。

在未来的版本中,许多功能已经被计划添加到SparkR:其中包括高级别的机器学习算法支持,并将SparkR DataFrames 打造成Spark密不可分的组件。
Spark Core

现在大家最关心什么?无疑就是性能和运维!什么最影响性能?shuffle首当其冲!什么又是运维第一要务?必须是监控呀(就先不扯alert了)!1.4在这两点都做足了功夫。 1.4中,Spark为应用提供了REST API来获取各种信息(jobs / stages / tasks / storage info),使用这个API搭建个自己的监控简直是分分钟的事情,不止于此,DAG现在也能可视化了,不清楚Spark的DAGScheduler怎么运作的同学,现在也能非常轻易地知道DAG细节了。再来说说shuffle,大家都知道,从1.2开始sort-based shuffle已经成为默认的shuffe策略了,基于sort的shuffle不需要同时打开很多文件,并且也能减少中间文件的生成,但是带来的问题是在JVM的heap中留了大量的java对象,1.4开始,shuffle的map阶段的输出会被序列化,这会带来两个好处:1、spill到磁盘上的文件变小了  2、GC效率大增,有人又会说,序列化反序列化会产生额外的cpu开销啊,事实上,shuffle过程往往都是IO密集型的操作,带来的这点cpu开销,是可以接受。

大家期待的钨丝计划(Project Tungsten)也在1.4初露锋芒,引入了新的shuffle manager “UnsafeShuffleManager”,用以提供缓存友好的排序算法,及其它一些改进,目的是降低shuffle过程中的内存使用量,并且加速排序过程。钨丝计划必定会成为接下来两个版本(1.5,1.6)重点关注的地方。

Spark Streaming

Streaming在这个版本中增加了新的UI,简直是Streaming用户的福音,各种详细信息尽收眼底。话说Spark中国峰会上,TD当时坐我旁边review这部分的code,悄悄对说我”this is awesome”。对了,这部分主要是由朱诗雄做的,虽然诗雄在峰会上放了我鸽子,但必须感谢他给我们带来了这么好的特性!另外此版本也支持了0.8.2.x的Kafka版本。

Spark SQL(DataFrame)

支持老牌的ORCFile了,虽然比Parquet年轻,但是人家bug少啊 : ) 1.4提供了类似于Hive中的window function,还是比较实用的。本次对于join的优化还是比较给力的,特别是针对那种比较大的join,大家可以体会下。JDBC Server的用户肯定非常开心了,因为终于有UI可以看了呀。

Spark ML/MLlib

ML pipelines从alpha毕业了,大家对于ML pipelines的热情还真的蛮高的啊。我对Personalized PageRank with GraphX倒是蛮感兴趣的,与之相关的是recommendAll in matrix factorization model。事实上大多数公司还是会在Spark上实现自己的算法。
  • 大小: 158.2 KB
  • 大小: 17.8 KB
1
0
评论 共 1 条 请登录后发表评论
1 楼 somefuture 2015-06-15 18:03
完全没看懂

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • PipedInputStream,PipedOutputStream实例,线程间通信

    Java.io.PipedOutputStream and java.io.PipedInputStream has been introduced in JDK 1.0. PipedOutputStream and PipedInputStream both are connected to each other to create a communication pipe. PipedOutp...

  • Java管道 PipedInputStream PipedOutputStream

    PipedInputStream产生用于写入相关 PipedOutputStream的数据,实现管道化概念  PipedOutputStream作为多线程中

  • Java_io体系之PipedInputStream、PipedOutputStream简介、走进源码及示例——06

    Java_io体系之PipedInputStream/PipedOutputStream简介、走进源码及示例——06        ——管道输出流、必须建立在管道输入流之上、所以先介绍管道输出流。可以先看源码或者总结、总结写的有点Q、不喜可无视、有误的地方指出则不胜感激。 一:PipedOutputStream 1、       类功能简介: 管道字节输出流

  • Java中的信号量机制

    在多线程并发编程中,经常需要进行线程同步和互斥,以确保共享资源的正确访问和操作。Java中提供了信号量机制,通过计数器来控制线程的并发访问,保证对共享资源的访问是同步的。本文将介绍信号量机制的概述以及Java中常用的几个信号量类的原理。包括Semaphore类、CountDownLatch类、CyclicBarrier类、Exchanger类。最后提供一个使用信号量机制的场景,并简单分析其实现。信号量机制是一种计数器,用于线程同步和互斥,控制并发访问共享资源。

  • [七]JavaIO之 PipedInputStream 和 PipedInputStream

      管道简介   管道的含义,很久之前就已经出现 用于表示数据直接交互 它的含义与平时说的管道的含义是类似的,就是直连 JavaIO中的 PipedInputStream 和 PipedOutputStream 就是IO体系中字节流的管道         java中,PipedOutput...

  • PipedInputStream和PipedOutputStream的使用例子

    通过学习PipedInputStream和PipedOutputStream代码,发现有两点值得我们学习: 1、notifyAll(), wait(1000); 先把对象上所有的等待线程唤醒,然后把自己睡去一定时间后醒来。 和我们平时写生产者消费者时wait(), notifyAll()有一点点不一样。 2、处理循环buffer的方式不一样,用in==-1来表示buffer为空,同时处理bu

  • java中的信号量Semaphore

    信号量可以用来限制访问公共资源。在访问公共资源之前,线程必须从信号量获取许可。在访问资源之后,这个线程必须将许可返回给信号量,            为了创建信号量,必须使用可选的公平策略来确定许可的数量。任务通过调用信号量acquire() 方法来获得许可,可通过调用信号量的release()方法来释放许可。一旦获得许可,信号量中可用许可的数量减一。一旦许可呗释放掉,信号量的可用许可

  • Java IO操作——线程间通讯流(管道流 PipedOutputStream、PipedInputStream)

    管道流 管道流的作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream)、管道输入流(PipedInputStream)如果要想进行管道输出,则必须把输出流连在输入流之上,在PipedOutputStream中有一个方法用于连接管道: public void connect(PipedInputStream snk) throws IOException 要想实现管道...

  • 管道流PipedOutputStream与PipedInputStream 注意点

    1.PipedOutputStream与PipedInputStream不能放在同一个线程中,同时发生,不然会造成阻塞。2.PipedOutputStream与PipedInputStream实质是一个循环缓存数组,默认长度为1024.当数组满时,PipedOutputStream所在线程发生阻塞。当数组为空时,PipedInputStream发生阻塞。3.管道流在使用前要进行连接,用构造函数或者...

  • java学习笔记—实现一个类MyInputStream(28)

    1实现一个类MyInputStream读取文件,且不能抛出异常 public class TestDemo { public static void main(String[] args) throws Exception { InputStream in = new MyInputStream("d:/a/a.txt"); byte...

  • IO 输入与输出(3) -- 节点流之四PipedInputStream和PipedOutputStream

    <br />管道流类PipedInputStream类和PipedOutputStream类用于在应用程序中创建管道通信。一个PipedInputStream实例对象必须和PipedOutputStream实例对象进行连接而产生一个通信管道,PipedOutputsStream可以向管道中写入数据,PipedInputStream可以从管道中读取PipedOutputStream写入的数据,这两个类主要用来完成线程之间的通信,一个线程的PipedInputStream对象能够从另外一个线程的PipedOut

  • java 管道流PipedOutputStream和PipedInputStream基本操作

    java管道流PipedOutputStream和PipedInputStream基本操作

  • SftpUtil Pipe closed 超时导致的

    我的报错情况是连接成功,然后超过90s不操作,自动断开连接,此时没判断连接是否正常,直接读取文件,导致报错。 我导致这个错误的步骤是://创建sftp对象Channel channel = sshSession.openChannel("sftp");channel.connect();ChannelSftp sftp = (ChannelSftp) channel; //等待时间超过超时

  • Java多线程问题--PipedInputStream和PipedOutputStream实现线程间通信

    本文内容部分引自《Java多线程编程核心技术》,感谢作者!!! 代码地址:https://github.com/xianzhixianzhixian/thread.git 相关知识讲解 1、Java中提供了很多输入/输出流Stream,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输入管道,另一个线程从输入管道中读取数据。通过使用管道,...

  • Java IO流操作汇总: inputStream 和 outputStream

    我们在进行Android java 开发的时候,经常会遇到各种IO流操作。IO流操作一般分为两类:字符流和字节流。以“Reader”结尾都是字符流,操作的都是字符型的数据;以“Stream”结尾的都是字节流,操作的都是byte数据。现将各种常见IO流总结如下: 一、字节流 1.inputStream 和 outputStream inputStream 和 outputStream为各种输

  • java 命名管道_Java 中的进程与线程

    在 Java 语言中,对进程和线程的封装,分别提供了 Process 和 Thread 相关的一些类。Java 进程的建立方法ProcessBuilder.start 方法来建立一个本地的进程如果希望在新创建的进程中使用当前的目录和环境变量,则不需要任何配置,直接将命令行和参数传入 ProcessBuilder 中,然后调用 start 方法,就可以获得进程的引用。Process 也可以先配置环境...

  • 信号量能被 FixedThreadPool 替代吗?

    Semaphore 信号量 从图中可以看出,信号量的一个最主要的作用就是,来控制那些需要限制并发访问量的资源。具体来讲,信号量会维护“许可证”的计数,而线程去访问共享资源前,必须先拿到许可证。线程可以从信号量中去“获取”一个许可证,一旦线程获取之后,信号量持有的许可证就转移过去了,所以信号量手中剩余的许可证要减一 同理,线程也可以“释放”一个许可证,如果线程释放了许可证,这个许可证相当于被归还给信号量了,于是信号量中的许可证的可用数量加一。当信号量拥有的许可证数量减到 0 时,如果下个线程还想要获得

  • java线程信号量_Java线程间通信与信号量

    1. 信号量Semaphore先说说Semaphore,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。一般用于控制并发线程数,及线程间互斥。另外重入锁 ReentrantLock 也可以实现该功能,但实现上要复杂些。功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?...

Global site tag (gtag.js) - Google Analytics