异度部落格

学习是一种生活态度。

0%

Environment

OS: Ubuntu 12.04 LTS

Kernel Version: 3.8.0-33-generic

Hadoop: 2.2.0

Pre-Compile

官方的 BUILDING.txt 给出的安装需求

image

安装 JDK

1
sudo apt-get install openjdk-7-jdk

安装 Maven

1
sudo apt-get install maven

安装 Findbugs

Download: http://findbugs.sourceforge.net/

设置环境变量

1
2
3
4
vi .bashrc
#set findbugs path
export FINDBUGS_HOME=/home/killua/Dev/findbugs-2.0.3
export PATH=$PATH:$FINDBUGS_HOME/bin

安装 ProtocolBuffer

Download: https://code.google.com/p/protobuf/

在安装 protocolbuffer 之前需要先安装 g++

1
sudo apt-get install g++

安装 protocolbuffer

1
2
3
4
cd  protobuf-2.5.0
./configure
make
make install

安装 CMake

1
sudo apt-get install cmake

Compile

1
mvn package -Pdist -DskipTests -Dtar

image

编译后的结果可以在 hadoop-2.2.0-src/hadoop-dist/target/hadoop-2.2.0 中看到

image

常见问题

1) error: cannot access AbstractLifeCycle

在编译的过程中出现/home/killua/Workspace/hadoop-2.2.0-src/hadoop-common-project/hadoop-auth/src/test/java/org/apache/hadoop/security/authentication/client/AuthenticatorTestCase.java:[88,11] error: cannot access AbstractLifeCycle 错误

经过查证发现是 hadoop2.2.0 的一个 bug,具体参见https://issues.apache.org/jira/browse/HADOOP-10110 

解决方法:

修改 hadoop-2.2.0-src/hadoop-common-project/hadoop-auth/pom.xml,将

1
2
3
4
5
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<scope>test</scope>
</dependency>

修为

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<scope>test</scope>
</dependency>

NameNode

Hadoop NameNode 管理着文件系统的 Namespace,它维护着整个文件系统树(FileSystem Tree)以及文件树中所有的文件和文件夹元数据(Metadata)。

Namenode Metadata 主要是两个文件:edits 和 fsimage。fsimage 是 HDFS 的最新状态(截止到 fsimage 文件创建时间的最新状态)文件,而 edits 是自 fsimage 创建后的 namespace 操作日志。Namenode 每次启动的时候,都要合并两个文件,按照 edits 的记录,把 fsimage 文件更新到最新。

Secondary NameNode

Hadoop SecondaryNameNode 并不是 Hadoop 第二个 NameNode,它不提供 NameNode 服务,而仅仅是 NameNode 的一个工具,帮助 NameNode 管理 Metadata 数据。

一般情况下,当 NameNode 重启的时候,会合并硬盘上的 fsimage 文件和 edits 文件,得到完整的 Metadata 信息。但是,如果集群规模十分庞大,操作频繁,那么 edits 文件就会非常大,这个合并过程就会非常慢,导致 HDFS 长时间无法启动。如果定时将 edits 文件合并到 fsimage,那么重启 NameNode 就可以非常快,而 SecondaryNameNode 就做这个合并的工作。

SecondaryNamenode 定期地从 Namenode 上获取元数据。当它准备获取元数据的时候,就通知 Namenode 暂停写入 edits 文件。Namenode 收到请求后停止写入 edits 文件,之后的 log 记录写入一个名为 edits.new 的文件。Secondary Namenode 获取到元数据以后,把 edits 文件和 fsimage 文件在本机进行合并,创建出一个新的 fsimage 文件,然后把新的 fsimage 文件发送回 Namenode。Namenode 收到 Secondary Namenode 发回的 fsimage 后,就拿它覆盖掉原来的 fsimage 文件,并删除 edits 文件,把 edits.new 重命名为 edits。

通过这样一番操作,就避免了 Namenode 的 edits 日志的无限增长,加速 Namenode 的启动过程。 image

CheckPoint Node

可能是由于 Secondary NameNode 容易对人产生误导,因此 Hadoop 1.0.4 之后建议不要使用 Secondary NameNode,而使用 CheckPoint Node。Checkpoint Node 和 Secondary NameNode 的作用以及配置完全相同,只是启动命令不同 bin/hdfs namenode -checkpoint

Backup Node

Backup Node 在内存中维护了一份从 Namenode 同步过来的 fsimage,同时它还从 namenode 接收 edits 文件的日志流,并把它们持久化硬盘,Backup Node 把收到的这些 edits 文件和内存中的 fsimage 文件进行合并,创建一份元数据备份。虽然 BackupNode 是一个备份的 NameNode 节点,不过 Backup Node 目前还无法直接接替 NameNode 提供服务。因此当前版本的 Backup Node 还不具有热备功能,也就是说,当 NameNode 发生故障,目前还只能通过重启 NameNode 的方式来恢复服务。

不过在 Hadoop 2.x 中提出了 Hadoop HA 的一些策略,实现了 Hadoop NameNode 的 failover。

一致性 Hash 算法(Consistent hashing)早在 1997 年就在论文  Consistent hashing and random trees  中被提出,目前在 cache 系统中应用越来越广泛。

应用场景

假设有 N 个 cache 服务器,那么如何将一个对象 object 映射到 N 个 cache 服务器上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 N 个 cache:

1
hash(object)%N

考虑如下的两种情况;
1)假设一个 cache 服务器 m 挂掉了,这样所有映射到 cache m 的对象都会失效。这时需要把 cache 服务器 m 从系统中移除,cache 服务器数变成 N-1 台,因此映射公式变成:

1
hash(object)%(N-1)

2)如果需要添加 cache 服务器 ,cache 服务器数变成 N+1 台,映射公式变成:

1
hash(object)%(N+1)

这两种情况的出现,使得原来的 cache 都失效了。可见上述的 Hash 算法并不能很好的适应 cache 系统,因此为了解决这两种情况我们引入一致性 Hash。

一致性 Hash 算法

算法具体步骤如下:

  1. 首先求出每个 Cache 服务器的 hash(可以利用 IP 来计算),并将其配置到一个 0~2^32 的圆环区间上。
  2. 使用同样的方法求出需要存储对象的 hash,也将其配置到这个圆环上。
  3. 从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个 Cache 节点上。如果超过 2^32 仍然找不到 Cache 节点,就会保存到第一个 Cache 节点上。
    image

新增 Cache 服务器

假设在这个环形哈希空间中,cache5 被映射在 Cache3 和 Cache4 之间,那么受影响的将仅是沿 Cache5 逆时针遍历直到下一个 Cache(Cache3)之间的对象(它们本来映射到 Cache4 上)。

image

  • 移除 Cache 服务器

假设在这个环形哈希空间中,Cache3 被移除,那么受影响的将仅是沿 Cache3 逆时针遍历直到下一个 Cache(Cache2)之间的对象(它们本来映射到 Cache3 上)。

image

虚拟 Cache 服务器

考虑到哈希算法并不是保证绝对的平衡,尤其 Cache 较少的话,对象并不能被均匀的映射到 Cache 上。为了解决这种情况,一致性 Hash 引入了“虚拟节点”的概念: 一个实际节点对虚拟成若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在哈希空间中以哈希值排列。仍以 4 台 Cache 服务器为例,在下图中看到,引入虚拟节点,并设置“复制个数”为 2 后,共有 8 个“虚拟节点”分部在环形区域上,缓解了映射不均的情况。

image

引入了“虚拟节点”后,映射关系就从【对象--->Cache 服务器】转换成了【对象--->虚拟节点---> Cache 服务器】。查询对象所在 Cache 服务器的映射关系如下图所示。

image

参考资料

一致性 hash 算法 - consistent hashing: http://blog.csdn.net/sparkliang/article/details/5279393
一致性哈希算法(Consistent Hashing): http://blog.csdn.net/x15594/article/details/6270242
一致性 hash 和 solr 千万级数据分布式搜索引擎中的应用: http://blog.jobbole.com/47023/"http://blog.jobbole.com/47023/>

安装前

在安装 Hive 之前,请保证已经安装了 Hadoop。Hadoop 安装参考:Hadoop 2.2.0 安装及配置

安装 Mysql

本文选用 mysql 作为 Hive 的 metastore。

1
sudo yum install mysql-server

创建数据库

1
2
mysql> create database hive;
Query OK, 1 row affected (0.00 sec)

##修改数据库操作权限

1
2
3
4
5
mysql> grant all on hive.* to hive@'%'  identified by 'hive';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

Hive 安装

1
tar zcvf hive-0.12.0.tar.gz hive-0.12.0

Hive 配置

1
2
3
4
5
cd conf
cp hive-default.xml.template hive-site.xml
cp hive-env.sh.template hive-env.sh
cp hive-log4j.properties.template hive-log4j.properties
cp hive-exec-log4j.properties.template hive-exec-log4j.properties
  • hive-site.xml
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
27
28
29
30
31
32
33
34
35
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://localhost:3306/hive</value>
  <description>JDBC connect string for a JDBC metastore</description>
</property>

<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
  <description>Driver class name for a JDBC metastore</description>
</property>

<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>root</value>
  <description>username to use against metastore database</description>
</property>

<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>welcome123</value>
  <description>password to use against metastore database</description>
</property>

<property>
  <name>hive.metastore.schema.verification</name>
  <value>false</value>
   <description>
   Enforce metastore schema version consistency.
   True: Verify that version information stored in metastore matches with one from Hive jars.  Also disable automatic
         schema migration attempt. Users are required to manully migrate schema after Hive upgrade which ensures
         proper metastore schema migration. (Default)
   False: Warn if the version information stored in metastore doesn't match with one from in Hive jars.
   </description>
</property>
  • hive-env.sh
1
2
3
4
5
# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=/home/hadoop/hadoop-2.2.0

# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/home/hadoop/hive-0.12.0/conf

安装 Mysql JDBC Connector

下载页面:http://www.mysql.com/downloads/connector/j/5.1.html

1
cp mysql-connector-java-5.1.26-bin.jar to hive/lib

测试

1
2
3
hive> create table test (key string);
OK
Time taken: 1.09 seconds
1
2
3
4
5
hive> create table test (key string);
hive> show tables;
OK
test
Time taken: 0.084 seconds, Fetched: 1 row(s)

常见错误

错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
解决方法:sudo service mysqld start

错误:ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'hive'
解决方法:
[hadoop@zhenlong-master ~]$ mysql -h localhost -u root -p Enter password:

错误:FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient 这个错误的原因很多,因此需要进行调试。  启动 hive 带上调试参数,./hive -hiveconf hive.root.logger=DEBUG,console,从调试信息中可以获得错误详细信息。 如果错误信息为: Caused by: org.datanucleus.exceptions.NucleusException: Attempt to invoke the "BoneCP" plugin to create a ConnectionPool gave an error : The specified datastore driver ("com.mysql.jdbc.Driver") was not found in the CLASSPATH. Please check your CLASSPATH specification, and the name of the driver.
解决方法:将 mysql 的 jdbc driver 拷贝到 hive/lib 即可。
如果错误信息为:
Caused by: MetaException(message:Version information not found in metastore. )
解决方法:set hive.metastore.schema.verification = false

1
2
3
4
5
6
7
8
9
10
11
<property>
  <name>hive.metastore.schema.verification</name>
  <value>false</value>
   <description>
   Enforce metastore schema version consistency.
   True: Verify that version information stored in metastore matches with one from Hive jars.  Also disable automatic
         schema migration attempt. Users are required to manully migrate schema after Hive upgrade which ensures
         proper metastore schema migration. (Default)
   False: Warn if the version information stored in metastore doesn't match with one from in Hive jars.
   </description>
</property>

Bloom Filter 简介

Bloom Filter(中文译作:布隆过滤器)是 1970 年由 Bloom 提出的。它实际上是由一个很长的二进制位数组和一系列 Hash 函数组成。

Bloom Filter 是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter 的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter 不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter 通过极少的错误换取了存储空间的极大节省。

Bloom Filter 算法

创建一个 m 位 BitSet,先将所有位初始化为 0,然后选择 k 个独立的哈希函数。第 i 个哈希函数对字符串 str 哈希的结果记为 hash,,i,,(str),且 i 的范围是 0 到 m-1 。有关 Bloom Filter 的操作的过程可以参考http://billmill.org/bloomfilter-tutorial/

添加字符串

对于字符串 str,分别计算 hash,,1,,(str),hash,,2,,(str)…… hash,,k,,(str)。然后将 BitSet 的第 hash,,1,,(str),hash,,2,,(str)…… hash,,k,,(str)位设为 1。就此,就完成了将字符串 str 映射到 BitSet 中的 k 个二进制位。

image

查找字符串

下面是检索字符串 str 是否在 BitSet 中:

对于字符串 str,分别计算 hash,,1,,(str),hash,,2,,(str)…… hash,,k,,(str)。然后检查 BitSet 的第 hash,,1,,(str),hash,,2,,(str)…… hash,,k,,(str)位是否全为 1。

若一个字符串对应的 bit 位不全为 1,则可以肯定该字符串一定没有被 Bloom Filter 记录过。

但是若一个字符串对应的 Bit 全为 1,实际上是不能 100%的肯定该字符串被 Bloom Filter 记录过的。因为有可能该字符串的所有位都刚好是被其他字符串所对应,这种将该字符串划分错的情况,称为 false positive 。

删除字符串

在基本的 Bloom Filter 中,字符串加入了就被不能删除了,因为删除会影响到其他字符串。实在需要删除字符串的可以使用Counting Bloom Filter(CBF),这是一种基本 Bloom Filter 的改进,CBF 将基本 Bloom Filter 每一个 Bit 改为一个计数器,这样就可以实现删除字符串的功能了。

Bloom Filter 参数选择

hash 函数选择

hash 函数的选择对性能影响比较大,一个优秀的 hash 函数应该做到将字符串等概率的映射到各个 bit。与此同时,选择 k 个不同的 hash 比较繁琐,一种简单的策略就是采用同一个 hash 函数然后传入 k 不同的参数。下面列举的是一些软件框架中 BloomFilter 所使用的 hash 函数。

  • Cassandra  使用的Murmur hashes
  • Hadoop  默认使用 Jenkins and Murmur hashes
  • python-bloomfilter  使用cryptographic hashes
  • Plan9  使用Mitzenmacher 2005
  • Sdroege Bloom filter  使用fnv
  • Squid  使用MD5

Bloom Filter 参数*

哈希函数个数 k、位数组大小 m、加入的字符串数量 n 的关系可以参考http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html。该文献证明了对于给定的 m、n,当

image

时出错的概率是最小的。

同时参考文献中也给出了 false positive 概率与 m、n 的关系。false postive 概率等于

image

完整的参数关系推导请参考http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html

Bloom Filter vs HashMap

Bloom Filter 跟 HashMap 不同之处在于:Bloom Filter 使用了 k 个哈希函数,每个字符串跟 k 个 bit 对应,从而降低了冲突的概率。

Bloom Filter 代码实现

GitHub: https://github.com/zhenlohuang/BloomFilter"https://github.com/zhenlohuang/BloomFilter>

参考资料

布隆过滤器: http://zh.wikipedia.org/wiki/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8"

BloomFilter——大规模数据处理利器: http://www.cnblogs.com/heaad/archive/2011/01/02/1924195.html

Bloom Filter 概念和原理: http://blog.csdn.net/jiaomeng/article/details/1495500

Pre-installation

保证所有主机上已经安装 JDK 1.6+和 ssh。

添加主机名到/etc/hosts

修改/etc/hosts

1
sudo vi /etc/hosts

添加

1
2
192.168.56.101 zhenlong-master
192.168.56.102 zhenlong-slave1

配置无密码的 ssh 连接

在所有主机上生成 ssh 的公钥和私钥

1
ssh-keygen -t rsa

在 master 主机上,生成 authorized_keys

1
2
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
chmod 644 ~/.ssh/authorized_keys

,并 copy 到所有 slaves 的~/.ssh/目录。

Installation

Download Apache Hadoop

Apache Hadoop: http://www.apache.org/dyn/closer.cgi/hadoop/common/

保证 master 和 slaves 上面的 hadoop 解压的相同的目录

Set Environment Variables

1
2
export HADOOP_HOME=/home/hadoop/hadoop-2.2.0
export JAVA_HOME=/home/hadoop/jdk1.6.0_45

Hadoop Configuration

修改 conf 文件夹下面的几个文件:

  • core-site.xml
1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://zhenlong-master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop_tmp/hadoop2</value>
</property>
</configuration>
  • hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/hadoop_dfs/hadoop2/name</value>
<description>Path on the local filesystem where the NameNode stores the namespace and transactions logs persistently.</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/hadoop_dfs/hadoop2/data</value>
<description>Comma separated list of paths on the local filesystem of a DataNode where it should store its blocks.</description>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
  • mapred-site.xml
1
2
3
4
5
6
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
  • yarn-site.xml
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<configuration>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>zhenlong-master:8031</value>
<description>host is the hostname of the resource manager and port is the port on which the NodeManagers contact the Resource Manager. </description>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>zhenlong-master:8030</value>
<description>host is the hostname of the resourcemanager and port is the port on which the Applications in the cluster talk to the Resource Manager. </description>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
<description>In case you do not want to use the default scheduler</description>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>zhenlong-master:8032</value>
<description>the host is the hostname of the ResourceManager and the port is the port on which the clients can talk to the Resource Manager. </description>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>${hadoop.tmp.dir}/nodemanager/local</value>
<description>the local directories used by the nodemanager</description>
</property>
<property>
<name>yarn.nodemanager.address</name>
<value>0.0.0.0:8034</value>
<description>the nodemanagers bind to this port</description>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>${hadoop.tmp.dir}/nodemanager/remote</value>
<description>directory on hdfs where the application logs are moved to </description>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>${hadoop.tmp.dir}/nodemanager/logs</value>
<description>the directories used by Nodemanagers as log directories</description>
</property>
<!-- Use mapreduce_shuffle instead of mapreduce.suffle (YARN-1229)-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
  • slaves
1
zhenlong-slave1
  • hadoop-env.sh
1
export JAVA_HOME=/home/hadoop/jdk1.6.0_45

此处 JAVA_HOME 可以根据每天 Server 情况设定。

格式化 NameNode

第一次启动,需要先格式化 NameNode。

1
hadoop namenode -format

Start Hadoop

1
~/hadoop-2.2.0/sbin/start-all.sh

image

  • In master

image

  • In slaves

image

 Test

  • HDFS Web UI: http://zhenlong-master:50070

  • YARN Web UI: http://zhenlong-master:8088

  • YARN && MapReduce 测试:

1
~/hadoop-2.2.0/bin/hadoop jar ~/hadoop-2.2.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount file wordcount_out

image

2013 年 10 月 15 日,Apache Hadoop 发布了 2.2.0 版本。这个是里程碑式的版本,它是 Hadoop 2.0 的第一个 stable 版本,它标志着 Hadoop 从此进入了 2.0 时代。

  • YARN

YARN(Yet Another Resource Negotiator),也称 MapReduce 2.0,它是 Hadoop 2.0 引入的一个全新的通用资源管理系统,可以在其上运行各种程序和框架。YARN 是从 MapReduce 1.0 衍化来的。引入了 ResourceManager、ApplicationMaster 和 NodeManager 等组件用于系统的资源调度。

  • HDFS High Availability

Hadoop HA 同时解决了 NameNode 单点故障问题和内存受限问题。主要利用 Active NameNode 和 Standby NameNode 之间的状态切换解决单节点故障问题。而其中采用 NFS、QJM 和 Bookeeper 三种可选策略用于 NameNode 之间的 Metadata 共享。

  • HDFS Federation

HDFS Federation,它允许一个 HDFS 集群中存在多个 NameNode,每个 NameNode 分管一部分目录,而不同 NameNode 之间彼此独立,共享所有 DataNode 的存储资源,由于 NameNode Federation 中的每个 NameNode 仍存在单点问题,需为每个 NameNode 提供一个 backup 以解决单点故障问题。

  • HDFS Snapshots

HDFS Snapshots,是 HDFS 在某一时刻的只读镜像。它可以是整个文件系统也可以是一部分文件夹。通常用于数据备份,防止数据丢失或者误操作。

  • NFSv3

将 NFS 引入 HDFS 后,用户可像读写本地文件一样读写 HDFS 上的文件,大大简化了 HDFS 使用。

  • 支持 Windows 平台

在 2.2.0 版本之前,Hadoop 仅支持 Linux 操作系统,而 Windows 仅作为实验平台使用。将 Microsoft 有关 Hadoop Windows Patch 吸收进代码之后,Hadoop 对 Windows 的支持有了本质上的增强。其实之前 Hortonworks 的 HDP 的也曾发布支持 Windows 的 Hadoop。

  • 兼容 Hadoop 1.x 的 MapReduce 程序

为了使 MRv1 可以在 YARN 架构上运行,对 MR API 进行了修改保证可以在 YARN 上运行。

  • 完成与 Hadoop 生态圈的其他软件的集成测试

相比 Hadoop 1.0 中,Hadoop 2.0 对 HDFS 和 MapReduce 等核心组件进行了较大的改动,并引入了全新的资源调度框架 YARN。因此对那些以 Hadoop 作为底层的应用进行集成测试是十分必要的。

参考资料:

Apache Hadoop 2.2.0: http://hadoop.apache.org/docs/r2.2.0/

Hadoop 2.0 稳定版本 2.2.0 新特性剖析: http://dongxicheng.org/mapreduce-nextgen/hadoop-2-2-0/

HDFS Snapshots: http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsSnapshots.html

Hadoop For Windows: http://dongxicheng.org/mapreduce/hadoop-for-windows/

Hadoop 作为目前炙手可热的大数据计算平台,以其稳定性和良好的可扩展性深得业界喜爱。目前 Hadoop 发展迅速,已经形成了一个以 Hadoop 为中心的生态圈。

image

Apache Hadoop: 是 Apache 开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持 MapReduce 分布式计算的软件架构。

Apache Hive: 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专门的 MapReduce 应用,十分适合数据仓库的统计分析。

Apache Pig: 是一个基于 Hadoop 的大规模数据分析工具,它提供的 SQL-LIKE 语言叫 Pig Latin,该语言的编译器会把类 SQL 的数据分析请求转换为一系列经过优化处理的 MapReduce 运算。

Apache HBase: 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。

Apache Sqoop: 是一个用来将 Hadoop 和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(MySQL ,Oracle ,Postgres 等)中的数据导进到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导进到关系型数据库中。

ZooKeeper: 是一个为分布式应用所设计的分布的、开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务

Apache Mahout:是基于 Hadoop 的机器学习和数据挖掘的一个分布式框架。Mahout 用 MapReduce 实现了部分数据挖掘算法,解决了并行挖掘的问题。

Apache Cassandra:是一套开源分布式 NoSQL 数据库系统。它最初由 Facebook 开发,用于储存简单格式数据,集 Google BigTable 的数据模型与 Amazon Dynamo 的完全分布式的架构于一身

Apache Avro: 是一个数据序列化系统,设计用于支持数据密集型,大批量数据交换的应用。Avro 是新的数据序列化格式与传输工具,将逐步取代 Hadoop 原有的 IPC 机制。

Apache Ambari: 是一种基于 Web 的工具,支持 Hadoop 集群的供应、管理和监控。

Apache Chukwa: 是一个开源的用于监控大型分布式系统的数据收集系统,它可以将各种各样类型的数据收集成适合 Hadoop 处理的文件保存在 HDFS 中供 Hadoop 进行各种 MapReduce 操作。

Apache Hama: 是一个基于 HDFS 的 BSP(Bulk Synchronous Parallel)并行计算框架, Hama 可用于包括图、矩阵和网络算法在内的大规模、大数据计算。

Apache Flume: 是一个分布的、可靠的、高可用的海量日志聚合的系统,可用于日志数据收集,日志数据处理,日志数据传输。

Apache Giraph: 是一个可伸缩的分布式迭代图处理系统, 基于 Hadoop 平台,灵感来自 BSP (bulk synchronous parallel) 和 Google 的 Pregel。

Apache Oozie: 是一个工作流引擎服务器, 用于管理和协调运行在 Hadoop 平台上(HDFS、Pig 和 MapReduce)的任务。

Apache Crunch: 是基于 Google 的 FlumeJava 库编写的 Java 库,用于创建 MapReduce 程序。与 Hive,Pig 类似,Crunch 提供了用于实现如连接数据、执行聚合和排序记录等常见任务的模式库

Apache Whirr: 是一套运行于云服务的类库(包括 Hadoop),可提供高度的互补性。Whirr 支持 Amazon EC2 和 Rackspace 的服务。

Apache Bigtop: 是一个对 Hadoop 及其周边生态进行打包,分发和测试的工具。

Apache HCatalog: 是基于 Hadoop 的数据表和存储管理,实现中央的元数据和模式管理,跨越 Hadoop 和 RDBMS,利用 Pig 和 Hive 提供关系视图。

Cloudera Hue: 是一个基于 WEB 的监控和管理系统,实现对 HDFS,MapReduce/YARN, HBase, Hive, Pig 的 web 化操作和管理。

参考资料:
http://blog.fens.me/hadoop-family-roadmap/

http://blog.cloudera.com/blog/2013/01/apache-hadoop-in-2013-the-state-of-the-platform/

目前 HIVE 不支持 not in 中包含查询子句的语法,因此需要使用 left semi join 或者 left outer join 来实现这一功能。

SQL:

1
2
SELECT a.key, a.value FROM a WHERE a.key IN (SELECT b.key FROM B)
SELECT a.key, a.value FROM a WHERE a.key NOT IN (SELECT b.key FROM B)

转换为 HiveQL 的写法:

1
2
SELECT a.key, a.value FROM a LEFT SEMI JOIN b ON (a.key = b.key)
SELECT a.key, a.value FROM a LEFT OUTER JOIN b ON (a.key = b.key) WHERE b.key1 IS NULL