异度部落格

学习是一种生活态度。

0%

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:

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 的写法:

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

Cloudera Manager 安装

1)安装 Postgresql

具体安装及配置参见:Postgresql 安装及配置

修改 yum.conf

由于 Cloudera 的服务器在国外,网络连接较慢,经常在安装过程中包下载失败,进而导致安装失败。

sudo gedit /etc/yum.conf

添加timeout=0

sudo yum update

3)安装 Cloudera Manager

下载地址: https://ccp.cloudera.com/display/SUPPORT/Downloads

sudo +x cloudera-manager-installer.bin
sudo ./cloudera-manager-installer.bin

之后一路 Next/Yes 即可

安装完成试着访问http://localhost:7180/, 如没问题说明安装完成

Cloudera Cluster 安装

1) 修改/etc/hosts

添加

10.182.251.250 zhenlhua-master
10.182.251.239 zhenlhua-slave1

2)创建无密码 SSH 链接*

在 master 机器上执行 ssh-keygen -t rsa,在~/.ssh/中生成 id_rsa 和 id_rsa.pub。

将 id_rsa.pub 拷贝到 slave 机器,并且将 id_rsa.pub 的内容添加到~/.ssh/authorized_keys 中,修改权限.

touch ~/.ssh/authorized_keys
sudo chmod 700  ~/.ssh
sudo chmod 600 ~/.ssh/authorized_keys

在 master 里连接 slave

ssh zhenlhua-slave1
ssh zhenlhua-slave2

3)安装 Cloudera Cluster

① 登录 访问 http://10.182.251.250:7180
用户名:admin
密码:admin
image

② 版本选择
image

③ 安装组件列表
image

④ 指定主机名
image

⑤ 选择软件安装方式
image

⑥ 集群安装
image

⑦ 检查主机正确性
image

⑧ 安装 CDH4 服务
image

⑨ 安装数据库
image

⑩ 适合配置
image

安装

sudo yum install postgresql postgresql-server

初始化数据库

  service postgresql initdb

配置 postgresql.conf

sudo vi /var/lib/pgsql/data/postgresql.conf
#---------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#---------------------------------------------------------------------------
listen_addresses = '*'              # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost', '*' = all
                                        # (change requires restart)
port = 5432                          # (change requires restart)

配置 pg_hba.conf

sudo vi /var/lib/pgsql/data/pg_hba.conf
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
# "local" is for Unix domain socket connections only
local   all         all                               trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          md5
host    all         all         192.168.137.2/16        md5 
host    all         all         192.168.137.3/16        md5 
# IPv6 local connections:
host    all         all         ::1/128               md5 

重启服务

sudo service postgresql restart

主机系统:Windows 7 Professional

虚拟系统:Oracle Linux 6

虚拟机:VirtualBox

步骤:

1)开启主机网卡网络共享

image

2)虚拟机选择网卡

image

3)虚拟机内系统网卡配置

此处 Gateway:192.168.137.1,为 VirtualBox Host-Only Ethernet Adapter 的 IP 地址,此处 DNS 是必须的,如果不加 DNS 将无法访问外网。

image

1)将 Word 文档另存为 XML 格式的文件。

2)修改 XML 文件,删去 w:documentProtection 的一段标签。

3)使用 Word 打开 XML 文件,将文件再转成 Word 文件。

Equals:

Object 类中的 equals 方法用于检测一个对象是否等于另一个对象。

实现:

public class MyClass {

private Integer field1;

private String field2;

@Override
public boolean equals(Object otherObject) {

// 判断是否引用同一个对象
if (this == otherObject) {
return true;
}

// 检测otherObject是否为空
if (otherObject == null) {
return false;
}

// 比较this和otherObject是不是属于同一个类
if (!(otherObject instanceof MyClass)) {
return false;
}

// 比较每个域是否相等
MyClass other = (MyClass) otherObject;
return this.field1.equals(other.field1)
&& this.field2.equals(other.field2);
}
}

Windows 版的 python2.7 是由 Visual Studio 2008 生成,而本机所安装的 visual studio 不是 2008,这时候需要新建环境变 VS90COMNTOOLS,使其指向已安装 VS 版本的路径,如 E:/Program Not only do you have to win all your casino games , you are doing just the opposite of a teaser in that your GIVING AWAY points instead of receiving them. Files/Microsoft Visual Studio 10.0/Common7/Tools/。

攻略:

在网页源码中有着这么一段话

<peakhell src="banner.p">
<!-- peak hell sounds familiar ? -->
</peakhell>

这里包含有两个信息:数据文件 banner.p 以及 pickle 模块
pickle 是 Python 的序列化模块,提供 Python 对象的序列化与反序列化

代码:

#!/usr/bin/env/python
#coding:utf8
'''
Created on May 13, 2013

@author: killua
@url: http://www.pythonchallenge.com/pc/def/peak.html
@target: http://www.pythonchallenge.com/pc/def/channel.html
'''

import urllib
import pickle

def read_page(url):
text = urllib.urlopen(url)
return text

def deserialization(text):
return pickle.loads(text)

if __name__ == '__main__':
text = open('./input/level05.in').read()
orgin_objects = deserialization(text)

#draw graph by lists
for obj in orgin_objects:
line = ''
for item in obj:
line += item[0] * item[1]
print line

完整代码:

Github:https://github.com/zhenlohuang/python-challenge