颠覆大数据分析之Spark为Shark所提供的扩展

颠覆大数据分析之SparkShark所提供的扩展

译者:黄经业    购书

在Spark的RDD上执行SQL查询遵循的是传统并行数据库的三步流程:

  1. 查询解析
  2. 逻辑计划的生成
  3. 将逻辑计划映射为物理的执行计划

Shark使用Hive查询编译器来进行查询语句的解析。它会生成一棵抽象语法树,然后再将它转化成一个逻辑计划。Shark中逻辑计划的生成方式也类似于Hive中的。但两者的物理计划的生成方式则不尽相同。Hive中的物理计划是一系列的MR作业,而Shark中的则是分阶段RDD转换的一个有向无环图。由于Shark的高工作负荷的这个性质(通常在Hive中机器学习及用户定义函数(UDF)都很常见),因此在编译期很难获取到物理查询计划。对于新数据而言的确是这样的(之前还未被加载到Shark中)。值得注意的是, Hive和Shark都经常用来查询这类数据。因此,Shark引入了一个叫部分有向无环图执行(Partial DAG Execution,PDE)的概念。

部分DAG执行

这项技术会基于运行时收集的数据来生成查询语句的执行计划,而不是在编译期就去生成查询的物理执行计划。收集的数据包括分区大小,倾斜检测的记录条数,哪些记录是频繁出现的,以及RDD分区中数据分布的粗略的直方图。Spark在洗牌阶段之前会将map输出存储到内存中——之后reduce任务会通过MOT组件来使用这些数据。Shark的第一个改动是收集了指定分区以及全局环境的数据。另一个修改则是使得DAG可以在运行时根据所收集的数据来进行改变。必须注意的是,Shark是基于单个节点上的查询优化方法来构建的,它使用了PDE的概念来结合本地优化器进行查询的全局优化。 阅读全文

颠覆大数据分析之Shark:分布式系统上的SQL接口

颠覆大数据分析之Shark:分布式系统上的SQL接口

译者:黄经业    购书

内存计算已经成为了海量数据分析的一个重要范式。这一点可以从两个方面来进行理解。一方面,尽管当要查询的数据达到了PB级,但是由于时间和空间的局限性,在一个集群环境上仅需64GB的缓存就能够满足绝大多数的查询(95%)。Ananthanarayanan等人在一次研究中发现了这点。另一方面,由于机器学习算法需要在数据的工作集上进行迭代,如果工作数据集在内存中,它的实现会变得非常高效。Shark本质上可以看作是一个内存型的分布式SQL系统。

Shark基于Spark提供了SQL接口。Shark的主要特性就是它的SQL接口以及它能够基于机器学习来进行分析的能力,同时还有它为SQL查询和机器学习算法所提供的细粒度的容错性。对于查询而言,即使是粗粒度的RDD也能工作得很好,因为Shark可以从失败中进行恢复,它会去重新构造集群中丢失的RDD分区。这个恢复是细粒度的,这意味着它可以在查询的过程中进行恢复,并不像并行数据库系统那样得重新执行整个查询。

Stackoverflow问答翻译征集令

最近我在翻译Stackoverflow上的一些经典问答,希望有兴趣的各位译者可以一起来进行翻译,我找了一些vote很高的问答,有兴趣的同学可以来认领。
1.Why is processing a sorted array faster than an unsorted array?
2.Avoiding “!= null” statements in Java?
3.Differences between HashMap and Hashtable?
4.Creating a memory leak with Java
5.Why is char[] preferred over String for passwords?
6.When to use LinkedList over ArrayList?
7.How to test a class that has private methods, fields or inner classes
8.How to avoid Java Code in JSP-Files?
9.“implements Runnable” vs. “extends Thread”
10.Java inner class and static nested class
11.Examples of GoF Design Patterns in Java’s core libraries
12.What is reflection, and why is it useful?
13.What issues should be considered when overriding equals and hashCode in Java?
14.Why does Java have transient variables?
15.How do servlets work? Instantiation, session variables and multithreading

最简单例子图解JVM内存分配和回收

原文链接:最简单例子图解JVM内存分配和回收

一、简介

JVM采用分代垃圾回收。在JVM的内存空间中把堆空间分为年老代和年轻代。将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象。年轻代中又被分为Eden区(圣经中的伊甸园)、和两个Survivor区。新的对象分配是首先放在Eden区,Survivor区作为Eden区和Old区的缓冲,在Survivor区的对象经历若干次收集仍然存活的,就会被转移到年老区。

jvm-memory-generation

阅读全文

颠覆大数据分析之RDD的表达性

颠覆大数据分析之RDD的表达性

译者:黄经业    购书

正如前面在比较Spark及DSM系统时所提到的,由于RDD只支持粗粒度的操作,因此它有一定的局限性。但是RDD的表达性对于大多数程序而言其实已经足够好了。AMPLabs团队他们仅花了数百行代码就开发出了整个Pregel,这是Spark上的一个小的库。可以通过RDD及相关的操作来表示的集群计算模型列举如下:

  • Map-Reduce:如果存在混合器的话,这个可以使用RDD上的flatMap和reduceByKey操作来表示。简单点的话可以表示成flatMap和groupByKey操作。运算符则对应于Spark中的转换操作。
  • DryadLINQ:DryadLINQ(Yu等2008)通过结合了声明性及命令式编程提供了MR所没有的操作。大多数操作符都能对应上Spark中的转换操作。Dryad中的apply结构就类似于RDD的map转换,而Fork结构则类似于flatMap转换。
  • 整体同步并行(BSP):Pregel (Malewicz等 2010)中的计算由一系列称为超步骤的迭代所组成。图中的每个顶点都关联上一个用户定义的计算函数;Pregel会确保在每一个超步骤中,用户定义的函数都会并行地在每一条边上执行。顶点可以通过边来发送消息并与其它的顶点交互数据。同样的,还会有一个全局的栅栏——当所有的计算函数都终止的时候它就会向前移动。熟悉BSP的读者可能会知道,Pregel是一个完美的BSP的典范——一组实体在并行地计算用户定义的函数,它们有全局的同步器并可以交换消息。由于同一个用户函数会作用于所有的顶点,这种情况可以这样实现,将所有顶点存储在一个RDD中并在上面运行flatMap操作来生成一个新的RDD。把它和跟顶点的RDD连接到一块,这样就可以实现消息传递了。
  • 迭代式Map-Reduce:HaLoop项目也同样扩展了Hadoop来支持迭代式机器学习算法。HaLoop不仅为迭代式应用提供了编程抽象,同时它还用到了缓存的概念来在迭代间进行数据共享和固定点校验(迭代的终止)以便提升效率。Twister (Ekanayake等2010)是另一个类似HaLoop的尝试。这些在Spark中都可以很容易实现,因为它本身非常容易进行迭代式计算。AMPLabs团队实现HaLoop仅花了200行代码。

Stackoverflow问答:Java是传值还是传引用?

原文地址 译者:叶文海(yewenhai@gmail.com)
译者注:这是一篇在Stackoverflow上面的一个经典问题,也是Java开发者容易混淆的一个问题,我节选了其中两个vote最高的回复进行翻译。
问题:我一直认为Java的参数是按引用传递,然而我看过一些文章里说Java的参数并不是按引用传递的,比如这篇,这让我很迷惑。Java中的参数到底是按引用传递还是按值传递?
阅读全文

阿姆达尔定律

原文地址  作者:Jakob Jenkov  译者:张坤

阿姆达尔定律可以用来计算处理器平行运算之后效率提升的能力。阿姆达尔定律因Gene Amdal 在1967年提出这个定律而得名。绝大多数使用并行或并发系统的开发者有一种并发或并行可能会带来提速的感觉,甚至不知道阿姆达尔定律。不管怎样,了解阿姆达尔定律还是有用的。

阅读全文

颠覆大数据分析之Spark VS分布式共享内存系统

颠覆大数据分析之Spark VS分布式共享内存系统

译者:黄经业    购书

Spark可以看作是一个分布式共享集合系统,和Stumm和Zhou (1990)以及Nitzber和Lo (1991)所提到的传统的分布式共享内存(DSM)系统则略有不同。DSM系统允许单独读写内存,而Spark只允许进行粗粒度的RDD转换。尽管这限制了能够使用Spark的应用种类,但它对于实现高效的容错性却很有帮助。DSM系统可能会需要检查点相互协作来完成容错,比如说使用Boukerche等人(2005)所提出的协议。相反的,Spark只需要存储世系图来进行容错。恢复需要在RDD丢失的分区上进行重构操作——但这个可以并行地高效完成。Spark与DSM系统的另一个根本的不同在于,由于RDD的只读特性,Spark中可以使用流浪者缓解策略——这使得备份任务可以并行地完成,这类似于MR中的推测执行(Dinu和Ng 2012)。而在DSM中则很难缓解流浪者或者备份任务,因为这两者都可能会产生内存竞争。Spark的另一个优点是当RDD的大小超出集群的所有内存时可以优雅地进行降级。它的缺点就是RDD的转换本质上是粗粒度的,这限制了能够开发的应用的种类。比如说,需要细粒度共享状态访问的应用,像WEB爬虫或者其它WEB应用,都很难在Spark上实现。Piccolo (Power和 Li 2010)提供了一个以数据为中心的异步编程模型,这或许是这类应用的一个更好的选择。

阅读全文

颠覆大数据分析之Spark弹性分布式数据集

颠覆大数据分析之Spark弹性数据集

译者:黄经业    购书

Spark中迭代式机器学习算法的数据流可以通过图2.3来进行理解。将它和图2.1中Hadoop MR的迭代式机器学习的数据流比较一下。你会发现在Hadoop MR中每次迭代都会涉及HDFS的读写,而在Spark中则要简单得多。它仅需从HDFS到Spark中的分布式共享对象空间的一次读入——从HDFS文件中创建RDD。RDD可以重用,在机器学习的各个迭代中它都会驻留在内存里,这样能显著地提升性能。当检查结束条件发现迭代结束的时候,会将RDD持久化,把数据写回到HDFS中。后续章节会对Spark的内部结构进行详细介绍——包括它的设计,RDD,以及世系等等。

阅读全文

非阻塞算法

原文地址  作者:Jakob Jenkov   译者:张坤

在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法。在绝大多数项目中,在算法中如果一个线程的挂起没有导致其它的线程挂起,我们就说这个算法是非阻塞的。

为了更好的理解阻塞算法和非阻塞算法之间的区别,我会先讲解阻塞算法然后再讲解非阻塞算法。

阅读全文

Netty框架中的@Skip使用说明

最近在学习Netty框架,对着教程上写了个简单的netty应用,可是死活调试不成功,对着程序跟教程上看了几遍也找不到原因,后来又重新写了一遍,服务端程序终于调试成功,原因出在了那个@Skip注释上了,代码如下:
阅读全文

Java并发编程之CAS

原文地址:作者: Jakob Jenkov   译者:张坤

CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术。简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值。这听起来可能有一点复杂但是实际上你理解之后发现很简单,接下来,让我们跟深入的了解一下这项技术。

阅读全文

并发环境下HashMap引起的full gc排查

作者:佐井    原文地址

现象

最近上线一个需求,完成需求的过程对代码进行了一次重构。应用发布后半个小时左右,发现一个机器报警,load过高。登陆机器看CPU使用情况,发现load已经正常,看下CPU使用情况,发现有一个核跑满,其他CPU使用率很低。大概一个小时后,其他机器陆续报警,发现同样的问题,紧急回滚应用。

应用运行在16G内存的虚机上,整个JVM11G内存,其中新生代3G,CMS gc,JDK7。

第一反应是JVM可能在进行full gc,因为只有一个线程跑满,其他线程被JVM暂停了。先去应用日志看下应用运行情况,果然日志已经没有任何输出。jstat -gcutil查看JVM内存使用情况,发现Old区使用已经100%。

阅读全文

源码剖析AQS在几个同步工具类中的使用

感谢网友【张超盟】的投稿

1. 前言

AQS(AbstractQueuedSynchronizer)是 java.util.concurrent的基础。J.U.C中宣传的封装良好的同步工具类SemaphoreCountDownLatchReentrantLockReentrantReadWriteLockFutureTask等虽然各自都有不同特征,但是简单看一下源码,每个类内部都包含一个如下的内部类定义:

[code lang=”java”] abstract static class Sync extends AbstractQueuedSynchronizer [/code]

阅读全文

Java中不同的并发实现的性能比较

原文链接   作者:Alex Zhitnitsky   译者:有孚ForkJoinWars

Fork/Join框架在不同配置下的表现如何?

正如即将上映的星球大战那样,Java 8的并行流也是毁誉参半。并行流(Parallel Stream)的语法糖就像预告片里的新型光剑一样令人兴奋不已。现在Java中实现并发编程存在多种方式,我们希望了解这么做所带来的性能提升及风险是什么。从经过260多次测试之后拿到的数据来看,还是增加了不少新的见解的,这里我们想和大家分享一下。

阅读全文

return top