归档之于 ‘ 2015 年4月 ’
为什么我的JVM能实际使用的内存比-Xmx指定的少?
作者:Nikita Salnikov-Tarnovski 译者:Amanda 校对:
“你好,你能过来看看帮我解决一个奇怪的问题么。”就是这个技术支持案例使我想起写下这篇帖子。眼前的这个问题就是关于不同工具对于可用内存大小检测的差异。
其实就是一个工程师在调查一个应用程序的过高的内存使用情况时发现,尽管该程序已经被指定分配2G堆内存,但是JVM检测工具似乎并不能确定进程实际能用多少内存。例如 jconsole显示可用堆内存为1,963M,然而 jvisualvm 却显示能用2,048M。所以到底哪个工具才是对的,为什么检测结果会出现差异呢?
这确实是个挺奇怪的问题,特别是当最常出现的几种解释理由都被排除后,看来JVM并没有耍一些明显的小花招:
- -Xmx和-Xms是相等的,因此检测结果并不会因为堆内存增加而在运行时有所变化。
- 通过关闭自适应调整策略(-XX:-UseAdaptiveSizePolicy),JVM已经事先被禁止动态调整内存池的大小。
颠覆大数据分析之结论
颠覆大数据分析之结论
译者:吴京润 购书
随着Hadoop2.0到来——被称作YARN的Hadoop新版本——超越Map-Reduce的思想已经稳固下来。就像本章要解释的,Hadoop YARN将资源调度从MR范式分离出来。需要注意的是在Hadoop1.0,Hadoop第一代,调度功能是与Map-Reduce范式绑定在一起的——这意味着在HDFS上惟一的处理方式就是Map-Reduce或它的业务流程。这一点已在YARN得到解决,它使得HDFS数据可以使用非Map-Reduce范式处理。其含义是,从事实上确认了Map-Reduce不是惟一的大数据分析范式,这也是本书的中心思想。 Hadoop YARN允许企业将数据存储在HDFS,并使用专业框架以多种方式处理数据。比如,Spark可以借助HDFS上的数据迭代运行机器学习算法。(Spark已重构为工作在YARN之上,感谢Yahoo的创新精神),还有GraphLab/Giraph可以借助这些数据用来运行基于图的算法。显而易见的事实是,主要的Hadoop发行版已宣布支持Spark(Cloudera的),Storm(Hortonworks的),还有Giraph(Hortonworkds的)。所有的一切,本书一直主张的超越Hadoop Map-Reduce的思想已通过Hadoop YARN得到了验证。本章概述了Hadoop YARN以及不同的框架(Spark/GraphLab/Storm)如何工作在它上面工作。
颠覆大数据分析之实时分析的应用
颠覆大数据分析之实时分析的应用
译者:吴京润 购书
在这一节,我们将看到构建两个应用的步骤:一个工业日志分类系统和一个互联网流量过滤应用。
工业日志分类
随新旧生产工程系统的自动化以及电子工程的发展,大量的机器之间(M2M)的数据正在被生成出来。机器之间的数据可以来自多个不同的源头,包括无线传感器,电子消费设备,安全应用,还有智能家居设备。举个例子,2004年的地震和随后的海啸造就了由海洋传感器构成的海啸预警系统。自2011年的日本东北地区的地震以来,日本已经沿火车轨道安装了许多传感器,帮助探测不寻常的地震活动以便及时关闭火车运行。GE和其它大电子/电气公司拥有巨量的车间生产日志和其它的M2M数据。Splunk、Sumo Logic、Logscape,还有XpoLog是一些专注于M2M数据分析的公司。
这一切是如何组合在一起的:机器对机器的故障分析
这个用例来自电子制造公司。车间里的不同设备,接收输入,执行测试,以非结构化文本形式发送日志,记录测试运行的结果。日志基本上获取了每次测试的参数和它们的值以及输出的结果——这么做的意图就是确认测试是通过还是失败。为便于读者理解要处理和分析什么,下面给出日志文件样本。 阅读全文
颠覆大数据分析之Storm的设计模式
颠覆大数据分析之Storm的设计模式
译者:吴京润 购书
我们将要学习如何实现基于Storm的一些通用设计模式。设计模式,我们也称之为软件工程意识,是在给定上下文环境中,针对觉设计问题的可重用的通常解决方案。(Gamma et al. 1995)。它们是分布式远程过程调用(DRPCs),持续计算,以及机器学习。
分布式远程过程调用
过程调用为单机运行的程序提供了一个传输控制与数据的灵巧机制。把这一概念扩展到分布式系统中,出现了远程过程调用(RPC)——过程调用的概念可以跨越网络边界。客户机发起一次RPC时发生了下述事件顺序:
- 调用环境要么挂起要么忙等待。
- 参数被编组并通过网络传输到目的机、服务器或被调用者,也就是程序将要执行的地方。
- 参数被整理后,程序在远程节点执行。
- 远程节点的程序执行结束时,结果被传回客户机或源。
- 客户端程序就像刚从一个本地过程调用返回一样继续执行。
使用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的系统
颠覆大数据分析之类似Spark的系统
译者:黄经业 购书
Nectar (Gunda 等2010),HaLoop (Bu 等2010),以及Twister(Ekanayake等2010)都是类似于Spark的系统。HaLoop是修改后的Hadoop,它增加了一个支持循环的任务调度器以及一定的缓存机制。缓存一方面是用于缓存映射器的循环数据变量,另一方面是用于缓存归约器的输出以便使得终止条件判断可以更高效地进行。Twister提供了订阅-发布的设施来实现一个广播的结构,同时它还能在历次迭代间指定及缓存静态数据。Twister和HaLoop都是扩展MR范式以支持迭代式运算的很有意思的实现。然而它们只能算是学术项目,并没有提供稳定的实现版本。除此之外,Spark通过世系所提供的容错性要比Twister和HaLoop所提供的要更先进和高效。另一个重要的不同在于Spark的编程模型更加通用,map和reduce只是它所支持的众多结构中的一组而已。它还有许多更强大的结构,包括reduceByKey以及前面所提到的一些。 阅读全文
颠覆大数据分析之Spark为Shark所提供的扩展
颠覆大数据分析之Spark为Shark所提供的扩展
译者:黄经业 购书
在Spark的RDD上执行SQL查询遵循的是传统并行数据库的三步流程:
- 查询解析
- 逻辑计划的生成
- 将逻辑计划映射为物理的执行计划
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