« 如何在Hadoop中使用Streaming编写MapReduce | 首页 | Nutch中MapReduce的分析 »

在HBase里使用MapReduce例子

作者:马士华 发表于:2008-03-05 19:10 最后更新于:2008-03-07 12:15
版权声明:可以任意转载,转载时请务必以超链接形式标明文章 原始出处和作者信息。
http://www.hadoop.org.cn/mapreduce/hbase-mapreduce/


  我在Hadoop的用户邮件列表中看到一些国内的用户在讯问一些关于如何操作的HBase的问题,还看到了HBase中没有Example。觉得有必要跟大家分享自己的经验。

在下面的例子中我们分析Apache的log并把这些log进行分析并把分析完的结果按用户IP为ROW,把log中用户的访问时间,请求方法,用户请求的协议,用户的浏览器,服务状态等写到HBase的表中。

首先我们要在HBase中建立我们的一个表来存储数据。


public static void creatTable(String table) throws IOException{HConnection conn = HConnectionManager.getConnection(conf);
HBaseAdmin admin = new HBaseAdmin(conf);
if(!admin.tableExists(new Text(table))){System.out.println("1. " + table + " table creating ... please wait");
HTableDescriptor tableDesc = new HTableDescriptor(table);
tableDesc.addFamily(new HColumnDescriptor("http:"));
tableDesc.addFamily(new HColumnDescriptor("url:"));
tableDesc.addFamily(new HColumnDescriptor("referrer:"));
admin.createTable(tableDesc);
} else {System.out.println("1. " + table + " table already exists.");
}
System.out.println("2. access_log files fetching using map/reduce");
}

然后我们运行一个MapReduce任务来取得log中的每一行数据。因为我们只要取得数据而不需要对结果进行规约,我们只要编写一个Map程序即可。


public static class MapClass extends MapReduceBase implements
Mapper<WritableComparable, Text, Text, Writable> {@Override
public void configure(JobConf job) {tableName = job.get(TABLE, "");
}
public void map(WritableComparable key, Text value,
OutputCollector<Text, Writable> output, Reporter reporter)
throws IOException {try {AccessLogParser log = new AccessLogParser(value.toString());
if(table==null)
table = new HTable(conf, new Text(tableName));
long lockId = table.startUpdate(new Text(log.getIp()));
table.put(lockId, new Text("http:protocol"), log.getProtocol().getBytes());
table.put(lockId, new Text("http:method"), log.getMethod().getBytes());
table.put(lockId, new Text("http:code"), log.getCode().getBytes());
table.put(lockId, new Text("http:bytesize"), log.getByteSize().getBytes());
table.put(lockId, new Text("http:agent"), log.getAgent().getBytes());
table.put(lockId, new Text("url:" + log.getUrl()), log.getReferrer().getBytes());
table.put(lockId, new Text("referrer:" + log.getReferrer()), log.getUrl().getBytes());
table.commit(lockId, log.getTimestamp());
} catch (ParseException e) {e.printStackTrace();
} catch (Exception e) {e.printStackTrace();
}
}
}

我们在Map程序中对于传进来的每一行先交给AccessLogParser去处理在AccessLogParser德构造器中用一个正则表达式"([^ ]*) ([^ ]*) ([^ ]*) //[([^]]*)//] /"([^/"]*)/" " ([^ ]*) ([^ ]*) /"([^/"]*)/" /"([^/"]*)/".*"来匹配每一行的log。接下来我们把这些AccessLogParser处理出来的结果更新到HBase的表中去,好的,我们的程序写完了。我们要启动一个MapReduce的话我们要对工作进行配置。


public static void runMapReduce(String table,String dir) throws IOException{Path tempDir = new Path("log/temp");
Path InputDir = new Path(dir);
FileSystem fs = FileSystem.get(conf);
JobConf jobConf = new JobConf(conf, LogFetcher.class);
jobConf.setJobName("apache log fetcher");
jobConf.set(TABLE, table);
Path[] in = fs.listPaths(InputDir);
if (fs.isFile(InputDir)) {jobConf.setInputPath(InputDir);
} else {for (int i = 0; i < in.length; i++) {if (fs.isFile(in[i])) {jobConf.addInputPath(in[i]);
} else {Path[] sub = fs.listPaths(in[i]);
for (int j = 0; j < sub.length; j++) {if (fs.isFile(sub[j])) {jobConf.addInputPath(sub[j]);
}
}
}
}
}
jobConf.setOutputPath(tempDir);
jobConf.setMapperClass(MapClass.class);
JobClient client = new JobClient(jobConf);
ClusterStatus cluster = client.getClusterStatus();
jobConf.setNumMapTasks(cluster.getMapTasks());
jobConf.setNumReduceTasks(0);
JobClient.runJob(jobConf);
fs.delete(tempDir);
fs.close();
}

在上面的代码中我们先产生一个jobConf对象,然后设定我们的InputPath和OutputPath,告诉MapReduce我们的Map类,设定我们用多少个Map任务和Reduce任务,然后我们不任务提交给JobClient,关于MapReduce跟详细的资料在Hadoop Wiki上。

下载:源码和已编译好的jar文件example-src.tgz

例子的运行命令是:


bin/hadoop jar examples.jar logfetcher <access_log file or directory> <table_name>

如何运行上面的应用程序呢?我们假定解压缩完Hadoop分发包的目录为%HADOOP%

拷贝%HADOOP%/contrib/hbase/bin下的文件到%HADOOP%/bin下,拷贝%HADOOP%/contrib/hbase/conf的文件到%HADOOP%/conf下,拷贝%HADOOP%/src/contrib/hbase/lib的文件到%HADOOP%/lib下,拷贝%HADOOP%/src/contrib/hbase/hadoop-*-hbase.jar的文件到%HADOOP%/lib下.然后编辑配置文件hbase-site.xml设定你的hbase.master例子:192.168.2.92:60000。把这些文件分发到运行Hadoop的机器上去。在regionservers文件添加上这些已分发过的地址。运行bin/start-hbase.sh命令启动HBase,把你的apache log文件拷贝到HDFS的apache-log目录下,等启动完成后运行下面的命令。


bin/hadoop jar examples.jar logfetcher apache-log apache

访问http://localhost:50030/能看到你的MapReduce任务的运行情况,访问http://localhost:60010/能看到HBase的运行情况。

等任务MapReduce完成后访问http://localhost:60010/hql.jsp,在Query输入框中输入SELECT * FROM apache limit=50;。将会看到已经插入表中的数据。

相关文章

  • 2008-03-05 -- 如何在Hadoop中使用Streaming编写MapReduce (1)
  • 2008-08-07 -- 函数式编程范式-MapReduce (3)
  • 2008-07-02 -- pig语言 (2)
  • 2008-06-26 -- HBase的概念和性能选项 (5)
  • 2008-06-10 -- Facebook中的Hadoop (0)

引用通告

如果您想引用这篇文章到您的Blog,
请复制下面的链接,并放置到您发表文章的相应界面中。
http://www.hadoop.org.cn/mapreduce/hbase-mapreduce/trackback/

在HBase里使用MapReduce例子相关推荐

  1. Erlang里实现MapReduce

    Erlang里实现MapReduce 博客分类: Erlang MapreduceErlangF#WindowsHTML 参考: http://weblambdazero.blogspot.com/2 ...

  2. hbase里插入big int数据用Phoenix查看的报错问题

    Phoenix建表 create table "test_big_int"( "ROW" varchar primary key, "ci" ...

  3. qt怎么输出一个map里的所有键值_《长安十二时辰》里的MapReduce原理

    一 什么是MapReduce MapReduce是一种编程模型,也是一个处理和生成超大数据集的算法模型的相关实现.最早是由谷歌2004年公布的 MapReduce论文,论文描述了大数据的分布式计算方式 ...

  4. HBase行键设计例子

    MD5利用JavaAPI设计行键 int id = 16; byte[] rkid= Bytes.toBytes(id); String prefix = MD5Hash.getMD5AsHex(rk ...

  5. Hadoop HBase概念学习系列之HBase里的客户端和HBase集群建立连接(详细)(十四)...

    需要遵循以下步骤: 1.客户端和Zookeeper集群建立连接.在这之前客户端需要获得一些信息(可以从HBase配置文件中读取或是直接指定).客户端从Zookeeper集群中读取-ROOT-表的位置信 ...

  6. 为什么hbase里没有表会显示表已经存在_0712-6.2.0-HBase快照异常

    异常重现 1.1 删除表后用快照恢复不成功 查看当前表test2信息 scan 'test2' 在CM为test2创建一个快照test2_shot1 删除表test2,可以看到表已经被删除 用之前保存 ...

  7. MapReduce例子——找出QQ共同好友

    ///\\\\\\\\ fri.txt 如下: person: friend1, friend2, friend3, friend4, -.. A:B,C,D,F,E,O B:A,C,E,K C:F, ...

  8. android获取当前位置经纬度,Android中通过GPS或NetWork获取当前位置的经纬度

    今天在Android项目中要实现一个通过GPS或NetWork来获取当前移动终端设备的经纬度功能.要实现该功能要用到Android Framework 中的 LocationManager 类.下面我 ...

  9. 五十三、通过MapReduce实现HBase操作

    通过HBase的相关JavaAPI,我们可以实现伴随HBase操作的MapReduce过程,比如使用MapReduce将HBase表中的数据拷贝到另外一张表.本文我们通过两个案例来进行实操一下,关注专 ...

最新文章

  1. 零基础学stm32要多久?stm32应该怎么学?
  2. 神经网络为何成为学习算法的通用结构?
  3. ubuntu mysql 迁移_(最新)ubuntu20.04LTS版迁移mysql8.0数据库的方法
  4. TCP/IP协议族-----10、搬家IP
  5. IoTSharp 2.0 发布
  6. IntelliTrace 调试、定位异常
  7. caffe报错:Check failed: width <= datum_width (28 vs. 17)
  8. Oracle性能调优方法
  9. clion远程调试linux内核,Clion + 树莓派/Ubuntu 远程调试
  10. [原创]c# 加解密通用类
  11. matlab管道泄漏定位,在Matlab中分析基于小波变换的管道泄漏定位方法
  12. Protues8__示波器的使用
  13. 5. JanusGraph Schema和数据类型
  14. 智慧城市顶层设计跨界思维指导方案(ppt)
  15. java ean13_【求大神指导】java实现EAN13条形码识别
  16. Android OpenCV(三十二):霍夫直线检测
  17. 页脚设置页码(首页无页码,从第二页开始页码为1)
  18. 第五次任务之三大抽样分布
  19. 2020华为杯E题——基于灰色预测的大雾能见度预测模型(附代码)
  20. linux安装gcc编译器

热门文章

  1. 第四期 03季 C/C++数据结构 链队的应用
  2. 【心级卖家攻略】用按键精灵两小时批量上传500件商品(一)
  3. 实用的keil5代码整理小技巧
  4. const与define相比优点_相关const和define优缺点信息大全_美瞳网
  5. mysql ibd恢复数据_mysql文件损坏通过.ibd文件恢复数据
  6. 阿里云峰会 | 阿里云CDN六大边缘安全能力,全力助推政企数字化转型
  7. 【小案例】使用CSS过渡制作手风琴
  8. ft232电路ttl_FT232R 的串行 UART 接口解析
  9. 有什么牌子台灯性价比高?性价比最高的护眼台灯
  10. 使用电脑如何图片去水印,快进来,妙招告诉你!