刚接触Hadoop,看了一周的Hadoop及其相应的组件,感觉效果不是很明显,于是将找个例子练一下手,跑一个流程,加深对hadoop的理解。

设计的流程如下:

TPC_H--->HdFS---->MapRecude---->Hive(paration)----->DB

即:从TPC_H生产10G的数据,将数据上传到HDFS中,编写MapReduce函数,对数据进行处理,将处理后的数据存放在Hive中,在Hive中仿照TPC_H的22条sql数据,写22条相应的HQL,并将结果保存在db中。

下面将逐步完成上述的流程

一、通过TPC_H生产相应的数据

1. 什么是TPC_H

TPC-H(商业智能计算测试)是TPC的重要测试标准之一,主要用来模拟真实商业的应用环境。 
        TPC-H 用 3NF 实现了一个数据仓库,共包含 8 个基本关系/表,其中表REGION和表NATION的记录数是固定的(分别为5和25),其它6个表的记录数,则随所设定的参数SF而有所不同,其数据量可以设定从 1GB~3TB 不等。有8个级别供用户选择。

2.从TPC_H导出数据

1) 首先从TPC_H的官方网站下载最新版本的TPC_H压缩包,下载地址为 http://www.tpc.org/tpch/ 。注意下面的操作我是在Linux环境下完成的,在win下也可以,部分设置不一样而已。

2) 解压下载的压缩文件,会有两个文件,1个是dbgen 1个是ref_data

3) 在dbgen目录下,将makefile.sute文件复制,并将文件名修改为makefile.接着修改这个makefile文件按的部分参数

shell>cp makefile.sute makefile

shell>vim makefile

具体改的参数有:

cc = gcc

……

DATABASE = SQLSERVER(也可以选择其他类型的DB)

MACHINE = LINUX(选择运行的平台)

WORKLOAD = TPCH

4) 修改完成后,保存这个文件,然后在命令行进入dbgen的目录下,输入“make”就可以调用make解释器去执行你修改后的makefile了。

shell>make

5)  运行dbgen来生产tbl文件。

shell>./dbgen -s 10

“./”是一个路径,“./dbgen”表示在当前路径下执行dbgen,其后是参数.简单来说,我们可以替换的参数有(1)-s后面的数字,10代表生产10倍的数据(即10G);

6) 结束后,可以发现在当前的目录下,生成了8个*.tbl文件,总大小为10G

注:TPC_H不是此次的重点,再次只是简单的介绍一下,如果需要详细的了解,请查看官方网站相关说明,再次有一篇比较入门的介绍TPC_H(以及导出数据)的文章,推荐给大家。http://blog.csdn.net/czpthegreat/article/details/6303071

二、将生成的数据从本地复制到HDFS中。

在本地中,我们将TPC_H生成的数据放在如下目录中,

/share/bigdata/tpch_data/data/

这一步操作简单,只需使用如下命令即可

hadoop fs -put /share/bigdata/tpch_data/data /user/root/tpch

在本地中,由于目标的文件都很大,比如lineitem.tbl文件有7个多G的数据,打开这么大的文件显然是很费时,而且也没有必要使用这么大的文件来检验mapreduce函数的正确性(这才是主要的原因),在本例中,我们取其中的一部分作为测试数据,检验我们mapreduce函数的正确性。我写了一个shell脚本,通过此脚本我们可以指定要处理的文件,并指定需要截取的行,并将结果输出到指定的文件中。

shell脚本为:

#!/bin/bash
printf "Please input the path of file which need to read: "
read fileName
printf "Please input the path of file which saves the result: "
read outPut
printf "startRow: "
read startRow
printf "endRow:"
read endRow
#sed -n "$startRow","$endRow"P /share/bigdata/tpch_data/data/$fileName
sed -n ""$startRow","$endRow"w $outPut" /share/bigdata/tpch_data/data/$fileName

生成的测试文件放在如下目录中:

/share/bigdata/tpch_data//data/analytics

我们也将这些文件复制至hdfs中:

hadoop fs -put /share/bigdata/tpch_data/data /user/root/tpch

三、编写并运行MapReduce函数

本地中我们只是简单的对lineitem.tbl文件中的quantity列进行处理。选取quantity值>30的行。具体代码如下,由于代码比较简单,因此再次我就不介绍了

FilterItemLine.java(这个名字没取好,应该用FilterLineItem)

package uap.pub.hadoop.tpch.lineitem;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser; public class FilterItemLine { /**
* @param args
* @throws IOException
* @throws ClassNotFoundException
* @throws InterruptedException
*/
public static void main(String[] args) throws IOException,
InterruptedException, ClassNotFoundException {
Configuration conf = new Configuration();
// conf.set("mapred.job.tracker", "192.168.133.101:9001");// 全局
String[] otherArgs = new GenericOptionsParser(conf, args)
.getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "Filter ItemLine");
job.setJarByClass(FilterItemLine.class);
job.setMapperClass(FilterItemLineMapper.class);
job.setReducerClass(FilterItemLineReducer.class); job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class); job.setMapOutputKeyClass(LongWritable.class);//Map端key输出的格式
job.setMapOutputValueClass(Text.class);//Map端value输出的格式
job.setOutputKeyClass(Text.class);//Reduce端key输出的格式
job.setOutputValueClass(Text.class);//Reduce端value输出的格式 FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true) ? 0 : 1);
} }

  FilterItemLineMapper .java

package uap.pub.hadoop.tpch.lineitem;

import java.io.IOException;
import java.util.StringTokenizer; import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; public class FilterItemLineMapper extends
Mapper<LongWritable, Text, LongWritable, Text> { protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
// 获取quantity字段
StringTokenizer st = new StringTokenizer(line, "|");
int i = 0;
String str_quantity = null;
while (st.hasMoreTokens()) {
String nextToken = st.nextToken();
if (i == 4) {
str_quantity = nextToken;
break;
}
i++;
}
if (!StringUtils.isEmpty(str_quantity)) {
int quantity = Integer.parseInt(str_quantity);
if (quantity >= 30) {
context.write(key, value);
}
} }
}

FilterItemLineReducer.java  

package uap.pub.hadoop.tpch.lineitem;

import java.io.IOException;
import java.util.Iterator; import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; public class FilterItemLineReducer extends
Reducer<LongWritable, Text, Text, Text> { protected void reduce(LongWritable key, Iterable<Text> values,
Context context) throws IOException, InterruptedException {
Iterator<Text> iterator = values.iterator();
while (iterator.hasNext()) {
Text value = iterator.next();
context.write(null, value);//本地情况特殊,不需要对数据进行额外的处理,一般情况下,key不设为null
}
}
}

代码写好了,下面就是编译代码,打成jar包,运行代码

1)编译代码

javac -classpath /share/hadoop/hadoop-core-1.0.4.jar:/share/hadoop/lib/commons-lang-2.4.jar -d . FilterItemLineMapper.java

javac -classpath /share/hadoop/hadoop-core-1.0.4.jar:/share/hadoop/lib/commons-lang-2.4.jar -d . FilterItemLineReducer.java

         javac -classpath ./:/share/hadoop/hadoop-core-1.0.4.jar:/share/hadoop/lib/* -d . FilterItemLine.java

    2)打成jar包

     jar -cvf FilterLineItem.jar -C  java/ .

   3) 运行mapreduce

    hadoop jar /share/bigdata/java/FilterLineItem.jar uap.pub.hadoop.tpch.lineitem.FilterItemLine /user/root/tpch/data/lineitem.tbl /user/root/tpch/fileterlineitem_out  

注意:运行mapreduce方法时,其中间数据存放的位置为:/share/hadooptmp/mapred/local/taskTracker/root/jobcache/

四、将数据导入到hive中

TPC_H生成的数据有8整个tbl文件,我们将这8个文件导入到hive中去

在hive中表的创建有外部表和内部表,这两个表的区别想必大家都知道,在此处我主要记录自己在创建表的过程中遇到的问题

1) 创建内部表    

CREATE TABLE IF NOT EXISTS REGION(NATIONKEY INT,NAME STRING,COMMENT1 STRING) COMMENT 'The file of TPCH  is region.tbl'
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY '|'
> STORED AS TEXTFILE;
# > LOCATION '/user/root/hive/data/nation';不要使用LOCATION
load data:
LOAD DATA INPATH '/user/root/tpch/data/region.tbl'INTO TABLE REGION;//After load data,we cannot find region.tbl in the directory '/user/root/tpch/data/region.tbl',on the contray,we find it in the directory '/user/hive/warehouse/region/'

在建内部表时,不需要使用LOCATION 关键字,如果使用了,则创建后的表的数据(实际的文件)就会放到此目录下,而不是默认的/user/hive/warehouse/目录下


2)创建外部表

hive> CREATE EXTERNAL TABLE IF NOT EXISTS nation (NATIONKEY STRING,NAME STRING,REGIONKEY STRING ,NATION_COMMENT STRING)
    > ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'                                                                    
    > STORED AS TEXTFILE                                                                                               
    > LOCATION '/user/root/tpch/data/nation';一定是个目录,不能是具体的文件
如果创建的是一个外部表,那么就不需要load数据,否则也会将数据移到hive中,但是与内部表不同的时,此时drop表时,数据并不会被删除,只删除了元数据。
   但是使用外部表的时候,需要指定需要链接的hdfs文件的路径(即hive源数据的地址)。
从上述的描述来看,LOCATION针对内部表和外部表的处理时不一样的,内部表是,是将数据移到LOCATION指定的位置,而对于外部表而言,LOCATION指定的是需要链接的数据地址。

除此之外,LOCATION 一定是个目录,不能是个具体的文件,比如下面的例子就报错了

hive> CREATE EXTERNAL TABLE IF NOT EXISTS nation (NATIONKEY STRING,NAME STRING,REGIONKEY STRING ,NATION_COMMENT STRING)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
> STORED AS TEXTFILE
> LOCATION '/user/root/tpch/data/nation.tbl';//wrong
FAILED: Error in metadata: MetaException(message:Got exception: org.apache.hadoop.ipc.RemoteException java.io.FileNotFoundException: Parent path is not a directory: /user/root/tpch/data/nation.tbl
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.mkdirs(FSDirectory.java:)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInternal(FSNamesystem.java:)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:)
at org.apache.hadoop.hdfs.server.namenode.NameNode.mkdirs(NameNode.java:)
at sun.reflect.GeneratedMethodAccessor24.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
at java.lang.reflect.Method.invoke(Method.java:)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:)
at org.apache.hadoop.ipc.Server$Handler$.run(Server.java:)
at org.apache.hadoop.ipc.Server$Handler$.run(Server.java:)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:)
)

3)创建分区表

Hadoop流程---从tpch到hive的更多相关文章

  1. 基于hadoop的数据仓库工具:Hive概述

    Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行.其优点是学习成本低,可以通过类 ...

  2. # hadoop入门第六篇:Hive实例

    前言   前面已经讲了如何部署在hadoop集群上部署hive,现在我们就做一个很小的实例去熟悉HIVE QL.使用的数据是视频播放数据包括视频编码,播放设备编码,用户账号编码等,我们在这个数据基础上 ...

  3. 《hadoop权威指南》关于hive的第一个小例子的演示

    本文是<hadoop权威指南>关于hive的小例子,通过这个例子可以很好地看出来hive是个什么东西. 前提是已经配置好hive的远程连接版本的环境,我是用了MYSQL数据库保存元数据. ...

  4. 【Hadoop离线基础总结】Hive调优手段

    Hive调优手段 最常用的调优手段 Fetch抓取 MapJoin 分区裁剪 列裁剪 控制map个数以及reduce个数 JVM重用 数据压缩 Fetch的抓取 出现原因 Hive中对某些情况的查询不 ...

  5. 【Hadoop离线基础总结】Hive的基本操作

    Hive的基本操作 创建数据库与创建数据库表 创建数据库的相关操作 创建数据库:CREATE TABLE IF NOT EXISTS myhive hive创建表成功后的存放位置由hive-site. ...

  6. Hadoop学习之HBase和Hive的区别

    Hive是为简化编写MapReduce程序而生的,使用MapReduce做过数据分析的人都知道,很多分析程序除业务逻辑不同外,程序流程基本一样.在这种情况下,就需要Hive这样的用户编程接口.Hive ...

  7. 大数据时代之hadoop(六):hadoop 生态圈(pig,hive,hbase,ZooKeeper,Sqoop)

    hadoop是有apache基金会所开发的分布式系统基础架构,其主要提供了两方面的功能:分布式存储和分布式计算. 其中分布式存储是分布式计算的基础,在hadoop的实现里面,提供了分布式存储的接口,并 ...

  8. 大数据Hadoop生态圈:Pig和Hive

    前言 Pig最早是雅虎公司的一个基于Hadoop的并行处理架构,后来Yahoo将Pig捐献给Apache的一个项目,由Apache来负责维护,Pig是一个基于 Hadoop的大规模数据分析平台. Pi ...

  9. 不同hadoop集群之间迁移hive数据

    #!/bin/bash #set -x DB=$1 #获取hive表定义 ret=$(hive -e 'use ${DB};show tables;'|grep -v _es|grep -v _hb| ...

随机推荐

  1. vbox里面的Ubuntu虚拟机与主机win7之间设置共享文件夹

    有时候我们希望虚拟机和主机之间进行通信,例如传一些文件.那么设置共享文件夹就是一种很好的方式. 这里我的主机是win7系统,vbox里面的虚拟机是Ubuntu. 1.首先安装vbox的VBOXGues ...

  2. Java操作Oracle数据库以及调用存储过程

    操作Oracle数据库 publicclass DBConnection {     //jdbc:oracle:thin:@localhost:1521:orcl     publicstaticf ...

  3. Matlab聚类分析[转]

    Matlab聚类分析[转] Matlab提供系列函数用于聚类分析,归纳起来具体方法有如下: 方法一:直接聚类,利用clusterdata函数对样本数据进行一次聚类,其缺点为可供用户选择的面较窄,不能更 ...

  4. OpenJDK与HashMap

    OpenJDK的非堆JDK增强提议(JDK Enhancement-Proposal,JEP)试图标准化一项基础设施,它从Java6开始,只能在HotSpot和OpenJDK内部使用.这种设施能够像管 ...

  5. 《Zero to One》的一些读书笔记

    第一章<The Challenge of the Future>:全球化是横向的扩张,只能复制以前就有的成功,而科技创新是纵向的扩张,是创造以前不存在的东西.没有科技创新,只有全球化,这个 ...

  6. 2016年 IT 趋势大预测!

    新年伊始,有不少人在总结过去,也有一些人在展望未来.下面让我们跟随 OpsClarity 的 Dhruv Jain,看看他对 2016 IT 趋势有什么大胆的预测. 又到了众人纷纷对下一年进行预测的时 ...

  7. elasticsearch spring 集成

    elasticsearch spring 集成 项目清单   elasticsearch服务下载包括其中插件和分词   http://download.csdn.net/detail/u0142011 ...

  8. Solr -- Solr Facet 2

    solr将以导航为目的的查询结果称为facet. 它并不会修改查询结果信息, 只是在查询结果上根据分类添加了count信息, 然后用户根据count信息做进一步的查询, 比如淘宝的查询列表中, 上面会 ...

  9. 【转】Android应用程序完全退出

    原文网址:http://www.yoyong.com/archives/199 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://s ...

  10. HDOJ(HDU) 2520 我是菜鸟,我怕谁(等差数列)

    Problem Description lin2144是一只小菜鸟,都是笨鸟先飞,lin2144想来个菜鸟先飞,他从0点出发 一开始的飞行速度为1m/s,每过一个单位时间lin2144的飞行速度比上一 ...