Hadoop的Secondary Sorting
这几天项目中使用Hadoop遇到一个问题,对于这样key-value的数据集合:id-biz object,对id进行partition(比如根据某特定的hash算法P),分为a份;使用数量为b的reducer,在reducer里面要使用第三方组件进行批量上传;上传成文件,文件数量为c,但是有两个要
这几天项目中使用Hadoop遇到一个问题,对于这样key-value的数据集合:id-biz object,对id进行partition(比如根据某特定的hash算法P),分为a份;使用数量为b的reducer,在reducer里面要使用第三方组件进行批量上传;上传成文件,文件数量为c,但是有两个要求:
- 上述a、b、c都相等,从而使得每个partition的数据最终都通过同一个reducer上传到同一个文件中去;
- 每个reducer中上传的数据要求id必须有序。
最开始,想到的办法是,为了保证reducer中的批量上传,需要使得传入reducer的key变成一个经过hash算法A计算得到的index,这样就使得reducer中的value是一个包含了数个biz boject的集合的iterator,从而实现在一次reducer调用中批量上传并且提交。在批量上传提交的过程中,按照每上限个(例如1000个)文件提交一次的办法进行,以保证内存占用控制在一定范围内。
如何保证有序?
Hadoop在Reduce之前会自动对key排序,但是上述的情况实际是要根据id来给value排序(因为在map之后key已经变成index了),凡是涉及到要给value排序的,都要使用Hadoop的Secondary Sorting(见stackoverflow链接)。
这张图其实已经可以说明,把value要排序的关键属性放到key里面去,这样key就变成了natural key(上述的index)和secondary key(上述的id)这样两部分组成的一个composite key。
1. Partition:Partition的时候仅使用natural key,保证所有index的数据都分在同一个partition;
JobConf.setPartitionClass(...);
2. Sort:真正给key排序的比较算法要对natural key和secondary key两部分进行排序,从而保证了key在id维度上是有序的,而id和value是一一对应的,因此value也就是有序的。
JobConf.setOutputKeyComparatorClass(...);
3. Group:grouping的比较算法忽略掉secondary key,只对natural keygrouping,使得属于同一index的数据都走到同一个reducer中去。
JobConf.setOutputValueGroupingComparatorClass(...);
总结一下,这样一来,在reducer中,input key是上述这样一个composite key对象,包含了index和id,input value是一个可以遍历的元素为原始biz object类型的对象。
后话:这是Secondary Sorting的过程,可以解决我的问题,但是后来发现,实际上,我的问题并不需要要用这样啰嗦的方式来解决:
- 进入reducer的key只需要是id,Hadoop会对key自动排序;
- partition策略不变,但是是在partitioner中计算index并根据它来partition;
- 不需要单独指定Grouping和Sorting的算法;
- 在reducer中建立一个大小为上限(如1000个)的容器对象p。
这样,既然对于每个partition的数据,都在同一个reducer中得到处理,而reducer中每次reduce方法彼此之间是根据id有序进行,那么就可以在每次调用时把数据放到p中,在p放满时提交一次即可。
测试通过。回头看看,真是刚开始的时候把问题想复杂了。
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接《四火的唠叨》

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

Java 오류: Hadoop 오류, 처리 및 방지 방법 Hadoop을 사용하여 빅 데이터를 처리할 때 작업 실행에 영향을 미치고 데이터 처리 실패를 유발할 수 있는 Java 예외 오류가 자주 발생합니다. 이 기사에서는 몇 가지 일반적인 Hadoop 오류를 소개하고 이를 처리하고 방지하는 방법을 제공합니다. Java.lang.OutOfMemoryErrorOutOfMemoryError는 Java 가상 머신의 메모리 부족으로 인해 발생하는 오류입니다. 하둡이 있을 때

데이터의 양이 지속적으로 증가함에 따라 기존의 데이터 처리 방식으로는 더 이상 빅데이터 시대가 가져온 과제를 처리할 수 없습니다. 하둡(Hadoop)은 빅데이터 처리 시 단일 노드 서버로 인해 발생하는 성능 병목 현상을 분산 저장 및 대용량 데이터 처리를 통해 해결하는 오픈소스 분산 컴퓨팅 프레임워크이다. PHP는 웹 개발에 널리 사용되는 스크립팅 언어로 개발 속도가 빠르고 유지 관리가 쉽다는 장점이 있습니다. 이 글에서는 빅데이터 처리를 위해 PHP와 Hadoop을 사용하는 방법을 소개합니다. 하둡이란 무엇인가Hadoop이란

Java 빅데이터 기술 스택: Hadoop, Spark, Kafka 등 빅데이터 분야에서 Java의 응용을 이해합니다. 데이터의 양이 지속적으로 증가함에 따라 오늘날 인터넷 시대에 빅데이터 기술이 화두가 되고 있습니다. 빅데이터 분야에서 우리는 하둡(Hadoop), 스파크(Spark), 카프카(Kafka) 등의 기술 이름을 자주 듣습니다. 이러한 기술은 매우 중요한 역할을 하며, 널리 사용되는 프로그래밍 언어인 Java는 빅데이터 분야에서도 큰 역할을 합니다. 이 기사에서는 Java의 대규모 애플리케이션에 중점을 둘 것입니다.

빅데이터 시대가 도래하면서 데이터의 처리와 저장이 더욱 중요해지고 있으며, 대용량 데이터를 어떻게 효율적으로 관리하고 분석할 것인가가 기업의 과제가 되었습니다. Apache Foundation의 두 가지 프로젝트인 Hadoop과 HBase는 빅데이터 저장 및 분석을 위한 솔루션을 제공합니다. 이 기사에서는 빅데이터 저장 및 쿼리를 위해 Beego에서 Hadoop 및 HBase를 사용하는 방법을 소개합니다. 1. Hadoop 및 HBase 소개 Hadoop은 오픈 소스 분산 스토리지 및 컴퓨팅 시스템입니다.

1: JDK1을 설치합니다. 다음 명령을 실행하여 JDK1.8 설치 패키지를 다운로드합니다. wget--no-check-certificatehttps://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-x64.tar.gz2 다음 명령을 실행하여 다운로드한 JDK1.8 설치 패키지의 압축을 풉니다. . tar-zxvfjdk-8u151-linux-x64.tar.gz3. JDK 패키지를 이동하고 이름을 바꿉니다. mvjdk1.8.0_151//usr/java84. Java 환경 변수를 구성합니다. 에코'

현재 인터넷 시대에 대용량 데이터의 처리는 모든 기업과 기관이 직면한 문제입니다. 널리 사용되는 프로그래밍 언어인 PHP는 데이터 처리 속도도 따라잡아야 합니다. 대용량 데이터를 보다 효율적으로 처리하기 위해 PHP 개발에는 Spark 및 Hadoop과 같은 몇 가지 빅 데이터 처리 도구가 도입되었습니다. Spark는 대규모 데이터 세트의 분산 처리에 사용할 수 있는 오픈 소스 데이터 처리 엔진입니다. Spark의 가장 큰 특징은 빠른 데이터 처리 속도와 효율적인 데이터 저장입니다.

데이터의 양이 지속적으로 증가함에 따라 대규모 데이터 처리는 기업이 직면하고 해결해야 할 문제가 되었습니다. 기존의 관계형 데이터베이스는 더 이상 이러한 요구를 충족할 수 없습니다. 대규모 데이터의 저장 및 분석을 위해서는 Hadoop, Spark 및 Flink와 같은 분산 컴퓨팅 플랫폼이 최선의 선택이 되었습니다. 데이터 처리 도구를 선택하는 과정에서 PHP는 개발 및 유지 관리가 쉬운 언어로 개발자들 사이에서 점점 인기를 얻고 있습니다. 이 기사에서는 대규모 데이터 처리에 PHP를 활용하는 방법과 방법을 살펴보겠습니다.

Redis와 Hadoop은 모두 일반적으로 사용되는 분산 데이터 저장 및 처리 시스템입니다. 그러나 디자인, 성능, 사용 시나리오 등의 측면에서 둘 사이에는 분명한 차이가 있습니다. 이 기사에서는 Redis와 Hadoop의 차이점을 자세히 비교하고 적용 가능한 시나리오를 살펴보겠습니다. Redis 개요 Redis는 다양한 데이터 구조와 효율적인 읽기 및 쓰기 작업을 지원하는 오픈 소스 메모리 기반 데이터 스토리지 시스템입니다. Redis의 주요 기능은 다음과 같습니다. 메모리 저장: Redis
