JAVA ’ 目录归档

颠覆大数据分析之实时分析的应用

颠覆大数据分析之实时分析的应用

译者:吴京润    购书

在这一节,我们将看到构建两个应用的步骤:一个工业日志分类系统和一个互联网流量过滤应用。

工业日志分类

随新旧生产工程系统的自动化以及电子工程的发展,大量的机器之间(M2M)的数据正在被生成出来。机器之间的数据可以来自多个不同的源头,包括无线传感器,电子消费设备,安全应用,还有智能家居设备。举个例子,2004年的地震和随后的海啸造就了由海洋传感器构成的海啸预警系统。自2011年的日本东北地区的地震以来,日本已经沿火车轨道安装了许多传感器,帮助探测不寻常的地震活动以便及时关闭火车运行。GE和其它大电子/电气公司拥有巨量的车间生产日志和其它的M2M数据。Splunk、Sumo Logic、Logscape,还有XpoLog是一些专注于M2M数据分析的公司。

这一切是如何组合在一起的:机器对机器的故障分析

这个用例来自电子制造公司。车间里的不同设备,接收输入,执行测试,以非结构化文本形式发送日志,记录测试运行的结果。日志基本上获取了每次测试的参数和它们的值以及输出的结果——这么做的意图就是确认测试是通过还是失败。为便于读者理解要处理和分析什么,下面给出日志文件样本。 阅读全文

颠覆大数据分析之Storm的设计模式

颠覆大数据分析之Storm的设计模式

译者:吴京润    购书

我们将要学习如何实现基于Storm的一些通用设计模式。设计模式,我们也称之为软件工程意识,是在给定上下文环境中,针对觉设计问题的可重用的通常解决方案。(Gamma et al. 1995)。它们是分布式远程过程调用(DRPCs),持续计算,以及机器学习。

分布式远程过程调用

过程调用为单机运行的程序提供了一个传输控制与数据的灵巧机制。把这一概念扩展到分布式系统中,出现了远程过程调用(RPC)——过程调用的概念可以跨越网络边界。客户机发起一次RPC时发生了下述事件顺序:

  1. 调用环境要么挂起要么忙等待。
  2. 参数被编组并通过网络传输到目的机、服务器或被调用者,也就是程序将要执行的地方。
  3. 参数被整理后,程序在远程节点执行。
  4. 远程节点的程序执行结束时,结果被传回客户机或源。
  5. 客户端程序就像刚从一个本地过程调用返回一样继续执行。

阅读全文

使用stream操作表达更高级的数据处理请求, Part 1

使用stream操作表达更高级的数据处理请求,Part 1

原文链接 作者:Raoul-Gabriel Urma 译者:石头狮子(v1.lion@qq.com) 校对:吴京润

没有了集合你会怎么做?几乎每一个Java应用都建立和处理集合。对于许多编程任务而言,这是基础的技术:集合分组和处理数据。例如,你可能想要建立一个银行交易集合来代表用户的账户记录。然后,你想要处理所有的集合找出用户花费了多少金额。尽管集合如此重要,但是Java的实现远非完美。

首先,典型的集合处理模式有点像SQL操作,例如”查找”(查找最大值的交易)或”分组”(编组所有与杂货购买有关的交易)。大部分的数据库可以允许我们声明式地指定这些操作。例如,后面的SQL查询可以让我们找出最高值的交易ID:”SELECT id, MAX(value) from transactions”。

阅读全文

JVM内部原理

JVM内部原理

原文链接 原文作者:James D Bloom 翻译:梅小西(904516706)  校对:吴京润

 

这篇文章详细描述了Java虚拟机的内在结构。下面这张图来自《The Java Virtual Machine Specification Java SE 7 Edition》,它展示了一个典型的JVM的主要的内部结构。

阅读全文

颠覆大数据分析之Storm简介

颠覆大数据分析之Storm简介

译者:吴京润    购书

之前我们已经极为简单的介绍了Storm。现在我们要对它做一个更详细的了解。Storm是一个复杂事件处理引擎(CEP),最初由Twitter实现。在实时计算与分析领域,Storm正在得到日益广泛的应用。Storm可以辅助基本的流式处理,例如聚合数据流,以及基于数据流的机器学习(译者注:原文是ML,根据上下文判断,此处应是指机器学习,下文相同不再缀述)。通常情况,数据分析(译者注:原文为prestorage analytics,意义应是保存分析结果之前的分析计算)在Storm之上进行,然后把结果保存在NOSQL或关系数据库管理系统(RDBMSs)。以气象频道为例,使用Storm以并行方式处理大数据集(译者注:原文用到munging,意义应是洗数据)并为离线计算持久化它们。 阅读全文

颠覆大数据分析之第二章结束语

颠覆大数据分析之第二章结束语

译者:黄经业    购书

本章讨论了一些业务场景,以及它们在BDAS框架中的实现。同时还介绍了什么是BDAS框架,并重点介绍了Spark, Shark,以及Mesos。Spark在那些涉及到优化的场景中非常有用——比如说Ooyala希望基于约束条件来动态地选择最优的CDN,以便提升视频的用户体验。必须注意的是,正如第一章所说的,众所周知,约束及变量过多的优化问题是很难在Hadoop MR中解决的。随机法要更适合Hadoop。不过你应当时刻牢记一点,Hadoop很难解决优化问题指的是它很难高效地实现规模化。

诸如MPI这些传统的并行编程工具或者Spark这类的新范式则非常适用于这类优化的问题,它们能够高效地进行扩展。另有数位研究人员也同时指出,Hadoop并不擅长迭代式机器学习算法,包括发明了Spark的伯克利的研究人员,以及GraphLab的研究人员,还有加州大学圣巴巴拉分校的MapScale团队。Satish Narayana Srirama教授在他的论文中就这个问题进行了深入的讨论(Srirama等2012)。最主要的原因就是它缺少长期存活的MR以及内存编程的支持。每一次MR迭代都要启动新的MR作业,并将数据从HDFS中拷贝到内存里,然后进行迭代,再将数据写回到HDFS,检查迭代是否终止…每次迭代都重复这些会带来显著的开销。 阅读全文

颠覆大数据分析之Mesos:集群调度及管理系统

颠覆大数据分析之Mesos:集群调度及管理系统

译者:黄经业    购书

正如前面“Mesos:动机”一节中所述,Mesos的主要目标就是去帮助管理不同框架(或者应用栈)间的集群资源。比如说,有一个业务需要在同一个物理集群上同时运行Hadoop,Storm及Spark。这种情况下,现有的调度器是无法完成跨框架间的如此细粒度的资源共享的。Hadoop的YARN调度器是一个中央调度器,它可以允许多个框架运行在一个集群里。但是,要使用框架特定的算法或者调度策略的话就变得很难了,因为多个框架间只有一种调度算法。比如说,MPI使用的是组调度算法,而Spark用的是延迟调度。它们两个同时运行在一个集群上会导致供求关系的冲突。还有一个办法就是将集群物理拆分成多个小的集群,然后将不同的框架独立地运行在这些小集群上。再有一个方法就是为每个框架分配一组虚拟机。正如Regola和Ducom所说的,虚拟化被认为是一个性能瓶颈,尤其是在高性能计算(HPC)系统中。这正是Mesos适合的场景——它允许用户跨框架来管理集群资源。

Mesos是一个双层调度器。在第一层中,Mesos将一定的资源提供(以容器的形式)给对应的框架。框架在第二层接收到资源后,会运行自己的调度算法来将任务分配到Mesos所提供的这些资源上。和Hadoop YARN的这种中央调度器相比,或许它在集群资源使用方面并不是那么高效。但是它带来了灵活性——比如说,多个框架实例可以运行在一个集群里。这是现有的这些调度器都无法实现的。就算是Hadoop YARN也只是尽量争取在同一个集群上支持类似MPI这样的第三方框架而已。更重要的是,随着新框架的诞生,比如说Samza最近就被LinkedIn开源出来了——有了Mesos这些新框架可以试验性地部署到现有的集群上,和其它的框架和平共处。 阅读全文

颠覆大数据分析之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的概念来结合本地优化器进行查询的全局优化。 阅读全文

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)提供了一个以数据为中心的异步编程模型,这或许是这类应用的一个更好的选择。

阅读全文

非阻塞算法

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

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

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

阅读全文

return top