MapReduce被提出,已有10年多,广泛应用于大数据领域,在21世纪这信息爆炸时代,有效地帮助无数多的攻城狮解决处理海量数据的困扰。

概述

OSDI 2004,Google 的两名科学家 Jeffrefy DeanSanjay Ghemawat 在一篇名为 MapReduce: Simplified Data Processing on Large Clusters 的 paper 中讲述了 MapReduce,该 paper 在写本文时已被引用高达 15542 次。本篇主要以该 paper 中对 MapReduce 的描述,以及自己的开发经验,简要谈一下对 MapReduce 的理解。

MapReduce是一个编程模型,用于处理海量数据,生成目标数据结果。MapReduce 将任务的计算过程划分为2个阶段: Map 阶段和 Reduce 阶段。计算过程中,在 Map 阶段,对业务逻辑的每一条 记录 作为输入,生成一组 <key, value> 对作为中间结果;接着,在 Reduce 阶段,将 Map 阶段中生成的一组 <key, value> 对中间结果进行合并,即对具有相同 keyvalue 进行合并,这里的合并可能是做聚合操作,也可能是进行排序等操作,然后将最终合并后的结果输出。让人欣喜的是,现实世界中的许多问题处理过程,都可以表达成这样的模型。

阅读更多

当业务数据量过大,不能在关系型数据库中统计时,可以通过 Sqoop 导入到 HDFS 上进行统计,类似日志数据一样。导入到 HDFS 上数据,每一条记录通过 \tCtrl+A 等分割每一个字断,通过 \n 分割每一条记录。然后,通过建立 Hive 表指向 HDFS 对应的路径数据,对 HDFS 上的数据添加 Schema 定义,可以基于 Hive 中 SQL 的语法进行查询统计。

尽管 Hive 提供了丰富的函数,有时仍然不能满足个性化的查询和统计要求。这时,需要用户实现 UDF

概述

UDF,即 User-Defined Function,用户通过自定义对数据的处理过程,以函数的形式在 HiveQL 中使用。

有 2 种方式在 HiveQL 中实现 UDF。 第一种方式 ,即通过 Java 或其他通过 JVM 实现的语言(Jython、JRuby、Clojure、Groovy),实现UDF; 第二种方式 ,通过 TRANSFORM...AS 语法,使用可执行的脚步语言实现 UDF。 接下来,将分别介绍通过 Java 和 Python 实现 Hive 中的 UDF,最后,比较二者在使用过程中的异同。

阅读更多

在 Mac 上进行 PHP 开发,首先需要搭建开发环境。具体的,主要需要安装 NginxPHP-FPMMySQL ,但由于网上各安装教程中软件版本不同和配置的差异,没有一个可以完全参照教程。遂,吸取前人搭建环境过程中的经验,总结下自己搭建环境的过程,mark。

搭建过程主要分一下几部分说明:首先是安装前系统的版本,以及将要安装的版本,接着是说明安装过程,分别包括NginxPHP-FPMMySQL的安装过程,最后以一个简单的例子结束。

安装版本

MAC系统版本和安装的软件版本:

阅读更多

Oozie 工作流中,Action节点包括即 Oozie 支持的 jobs 和 sub-workflows。其中,Oozie 支持的 Hadoop jobs 类型有 Map ReducePigHiveSqoop。另外,Oozie 还支持的 jobs 类型还有 JavaStreamingFs(Hadoop File System 操作)SshShellEmailDistCp

Sqoop

Sqoop action 执行一个 Sqoop job。工作流一直等待直到 Sqoop job 完成后才会进入到工作流中的下一个 action。在运行 Sqoop action 之前,须要设置 job-trackername-nodeSqoop commandarg elements。Sqoop action 在执行 Sqoop job 前可以创建或删除 HDFS 目录。

通过 job-xml 可以指定 Sqoop action 配置文件,或通过 configuration 元素在线对 Sqoop action 配置。其中,可以在在线配置中使用 EL 表达式,并且在线配置的值会覆盖在通过 job-xml 的配置值。

阅读更多

Oozie 工作流中,控制节点包括工作流的开始和结束节点,即 start 节点、end 节点和 kill 节点,并提供了控制工作流执行路径的节点,即 decison 节点、fork 节点和 join 节点。

Start Control Node

start 节点是一个工作流的入口节点,当工作流开始执行时,将会自动的过渡到由 start 节点 指向的节点。一个工作流必须有一个 start 节点。

语法:

1
2
3
4
5
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
...
<start to="[NODE-NAME]"/>
...
</workflow-app>

阅读更多

Oozie 是一个用于管理 Hadoop Job 的工作流调度平台。Oozie 可以将多个 Job 按照一定的逻辑顺序组合起来运行。Oozie 支持的 Hadoop Job 类型有 Map ReducePigHiveSqoop。另外,Oozie 支持的 Job 类型还有 JavaStreamingFs(Hadoop File System 操作)SshShellEmailDistCp。Oozie 在 Hadoop 生态系统中的位置如下图所示。

通过 Oozie 平台,用户可以在 Hadoop 集群上完成由多项子任务组合在一起的复杂数据计算过程。在 Oozie 中,共有 3 种类型的 Application:

阅读更多

Sqoop 是一个在结构化、半结构化和非结构化数据源之间进行有效数据传输的工具。各种数据源中,例如,关系型数据库(RDBMS)中存储的数据都有数据模式(Schema),是结构化数据源;Cassandra 和 Hbase 是半结构化数据源;而 HDFS 是非结构化的数据源。

以 RDBMS 和 HDFS 之间数据传输为例,借助于 Sqoop,可以从 RDBMS 如 MySQL 或 Oracle 中导入数据到HDFS 中,通过 Hadoop 的 MapReduce 模型计算完之后,将结果导回 RDBMS。

根据被导入数据在数据库中定义的数据模式,Sqoop 将会自动完成整个过程中的大部分,其中,Sqoop 借助于 MapReduce 导入和导出数据,并提供容错和并行化操作。

阅读更多

当业务数量量越来越大时,通过在数据库中写 SQL 语句进行统计就变的越来越困难了,尽管可以通过不断优化 SQL 语句,比如,通过 EXPLAIN 查看执行计划,建立索引,子查询与连接查询选择,等等。但面对越来越大的数据量,还是会无力回天。

这时,可以将业务数据存储到 Hadoop文件系统 上,借助 HIVE 进行统计,然后,再将统计结果导入业务数据库,供业务调用。

大数据统计思路

当统计任务越来越多,并且数据量日益庞大,需要能够管理逻辑复杂的多个Hadoop作业。统计任务大致步骤如下:

  1. 通过 Sqoop 先将业务数据同步到 Hadoop文件系统 上;
  2. 对 Hadoop文件系统 上的业务数据,以分区表的形式存储到多张 Hive 表中;
  3. 进行 JOIN 处理,得到一个明细数据Hive大表(此步骤可选);
  4. 借助 MapReduce 计算框架,对 Hive 中的表数据进行复杂的统计,得到统计后的的报表信息;
  5. 需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。

阅读更多

在查询数据库表时,需要对表中的记录进行筛选,SQL提供了两个约束子句,即WHEREHAVING,二者效果有雷同,但用法有区别。

语法区别

WHERE

1
SELECT column_name FROM table_name WHERE column operator value

HAVING

1
2
3
4
5
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

阅读更多

来自《剑指Offer》中的一道面试题:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减的排序的数组的一个旋转,输出旋转数组的最小元素。例如数组 {3, 4, 5, 1, 2} 为 {1, 2, 3, 4, 5} 的一个旋转, 该数组的最小元素为 1。

理清了算法思路后写出了代码,后面看了书上的解法,觉得有些不直观,分享下自己的代码;)

Naive解法

O(n) 时间范围内遍历旋转后的数组,可以找到最小的元素。但是,这种解法没有利用旋转数组的特点,即数组内部元素间部分有序,因此,查找效率不高。

阅读更多