python 实现Hadoop的partitioner和二次排序

2024-04-02 21:18

本文主要是介绍python 实现Hadoop的partitioner和二次排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们知道,一个典型的Map-Reduce过程包 括:Input->Map->Patition->Reduce->Output。Pation负责把Map任务输出的中间结果 按key分发给不同的Reduce任务进行处理。Hadoop 提供了一个非常实用的partitioner类KeyFieldBasedPartitioner,通过配置相应的参数就可以使用。通过 KeyFieldBasedPartitioner可以方便地实现二次排序。
使用方法:
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
一般配合:
-D map.output.key.field.separator及-D num.key.fields.for.partition使用。
map.output.key.field.separator指定key内部的分隔符
num.key.fields.for.partition指定对key分出来的前几部分做partition而不是整个key

示例:
1. 编写map程序mapper.sh;reduce程序reducer.sh; 测试数据test.txt
view plain

mapper.sh:

!/bin/sh cat

reducer.sh:

!/bin/sh sort

test.txt内容:

1,2,1,1,1

1,2,2,1,1

1,3,1,1,1

1,3,2,1,1

1,3,3,1,1

1,2,3,1,1

1,3,1,1,1

1,3,2,1,1

1,3,3,1,1

  1. 测试数据test.txt放入hdfs,运行map-reduce程序
    view plain

$ hadoop streaming /

-D stream.map.output.field.separator=, /

-D stream.num.map.output.key.fields=4 /

-D map.output.key.field.separator=, /

-D num.key.fields.for.partition=2 /

-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner /

-input /app/test/test.txt /

-output /app/test/test_result /
-mapper ./mapper.sh /

-reducer ./reducer.sh /

-file mapper.sh /

-file reducer.sh /

-jobconf mapre.job.name=”sep_test”

$ hadoop fs –cat /app/test/test_result/part-00003

1,2,1,1 1

1,2,2,1 1

1,2,3,1 1

$ hadoop fs –cat /app/test/test_result/part-00004

1,3,1,1 1

1,3,1,1 1

1,3,2,1 1

1,3,2,1 1

1,3,3,1 1

1,3,3,1 1
通过这种方式,就做到前4个字段是key,但是通过前两个字段进行partition的目的
注意:

-D map.output.key.field.separator=, /
这个分隔符使用TAB键貌似不管用

Hadoop Streaming 是一个工具, 代替编写Java的实现类,而利用可执行程序来完成map-reduce过程
工作流程 :
InputFile –> mappers –> [Partitioner] –> reducers –> outputFiles
理解 :
1 输入文件,可以是指定远程文件系统内的文件夹下的 *
2 通过集群自己分解到各个PC上,每个mapper是一个可执行文件,相应的启动一个进程,来实现你的逻辑
3 mapper 的输入为标准输入,所以,任何能够支持标准输入的可执行的东西,c,c++(编译出来的可执行文件),python,……都可以作 为mapper 和 reducer mapper的输出为标准输出,如果有Partitioner,就给它,如果没有,它的输出将作为reducer的输入
4 Partitioner 为可选的项,二次排序,可以对结果进行分类打到结果文件里面,它的输入是mapper的标准输出,它的输出,将作为reducer的标准输入
5 reducer 同 mapper
6 输出文件夹,在远端文件不能重名
Hadoop Streaming
1 : hadoop-streaming.jar 的位置 : $HADOOP_HOME/contrib/streaming 内
官方上面关于hadoop-streaming 的介绍已经很详细了,而且也有了关于python的例子,我就不说了,这里总结下自己的经验
1 指定 mapper or reducer 的 task 官方上说要用 -jobconf 但是这个参数已经过时,不可以用了,官方说要用 -D, 注意这个-D是要作为最开始的配置出现的,因为是在maper 和 reducer 执行之前,就需要硬性指定好的,所以要出现在参数的最前面 ./bin/hadoop jar hadoop-0.19.2-streaming.jar -D ………-input …….. 类似这样,这样,即使你程序最后只指定了一个输出管道,但是还是会有你指定的task数量的结果文件,只不过多余的就是空的 实验以下 就知道了
2 关于二次排序,由于是用的streaming 所以,在可执行文件内,只能够处理逻辑,还有就是输出,当然我们也可以指定二次排序,但是由于是全部参数化,不是很灵活。比如:
10.2.3.40 1
11.22.33.33 1
www.renren.com 1
www.baidu.com 1
10.2.3.40 1
这样一个很规整的输入文件,需求是要把记录独立的ip和url的count 但是输出文件要分分割出来。
官方网站的例子,是指定 key 然后对key 指定 主-key 和 key 用来排序,而 主-key 用来二次排序,这样会输出你想要的东西, 但是对于上面最简单的需求,对于传递参数,我们如何做呢?
其实我们还是可以利用这一点,在我们mapper 里面,还是按照/t来分割key value 但是我们要给key指定一个主-key 用来给Partitioner 来实现二次排序,所以我们可以稍微处理下这个KEY,我们可以简单的判断出来ip 和 url 的区别,这样,我们就人为的加上一个主-key 我们在mapper里面,给每个key人为的加上一个”标签”,用来给partitioner做 二次排序用,比如我们的mapper的输出是这样
D&10.2.3.40 1
D&11.22.33.33 1
W&www.renren.com 1
W&www.baidu.com 1
D&10.2.3.40 1
然后通过传递命令参数

-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner //指定要求二次排序
-jobconf map.output.key.field.separator=’&’ //这里如果不加两个单引号的话我的命令会死掉
-jobconf num.key.fields.for.partition=1 //这里指第一个 & 符号来分割,保证不会出错

这样我们就可以通过 partitioner 来实现二次排序了

在reducer里面,我们再把”标签”摘掉(不费吹灰之力)就可以做到悄无声息的完成二次排序了。

这篇关于python 实现Hadoop的partitioner和二次排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/871081

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法