Hadoop 전투——MapReduce는 앵커의 브로드캐스트 볼륨 및 TopN 정렬과 같은 데이터의 통계를 실현합니다(2부).

이 실용적인 프로젝트는 세 가지 가르침으로 나뉩니다(세 번째 것은 다음 주에 업데이트됩니다).

1부: 앵커의 텍스트 데이터 정리, 대량의 데이터에서 필요한 데이터(예: 재생 볼륨, 지속 시간 등) 얻기

2부: 정리된 데이터에 대해 통계 합산 처리를 수행하고 앵커 ID 번호에 따라 순서대로 깔끔하게 표시합니다.

파트 3: 통계 데이터에 대해 TopN 표시 작업을 수행하고 정렬 규칙을 사용자 지정할 수 있습니다(예: 재생 횟수, 팬 수). N의 크기도 사용자 지정할 수 있습니다.

모든 기술 및 실용적인 교육 기사의 일반 카탈로그를 보려면 여기를 클릭하십시오.


더 많은 MapReduce 설계 사례 주소: https://github.com/yuanprogrammer/MapReduce-Case-Statistics

목차

머리말:

1. 프로세스 소개

 2. 메이븐 프로젝트 생성

 (1) 새로운 메이븐

 (2) 종속성 추가

3. 맵리듀스 프로그램 작성

(1) 커스텀 데이터 클래스

(2) 매퍼 클래스

(3) 수업 축소

(4) 메인 클래스(엔트리 클래스)

4. 컴파일 및 패키징 jar 업로드

5. 데이터세트 복사

 6. Jar 패키지 프로그램 실행

 Gitee 웨어하우스 Hadoop 프로젝트 다운로드 주소

기타 일련의 기술 교육, 실제 개발


머리말:

첫 번째 튜토리얼에서는 앵커의 데이터를 이미 추출했지만 데이터가 지저분해 보입니다.

1. 프로세스 소개

먼저 추출된 데이터는 다음과 같습니다.

 텍스트 데이터를 통해 앵커의 id 번호에 대한 데이터 레코드가 여러 개 있음을 알 수 있으므로 동일한 id의 해당 데이터를 누적하여 합산하고 id에 대해 오름차순 연산을 수행해야 합니다. 동시에 더 깔끔해 보입니다.

이 시간에는 Reduce를 사용하여 통계 합계, 정렬 및 기타 작업이 포함되며 전체 프로젝트 프로세스는 다음과 같습니다.

 2. 메이븐 프로젝트 생성

 (1) 새로운 메이븐

IDEA를 열고 새 프로젝트를 만들고 왼쪽 열에서 maven 프로젝트를 선택한 후 다음을 클릭합니다.

 프로젝트 이름을 추가하고 마침을 클릭합니다.

 생성 후 오른쪽 하단에 프롬프트가 표시됩니다. Auto를 선택하여 종속성을 자동으로 가져옵니다(하나가 없어도 상관없습니다. 나중에 종속성을 추가할 때도 나타납니다).

 (2) 종속성 추가

프로젝트 디렉터리를 확장하고 pom.xml 구성 파일을 편집한 후 다음 종속성을 추가합니다.

<dependencies>
        <!-- Hadoop所需对应依赖包 -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.3.1</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <!-- 编译打包项目的插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>6</source>
                    <target>6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

 프로젝트 생성됨

3. 맵리듀스 프로그램 작성

Map 및 Reduce의 해당 단계의 작업 및 처리 결과에 익숙하지 않은 경우 자세한 소개가 있는 이전 단어 통계 및 정렬 자습서를 읽을 수 있습니다.

(1) 커스텀 데이터 클래스

이 클래스의 기능: 앵커의 지표 데이터를 계산하는 것이 편리하며 이러한 필드는 향후 유지 관리를 위해 개체에 통합되어야 합니다.

새로운 VideoInfoWritable 클래스를 생성하여 Writable 클래스를 상속하고 , 4개의 속성을 설정하고, get() 및 set() 메서드를 직접 추가합니다.

public class VideoInfoWritable extends Writable {
    private long gold; //金币
    private long watchnumpv; //观看时长
    private long follower; //粉丝数量
    private long length; //总播放时长
}

Writable 클래스 의 두 가지 메서드 (하나는 readFileds 입력 데이터, 하나는 출력 데이터 쓰기 )를 다시 작성합니다 .

@Override
public void readFields(DataInput dataInput) throws IOException {
    this.gold = dataInput.readLong();
    this.watchnumpv = dataInput.readLong();
    this.follower = dataInput.readLong();
    this.length = dataInput.readLong();
}

@Override
public void write(DataOutput dataOutput) throws IOException {
    dataOutput.writeLong(gold);
    dataOutput.writeLong(watchnumpv);
    dataOutput.writeLong(follower);
    dataOutput.writeLong(length);
}

(2) 매퍼 클래스

이 클래스의 기능: 행별로 데이터를 읽고, 해당 필드 데이터를 잘라내어 가져오고, 필드 데이터를 (1) 사용자 정의 클래스 개체로 캡슐화합니다.

매퍼 클래스를 상속하고 매퍼 메서드를 재정의하는 새 videoInfoMap 클래스를 만듭니다.

public class VideoInfoMap extends Mapper<LongWritable, Text, Text, VideoInfoWritable> {
    @Override
    public void map(LongWritable k1, Text v1, Context context) throws IOException, InterruptedException {
        String line = v1.toString(); //读取清先之后的每一行数据
        String[] fields = line.split("\t"); //通过"\t"对数据进行切割
        String id = fields[0]; //获取主播的id
        /**
         * 获取主播的其他数据
         * gold-------->>金币
         * watchnumpv-->>播放量
         * follower---->>粉丝
         * length------>>开播时长
         */
        long gold = Long.parseLong(fields[1]);
        long watchnumpv = Long.parseLong(fields[2]);
        long follower = Long.parseLong(fields[3]);
        long length = Long.parseLong(fields[4]);
        Text k2 = new Text();
        k2.set(id);
        // 封装到自定义的VideoInfoWritable类对象中
        VideoInfoWritable v2 = new VideoInfoWritable();
        v2.set(gold, watchnumpv, follower, length);
        context.write(k2, v2);
    }
}

(3) 수업 축소

이 클래스의 기능: 동일한 호스트 ID를 가진 VideoInfoWritable 클래스 개체를 순회하고 , 해당하는 4개의 필드 값을 얻고, 합산을 수행합니다.

새 videoInfoReduce 클래스를 만들고, Reduce 클래스를 상속하고, reduce 메서드를 재정의합니다.

public class VideoInfoReduce extends Reducer<Text,VideoInfoWritable, Text,VideoInfoWritable> {
    @Override
    protected void reduce(Text k2,Iterable<VideoInfoWritable> v2s,Context context) throws IOException,InterruptedException{
        // 从v2s中把相同的k2的value取出来,进行遍历,进行累加求和。
        long goldsum=0;
        long watchnumpvsum=0;
        long followersum=0;
        long lengthsum=0;
        /**
         * v2s:相同主播id的对应对象集合(VideoInfoWritable类对象,有四个属性)
         * 遍历具有相同id的对象,获取对应四个字段值,进行求和
         */
        for(VideoInfoWritable v2:v2s){
            goldsum+=v2.getGold();
            watchnumpvsum+=v2.getWatchnumpv();
            followersum+=v2.getFollower();
            lengthsum+=v2.getLength();
        }
        // 将求和统计好的封装进来,写入context中,交由Job主类打印输出
        Text k3=k2;
        VideoInfoWritable v3=new VideoInfoWritable();
        v3.set(goldsum,watchnumpvsum,followersum,lengthsum);
        context.write(k3,v3);
    }
}

(4) 메인 클래스(엔트리 클래스)

이건 뭐 할말이 없지만 jar 패키지 프로그램 실행을 위한 엔트리 클래스, 해당 코드 주석도 표시해두었습니다

public class VideoInfoJob {
    public static void main(String[] args) {
        try {
            // 运行jar包程序指令输入错误,直接退出程序
            if (args.length != 2) {
                System.exit(100);
            }
            Configuration conf = new Configuration();//job需要的配置参数
            Job job = Job.getInstance(conf);//创建一个job作业
            job.setJarByClass(VideoInfoJob.class);//设置入口类
            FileInputFormat.setInputPaths(job, new Path(args[0]));//指定输入路径(可以是文件,也可以是目录)
            FileOutputFormat.setOutputPath(job, new Path(args[1]));//指定输出路径(只能是指定一个不存在的目录)
            // 指定Mapper阶段的相关类
            job.setMapperClass(VideoInfoMap.class);
            // 指定K2的输出数据类型
            job.setMapOutputKeyClass(Text.class);
            // 指定v2的输出数据类型
            job.setMapOutputValueClass(VideoInfoWritable.class);
            // 指定Reduce阶段的相关类
            job.setReducerClass(VideoInfoReduce.class);
            // 指定K3的输出数据类型
            job.setOutputKeyClass(Text.class);
            // 指定V3的输出数据类型
            job.setOutputValueClass(VideoInfoWritable.class);
            //提交作业job
            job.waitForCompletion(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. 컴파일 및 패키징 jar 업로드

오른쪽의 maven을 클릭하고 Lifecycle을 펼치고 clean을 두 번 클릭하여 정리한 다음 package를 두 번 클릭하여 jar 패키지를 생성합니다.

 실행 후 프로젝트 디렉토리에 target 폴더가 생성되고 확장하면 jar 패키지가 보입니다.jar 패키지를 마우스 오른쪽 버튼으로 클릭하여 jar 패키지를 복사하고 winscp를 통해 가상 머신에 연결하여 가상 머신에 복사합니다(첫 번째 기사 참조). 당신이하지 않을 경우  )

가상 머신에 성공적으로 복사했습니다.

5. 데이터세트 복사

첫 번째 기사에서 데이터를 미리 처리하고 결과 데이터 세트를 HDFS 파일 시스템으로 출력했습니다. 이제 결과 세트를 데이터 디렉토리에 복사하고 이름을 바꿉니다.

명령을 입력하고 part-m-00000 파일을 /zhubo/data/ 폴더 에 복사 하고 이름을 zhuboClean.log로 지정합니다.

hadoop fs -cp /zhubo/resultClean/part-m-00000 /zhubo/data/zhuboClean.log

 6. Jar 패키지 프로그램 실행

마지막으로 jar 패키지를 실행하고 실행합니다.

zhuboCensus-1.0.jar 실행할 jar 패키지의 이름
비디오 정보 작업  메인 클래스(엔트리 클래스) 클래스 이름
/zhubo/data/zhuboClean.log 경로 입력(데이터가 있는 위치)
/zhubo/resultCensus/ 출력 경로(결과 출력 경로, 존재하지 않는 폴더로)
hadoop jar zhuboCensus-1.0.jar VideoInfoJob /zhubo/data/zhuboClean.log /zhubo/resultCensus/

 브라우저를 새로 고치고 출력 결과 데이터 세트를 다운로드하십시오.

메모장에서 열어보면 통계가 완료된 것을 확인할 수 있으며, 아이디에 따라 자동으로 순차적으로 표시됩니다

 Gitee 웨어하우스 Hadoop 프로젝트 다운로드 주소

Gitee 창고 주소 (Hadoop 전투 프로젝트 소스 코드 수집)

Hadoop 실용 프로젝트 소스 코드 모음: https://blog.csdn.net/weixin_47971206CSDN 기사 교육 소스 코드 요약 모음

기타 일련의 기술 교육, 실제 개발

주요 기술 기초 강의 및 실습 개발 강의 (최신 업데이트 시간 2021-11-28)_대머리 프로그래머 블로그-CSDN 블로그

Je suppose que tu aimes

Origine blog.csdn.net/weixin_47971206/article/details/121583817
conseillé
Classement