Ji ZHANG's Blog

If I rest, I rust.

Java反射机制

原文:http://www.programcreek.com/2013/09/java-reflection-tutorial/

什么是反射?它有何用处?

1. 什么是反射?

“反射(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为。”这个概念常常会和内省(Introspection)混淆,以下是这两个术语在Wikipedia中的解释:

  1. 内省用于在运行时检测某个对象的类型和其包含的属性;
  2. 反射用于在运行时检测和修改某个对象的结构及其行为。

从他们的定义可以看出,内省是反射的一个子集。有些语言支持内省,但并不支持反射,如C++。

反射和内省

抽象泄漏定律

原文:http://www.joelonsoftware.com/articles/LeakyAbstractions.html

TCP协议是互联网的基石,我们每天都需要依靠它来构建各类互联网应用。也正是在这一协议中,时刻发生着一件近乎神奇的事情。

TCP是一种 可靠的 数据传输协议,也就是说,当你通过TCP协议在网络上传输一条消息时,它一定会到达目的地,而且不会失真或毁坏。

我们可以使用TCP来做很多事情,从浏览网页信息到收发邮件。TCP的可靠性使得东非贪污受贿的新闻能够一字一句地传递到世界各地。真是太棒了!

和TCP协议相比,IP协议也是一种传输协议,但它是 不可靠的 。没有人可以保证你的数据一定会到达目的地,或者在它到达前就已经被破坏了。如果你发送了一组消息,不要惊讶为何只有一半的消息到达,有些消息的顺序会不正确,甚至消息的内容被替换成了黑猩猩宝宝的图片,或是一堆无法阅读的垃圾数据,像极了台湾人的邮件标题。

这就是TCP协议神奇的地方:它是构建在IP协议之上的。换句话说,TCP协议能够 使用一个不可靠的工具来可靠地传输数据

Generate Auto-increment Id in Map-reduce Job

In DBMS world, it’s easy to generate a unique, auto-increment id, using MySQL’s AUTO_INCREMENT attribute on a primary key or MongoDB’s Counters Collection pattern. But when it comes to a distributed, parallel processing framework, like Hadoop Map-reduce, it is not that straight forward. The best solution to identify every record in such framework is to use UUID. But when an integer id is required, it’ll take some steps.

Solution A: Single Reducer

This is the most obvious and simple one, just use the following code to specify reducer numbers to 1:

1
job.setNumReduceTasks(1);

And also obvious, there are several demerits:

  1. All mappers output will be copied to one task tracker.
  2. Only one process is working on shuffel & sort.
  3. When producing output, there’s also only one process.

The above is not a problem for small data sets, or at least small mapper outputs. And it is also the approach that Pig and Hive use when they need to perform a total sort. But when hitting a certain threshold, the sort and copy phase will become very slow and unacceptable.

Hive并发情况下报DELETEME表不存在的异常

在每天运行的Hive脚本中,偶尔会抛出以下错误:

1
2
3
4
5
6
7
8
2013-09-03 01:39:00,973 ERROR parse.SemanticAnalyzer (SemanticAnalyzer.java:getMetaData(1128)) - org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table dw_xxx_xxx
        at org.apache.hadoop.hive.ql.metadata.Hive.getTable(Hive.java:896)
        ...
Caused by: javax.jdo.JDODataStoreException: Exception thrown obtaining schema column information from datastore
NestedThrowables:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hive.DELETEME1378143540925' doesn't exist
        at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:313)
        ...

查阅了网上的资料,是DataNucleus的问题。

背景1:我们知道MySQL中的库表信息是存放在information_schema库中的,Hive也有类似的机制,它会将库表信息存放在一个第三方的RDBMS中,目前我们线上配置的是本机MySQL,即:

$ mysql -uhive -ppassword hive

1.png

Ansible FAQ

本文是从原Ansible官网的FAQ页面翻译而来,网站改版后该页面已无法访问,但可以从Github历史提交中获得。翻译这篇原始FAQ文档是因为它陈述了Ansible这款工具诞生的原因,设计思路和特性,以及与Puppet、Fabric等同类软件的比较,可以让我们对Ansible有一个整体的了解,所以值得使用者一读。

目录

  • 为什么命名为“Ansible”?
  • Ansible受到了谁的启发?
  • 与同类软件比较
    • Func?
    • Puppet?
    • Chef?
    • Capistrano/Fabric?
  • 其它问题
    • Ansible的安全性如何?
    • Ansible如何扩展?
    • 是否支持SSH以外的协议?
    • Ansible的适用场景有哪些?

为什么命名为“Ansible”?

我最喜爱的书籍之一是奥森·斯科特·卡特的《安德的游戏》。在这本书中,“Ansible”是一种能够跨越时空的即时通讯工具。强烈推荐这本书!

Apache Hadoop YARN - 项目背景与简介

原文:http://hortonworks.com/blog/apache-hadoop-yarn-background-and-an-overview/

日前,Apache Hadoop YARN已被提升为Apache软件基金会的子项目,这是一个值得庆祝的里程碑。这里我们也第一时间为各位献上Apache Hadoop YARN项目的系列介绍文章。YARN是一个普适的、分布式的应用管理框架,运行于Hadoop集群之上,用以替代传统的Apache Hadoop MapReduce框架。

MapReduce 模式

本质上来说,MapReduce模型包含两个部分:一是Map过程,将数据拆分成若干份,分别处理,彼此之间没有依赖关系;二是Reduce过程,将中间结果汇总计算成最终结果。这是一种简单而又条件苛刻的模型,但也促使它成为高效和极易扩展的并行计算方式。

Apache Hadoop MapReduce是当下最流行的开源MapReduce模型。

特别地,当MapReduce配合分布式文件系统,类似Apache Hadoop HDFS,就能在大集群上提供高吞吐量的计算,这一经济效应是Hadoop得以流行的重要原因。

这一模式成功的原因之一是,它使用的是“移动计算能力至数据节点”而非通过网络“移动数据至计算节点”的方式。具体来说,一个MapReduce任务会被调度到输入数据所在的HDFS节点执行,这会极大地减少I/O支出,因为大部分I/O会发生在本地磁盘或是同一机架中——这是核心优势。

Cascalog:基于Clojure的Hadoop查询语言

原文:http://nathanmarz.com/blog/introducing-cascalog-a-clojure-based-query-language-for-hado.html

我非常兴奋地告诉大家,Cascalog开源了!Cascalog受Datalog启发,是一种基于Clojure、运行于Hadoop平台上的查询语言。

特点

  • 简单 – 使用相同的语法编写函数、过滤规则、聚合运算;数据联合(join)变得简单而自然。
  • 表达能力强 – 强大的逻辑组合条件,你可以在查询语句中任意编写Clojure函数。
  • 交互性 – 可以在Clojure REPL中执行查询语句。
  • 可扩展 – Cascalog的查询语句是一组MapReduce脚本。
  • 任意数据源 – HDFS、数据库、本地数据、以及任何能够使用Cascading的Tap读取的数据。
  • 正确处理空值 – 空值往往让事情变得棘手。Cascalog提供了内置的“非空变量”来自动过滤空值。
  • 与Cascading结合 – 使用Cascalog定义的流程可以在Cascading中直接使用,反之亦然。
  • 与Clojure结合 – 能够使用普通的Clojure函数来编写操作流程、过滤规则,又因为Cascalog是一种Clojure DSL,因此也能在其他Clojure代码中使用。

Manage Leiningen Project Configuration

In Maven projects, we tend to use .properties files to store various configurations, and use Maven profiles to switch between development and production environments. Like the following example:

1
2
# database.properties
mydb.jdbcUrl=${mydb.jdbcUrl}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- pom.xml -->
<profiles>
    <profile>
        <id>development</id>
        <activation><activeByDefault>true</activeByDefault></activation>
        <properties>
            <mydb.jdbcUrl>jdbc:mysql://127.0.0.1:3306/mydb</mydb.jdbcUrl>
        </properties>
    </profile>
    <profile>
        <id>production</id>
        <!-- This profile could be moved to ~/.m2/settings.xml to increase security. -->
        <properties>
            <mydb.jdbcUrl>jdbc:mysql://10.0.2.15:3306/mydb</mydb.jdbcUrl>
        </properties>
    </profile>
</profiles>

As for Leiningen projects, there’s no variable substitution in profile facility, and although in profiles we could use :resources to compact production-wise files into Jar, these files are actually replacing the original ones, instead of being merged. One solution is to strictly seperate environment specific configs from the others, so the replacement will be ok. But here I take another approach, to manually load files from difference locations, and then merge them.

Clojure实战(5):Storm实时计算框架

Storm简介

上一章介绍的Hadoop工具能够对海量数据进行批量处理,采用分布式的并行计算架构,只需使用其提供的MapReduce API编写脚本即可。但随着人们对数据实时性的要求越来越高,如实时日志分析、实时推荐系统等,Hadoop就无能为力了。

这时,Storm诞生了。它的设计初衷就是提供一套分布式的实时计算框架,实现低延迟、高并发的海量数据处理,被誉为“Realtime Hadoop”。它提供了简单易用的API接口用于编写实时处理脚本;能够和现有各类消息系统整合;提供了HA、容错、事务、RPC等高级特性。

Storm的官网是:storm-project.net,它的Wiki上有非常详尽的说明文档。

Storm与Clojure

Storm的主要贡献者Nathan Marz徐明明都是活跃的Clojure开发者,因此在Storm框架中也提供了原生的Clojure DSL。本文就将介绍如何使用这套DSL来编写Storm处理脚本。

Storm集群的安装配置这里不会讲述,具体请参考这篇文档。下文的脚本都运行在“本地模式”之下,因此即使不搭建集群也可以运行和调试。

Perl入门实战:JVM监控脚本(下)

套接字

使用套接字(Socket)进行网络通信的基本流程是:

  • 服务端:监听端口、等待连接、接收请求、发送应答;
  • 客户端:连接服务端、发送请求、接收应答。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use IO::Socket::INET;

my $server = IO::Socket::INET->new(
    LocalPort => 10060,
    Type => SOCK_STREAM,
    Reuse => 1,
    Listen => SOMAXCONN
) || die "服务创建失败\n";

while (my $client = $server->accept()) {

    my $line = <$client>;
    chomp($line);

    if ($line =~ /^JVMPORT ([0-9]+)$/) {
        print "RECV $1\n";
        print $client "OK\n";
    } else {
        print "ERROR $line\n";
        print $client "ERROR\n";
    }

    close($client);
}

close($server);