作者归档

超越Hadoop的大数据分析之图形处理尺寸

本文翻译自《BIG DATA ANALYTICS BEYOND HADOOP》译者:许巧辉

另一个来自Google的重要工具,看起来超越了Hadoop MR——Pregel框架实现了图形计算(Malewicez et al.2010)。在Pregel中的计算是由一系列迭代组成的,被称为supersteps。图上的每个顶点都与一个用户定义的计算函数相关联;Pregel确保每个superstep在图的每条边上并发调用用户定义的计算函数。顶点可通过边发送消息,并且顶点间可交换值。这也是个全局同步——所有操作必须在用户定义的函数结束后才能继续。熟悉BSP的读者可以看出为什么Pregel是BSP优秀的例子——一组实体在用户定义的函数中使用全局锁并行计算,并且能够进行消息交换。
阅读全文

超越Hadoop的大数据分析之致谢

本文翻译自《BIG DATA ANALYTICS BEYOND HADOOP》译者:许巧辉

首先,我要衷心感谢Vineet Tyagi、AVP和Impetus的创新实验室主管。Vineet对我帮助很大,并促使我写这本书。在6、7月份,每个工作日他给我3个小时的时间写作本书,这是帮助我完成本书的关键。任何学术活动都要专门花费很多时间——这时候就得加倍努力,因为我必须在工作之余写作。Vineet令写作成为我工作的一部分。

我也想对Pankaj Mittal、CTO和SVP、Impetus表示感谢,他对研发的全心支持,像我这样的研发全职工作。荣誉对他来说,就是Impetus能够有一个无支付和收入压力的研发团队。这真的释放了我并有助于我专注于研发。在IT行业工作,写书是一个艰巨的任务。感谢Pankaj实现这点及类似的活动。
阅读全文

无等待是不够的

原文地址译文链接,译者:许巧辉,校对:周可人

无等待是不够的

以目前针对演进条件(progress condition,注:参考[1])的算法和数据结构的分类来看,是不足以区分不同演进条件的能力和每一个演进条件的性能/延迟。

我们提出了一种新的“大O”记号来表示无等待的算法和数据结构。下面是它的工作原理:

一个算法或功能被称为“Wait-Free O(x)“,表示需要最多O(x)操作完成。

阅读全文

Java Magic. Part 4: sun.misc.Unsafe

原文地址 译文地址 译者:许巧辉 校对:梁海舰

Java是一门安全的编程语言,防止程序员犯很多愚蠢的错误,它们大部分是基于内存管理的。但是,有一种方式可以有意的执行一些不安全、容易犯错的操作,那就是使用Unsafe类。

本文是sun.misc.Unsafe公共API的简要概述,及其一些有趣的用法。
阅读全文

[Google Guava] 3-缓存

原文地址  译文地址    译者:许巧辉  校对:沈义扬

范例

[code lang=”java”]
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.removalListener(MY_LISTENER)
.build(
new CacheLoader<Key, Graph>() {
public Graph load(Key key) throws AnyException {
return createExpensiveGraph(key);
}
});
[/code]

阅读全文

定制并发类(九)实现一个自定义的Lock类

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉

实现一个自定义的Lock类

锁是Java并发API提供的基本同步机制之一。它允许程序员保护代码的临界区,所以,在某个时刻只有一个线程能执行这个代码块。它提供以下两种操作:

  • lock():当你想要访问一个临界区时,调用这个方法。如果有其他线程正在运行这个临界区,其他线程将阻塞,直到它们被这个锁唤醒,从而获取这个临界区的访问。
  • unlock():你在临界区的尾部调用这个方法,允许其他线程访问这个临界区。

在Java并发API中,锁是在Lock接口及其一些实现类中声明的,比如ReentrantLock类。

在这个指南中,你将学习如何实现你自己的Lock对象,它将实现一个实现了Lock接口并可用来保护临界区的类。

阅读全文

定制并发类(七)实现ThreadFactory接口生成自定义的线程给Fork/Join框架

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉

实现ThreadFactory接口生成自定义的线程给Fork/Join框架

Fork/Join框架是Java7中最有趣的特征之一。它是Executor和ExecutorService接口的一个实现,允许你执行Callable和Runnable任务而不用管理这些执行线程。

这个执行者面向执行能被拆分成更小部分的任务。主要组件如下:

  • 一个特殊任务,实现ForkJoinTask类
  • 两种操作,将任务划分成子任务的fork操作和等待这些子任务结束的join操作
  • 一个算法,优化池中线程的使用的work-stealing算法。当一个任务正在等待它的子任务(结束)时,它的执行线程将执行其他任务(等待执行的任务)。

ForkJoinPool类是Fork/Join的主要类。在它的内部实现,有如下两种元素:

  • 一个存储等待执行任务的列队。
  • 一个执行任务的线程池

在这个指南中,你将学习如何实现一个在ForkJoinPool类中使用的自定义的工作者线程,及如何使用一个工厂来使用它。
阅读全文

定制并发类(五)在一个Executor对象中使用我们的ThreadFactory

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉

在一个Executor对象中使用我们的ThreadFactory

在前面的指南中,实现ThreadFactory接口生成自定义线程,我们引进了工厂模式和提供如何实现一个实现ThreadFactory接口的线程的工厂例子。

执行者框架(Executor framework)是一种机制,它允许你将线程的创建与执行分离。它是基于Executor、ExecutorService接口和实现这两个接口的ThreadPoolExecutor类。它有一个内部的线程池和提供一些方法,这些方法允许你提交两种任务给线程池执行。这两种任务是:

  • 实现Runnable接口的类,用来实现没有返回结果的任务
  • 实现Callable接口的类,用来实现有返回结果的任务

在执行者框架(Executor framework)的内部,它提供一个ThreadFactory接口来创建线程,这是用来产生新的线程。在这个指南中,你将学习如何实现你自己的线程类,用一个工厂来创建这个类的线程,及如何在执行者中使用这个工厂,所以这个执行者将执行你的线程。

阅读全文

定制并发类(四)实现ThreadFactory接口生成自定义的线程

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉

实现ThreadFactory接口生成自定义的线程

在面向对象编程的世界中,工厂模式(factory pattern)是一个被广泛使用的设计模式。它是一个创建模式,它的目的是开发一个类,这个类的使命是创建一个或多个类的对象。然后,当我们要创建一个类的一个对象时,我们使用这个工厂而不是使用new操作。

  • 使用这个工厂,我们集中对象的创建,获取容易改变创建对象的类的优势,或我们创建这些对象的方式,容易限制创建对象的有限资源。比如,我们只能有一个类型的N个对象,就很容易产生关于对象创建的统计数据。

Java提供ThreadFactory接口,用来实现一个Thread对象工厂。Java并发API的一些高级工具,如执行者框架(Executor framework)或Fork/Join框架(Fork/Join framework),使用线程工厂创建线程。

在Java并发API中的其他工厂模式的例子是Executors类。它提供许多方法来创建不同类型的Executor对象。

在这个指南中,你将继承Thread类,以添加新功能,并且你将实现一个线程工厂来创建这个新类的线程。

阅读全文

定制并发类(三)实现一个基于优先级的Executor类

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉

实现一个基于优先级的Executor类

在Java并发API的第一个版本中,你必须创建和运行应用程序中的所有线程。在Java版本5中,随着执行者框架(Executor framework)的出现,对于并发任务的执行,一个新的机制被引进。

使用执行者框架(Executor framework),你只要实现你的任务并把它们提交给执行者。这个执行者负责执行你的任务的线程的创建和执行。

在内部,一个执行者使用一个阻塞队列来存储待处理任务。以任务到达执行者的顺序来存储。一个可能的替代就是使用一个优先级列队来存储新的任务。这样,如果一个高优先级的新任务到达执行者,它将比其他已经在等待一个线程来执行它们,且低优先级的任务先执行。

在这个指南中,你将学习如何实现一个执行者,它将使用优先级队列来存储你提交执行的任务。

阅读全文

定制并发类(二)定制ThreadPoolExecutor类

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉

定制ThreadPoolExecutor类

执行者框架(Executor framework)是一种机制,允许你将线程的创建与执行分离。它是基于Executor和ExecutorService接口及其实现这两个接口的ThreadPoolExecutor类。它有一个内部的线程池和提供允许你提交两种任务给线程池执行的方法。这些任务是:

  • Runnable接口,实现没有返回结果的任务
  • Callable接口,实现返回结果的任务

在这两种情况下,你只有提交任务给执行者。这个执行者使用线程池中的线程或创建一个新的线程来执行这些任务。执行者同样决定任务被执行的时刻。

在这个指南中,你将学习如何覆盖ThreadPoolExecutor类的一些方法,计算你在执行者中执行的任务的执行时间,并且将关于执行者完成它的执行的统计信息写入到控制台。

阅读全文

定制并发类(一)引言

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉 

在这个文章中,我们将包含:

引言

Java 并发API提供许多接口和类来实现并发应用程序。它们提供底层(low-level)机制,如Thread类、Runnable或Callable接口、或synchronized关键字。同样也提供高级(high-level)机制,如Executor框架和Java 7 发布的Fork/Join框架。尽管这样,你可能发现你自己开发一个程序时,没有一个java类能满足你的需求。
阅读全文

定制并发类(十一)实现自定义的原子对象

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉 校对:方腾飞

实现你自己的原子(atomic)对象

Java版本5中引入原子变量,并提供对单个变量的原子操作。当一个线程在原子变量上执行操作时,这个类的实现包含一种机制用来检查这个操作在一个步骤内完成。基本上,这个操作是先获取变量的值,然后在本地变量中改变这个值,最后尝试将旧值变成这个新值。如果旧值仍然是相同的,它将改变成新值,否则,这个方法重新开始这个操作。(校对注:这段话描述了CAS的实现原理 )

在这个指南中,你将学习如何继承一个原子对象和如何实现遵从原子对象机制的两个操作,来保证所有的操作在一个步骤内完成。 阅读全文

并发集合(七)创建并发随机数

声明:本文是《 Java 7 Concurrency Cookbook 》的第六章,作者: Javier Fernández González     译者:许巧辉 校对:方腾飞

创建并发随机数

Java并发API提供指定的类在并发应用程序中生成伪随机。它是ThreadLocalRandom类,这是Java 7版本中的新类。它使用线程局部变量。每个线程希望以不同的生成器生成随机数,但它们是来自相同类的管理,这对程序员是透明的。在这种机制下,你将获得比使用共享的Random对象为所有线程生成随机数更好的性能。

在这个指南中,你将学习如何在并发应用程序中使用ThreadLocalRandom生成随机数。

阅读全文

并发集合(六)使用线程安全的NavigableMap

声明:本文是《 Java 7 Concurrency Cookbook 》的第六章,作者: Javier Fernández González     译者:许巧辉 校对:方腾飞

使用线程安全的NavigableMap

Java API 提供的有趣的数据结构,并且你可以在并发应用程序中使用,它就是ConcurrentNavigableMap接口的定义。实现ConcurrentNavigableMap接口的类存储以下两部分元素:

  • 唯一标识元素的key
  • 定义元素的剩余数据

每部分在不同的类中实现。

Java API 也提供了这个接口的实现类,这个类是ConcurrentSkipListMap,它实现了非阻塞列表且拥有ConcurrentNavigableMap的行为。在内部实现中,它使用Skip List来存储数据。Skip List是基于并行列表的数据结构,它允许我们获取类似二叉树的效率。使用它,你可以得到一个排序的数据结构,这比排序数列使用更短的访问时间来插入、搜索和删除元素。

注意:在1990年,由William Pugh引入Skip List。

当你往map中插入数据时,它使用key来排序它们,所以,所有元素将是有序的。除了返回具体的元素,这个类也提供了获取map的子map的方法。 阅读全文

return top