Hadoop实战系列之MapReduce 分析 Youtube视频数据

一、实战介绍
MapReduce 是 Hadoop 的计算框架。
在运行一个 MR 程序时,任务过程被分为两个阶段:Map 阶段和 Reduce 阶段,每个阶段都是用键值对作为输入和输出。

本文知识点:
eclipse 的 Hadoop 开发环境搭建
编写 MR 程序
本地运行
生成 Jar 包提交 yarn 运行(远程运行)

本机环境
Hadoop 2.5.1
eclipse indigo
Centos6.9
Jdk1.7

二、准备工作
2.1 数据集介绍及准备
博主使用 Youtube 视频数据集,相关的介绍可以访问 Youtube Dataset 网站查看。
该数据集各个字段的具体含义如下:

字段名 解释及数据类型
video ID 视频ID:每个视频均有唯一的11位字符串
uploader 上传者用户名:字符串类型
age 视频年龄:整数值,代表视频上传时间与2007年2月15日(Youtube创立日)的时间间隔
category 分类:由上传者选择的视频分类,字符串类型
length 视频长度:整数值
views 浏览量:整数值
rate 视频评分:浮点值
ratings 评分次数:整数值
comments 评论数:整数值
related IDs 相关视频ID:数量不超过20个,每一个相关视频的ID均为单独的一列

数据内容如图:

每一行为一条数据,本次实战共1000w条数据。(由于任务量有要求,但是下载的数据只有50w条,因此复制了20份合并成一个数据文件。共1000w条数据。)

每条记录的相关视频数量不尽相同,因此数据不是很整齐。我们需要过滤掉无效字段,稍后会给出项目详细代码注释。

终端下使用 wc -l 命令查看数据文件的行数。

使用 head -n 1 命令查看数据文件的第一条记录。

2.2 环境准备
由于要写 MapReduce 程序,必然要有 eclispe 下的 Hadoop 开发环境。我们又希望以生成 jar 包的方式提交和运行在 Hadoop 环境中,所以必须安装 Hadoop 。

使用 start-all.sh 命令启动所有服务。

使用 jps 命令可以查看到 NameNode、SecondaryNameNode、NodeManager、ResourceManager 和 DataNode 已启动。

三、项目需求描述
根据已有数据集,编写 MapReduce 程序,实现以下功能:

从视频数据中,分别统计每一个视频类型下的视频数量,数据之间采用”\t”分隔符隔开。

四、项目实现过程
4.1 创建Map/Reducer项目:
双击桌面上的eclipse图标,创建项目:file->other->Map/Reducer Project->Next->Project name创建名为VideoCount的项目名,然后创建名为com.zout的包,接着在包里面创建一个java类,类名为VideoCount,
图示:

4.2 编写代码
VideoCount.java 代码如下:

package com.zout;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
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 java.io.IOException;/*** * @author zoutao* @time 2018/7/3* @see 分析Youtube视频数据**/
public class VideoCount {//主函数public static void main(String[] args) throws Exception {Configuration conf = new Configuration();@SuppressWarnings("deprecation")Job job = new Job(conf, "categories");//指定导出的jar包路径  job.setJar("/home/gznc/myjar/VideoCount.jar");//设置生产 jar 包所使用的类job.setJarByClass(VideoCount.class);//设置 Map 类的输入输出类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);//设置 Reduce 类的输入输出类型    job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);//设置 Map, Reduce 类的 class 参数job.setMapperClass(Map.class);job.setReducerClass(Reduce.class);//指定格式化用的类型job.setInputFormatClass(TextInputFormat.class);job.setOutputFormatClass(TextOutputFormat.class);//指定要分析的数据文件路径--0.txtFileInputFormat.addInputPath(job,new Path("hdfs://master:9000/inputVideo/0.txt"));//指定输出的文件路径--out2文件夹下FileOutputFormat.setOutputPath(job, new Path("hdfs://master:9000/out2/"));//完成任务以后的提示信息boolean flag = job.waitForCompletion(true);System.out.println("任务完成"+flag);System.exit(flag?0:1);System.out.println();}//Map类,封装KV键值对 <k1,v1,k2,v2> , k1 是偏移量,v1 是这行数据public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);//构造文本类Text对象、IntWritable 对象,也可以直接以匿名函数的方式创建private Text tx = new Text();//map 的逻辑,使用tab“\ t”分隔符来分割行,并将值存储在String Array中,以使一行中的所有列都存储在字符串数组中public void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {//拿到每一行数据String line = value.toString();String[] str = line.split("\t");//过滤掉多余的字段if (str.length > 5) {tx.set(str[3]);}//输出key,valuecontext.write(tx, one);}}//编写 reduce,接收 map 阶段传来的 kv 键值对,输出的类型和传进来的类型一致public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {//reduce????public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {int sum = 0;//累加求类别的视频数量for (IntWritable v : values) {sum += v.get();}//写入文本文件中输出context.write(key, new IntWritable(sum));}}
}

4.3 导出jar包
编码完成以后,我们可以需要导出jar包。


注意:
1. 在eclipse里面就可以运行MR代码,可以不用导出jar包。
2. 为什么要导出jar包?jar包导出以后,可以以生成 jar 包的形式提交 hadoop yarn 上来运行MR程序,得到数据分析的结果。这样跟在eclipse中运行是一样的。只不过是方式不同。方便一些专门搞linux系统的朋友使用。
3. 如果你是在 Windows 平台写的MR代码,则可以用通过生成 jar 包的方式提交到其他系统的hadoop环境下去运行。


导出jar操作如下:
eclipse中选中项目右键 ,在弹出的菜单中选择 Export




上面的路径需要自己定义成自己的,而且需要跟MR代码里面保持一致。

4.4 开启hadoop集群,上传数据文件

a. 终端下输入start-all.sh,开启hadoop集群环境,输入jps查看进程如下:

b. 数据上传到HDFS文件系统下:
在终端中输入以下命令,将 0.txt 上传到 HDFS 文件系统。

方式一:采用hadoop命令完成上传:
终端下输入:

hadoop fs -mkdir /inputVideo  //创建一个文件夹
hadoop fs -put /home/gznc/0.txt /inputVideo //0.txt上传到文件夹下

方式二:采用eclipse插件完成上传:这个需要自己先去搭建hadoopEclipse插件,出现管理DFS的页面选项才可以。
打开eclipse里面的DFS管理,然后右键选择创建文件夹和上传文件即可,如果出现无法上传或者是删除不了文件夹的情况,请参考:eclipse可以连接显示hdfs文件,但运行程序时却提示拒绝连接
完成以后的图示:

好了,现在已经完成了编写MR程序代码,导出了jar包,上传了0.txt数据。接下来就可以运行代码了。

4.5 运行hadoop数据分析程序
也是可以分为两种方式来运行。
方式一:在eclipse的本程序代码中,直接右键Run AS >> Run on Hadoop ,然后等待任务完成,完成以后打开DFS即可查看:

结果:

方式二:
终端下提交jar包来运行程序:
按照如下方式来写对应代码,回车即可。

hadoop jar 生成的jar包路径 全类名 输入路径input 输出路径output

如下:

hadoop jar xxx/xxx/VideoCount.jar com.zout.VideoCount /inputVideo /out2

完成以后,在终端输入如下命令查看得到的文件分析结果,
命令:

hadoop fs -cat /out2/part-r-00000

如下:

到这里,整个Hadoop实战系列之MapReduce 分析 Youtube视频数据的第一个任务:从视频数据中,分别统计每一个视频类型下的视频数量就完成了。

需要整个项目源代码或视频数据集的留下邮箱。


You got a dream, you gotta protect it.
如果你有梦想的话,就要去捍卫它 。 ——《当幸福来敲门》

Hadoop实战系列之MapReduce 分析 Youtube视频数据相关推荐

  1. MapReduce 分析 Youtube 数据

    MapReduce 分析 Youtube 数据 一.实验介绍 1.1 实验内容 MapReduce 是 Hadoop 的计算框架. 在运行一个 MR 程序时,任务过程被分为两个阶段:Map 阶段和 R ...

  2. Hadoop 生态系列之 Mapreduce

    阅读文本大概需要 5 分钟.文章稍长,建议收藏慢慢看. 目前 Hadoop 系列文章的规划就是这样,持续补充完善中- 同时可以访问 https://data.cuteximi.com Hadoop 生 ...

  3. 【Hadoop】Hadoop生态系列之MapReduce概述及MapReduce任务开发与发布

    上一篇:Hadoop生态系列之HDFS常用Shell命令实践及Java API操作HDFS 这里写目录标题 MapReduce 概述 流程分析 环境搭建 MapReduce任务开发 背景 实现 任务发 ...

  4. 利用 MapReduce分析明星微博数据实战

    互联网时代的到来,使得名人的形象变得更加鲜活,也拉近了明星和粉丝之间的距离.歌星.影星.体育明星.作家等名人通过互联网能够轻易实现和粉丝的互动,赚钱也变得前所未有的简单.同时,互联网的飞速发展本身也造 ...

  5. 我用Python分析5W+视频数据,看看谁才是最咕UP主

    前情回顾: 1.爬取bilibili热门视频信息(简易版) 2.爬取bilibili热门视频信息(复杂版) 目录 一.数据介绍及预处理 I. 数据介绍 II. 数据预处理 二.UP主用户行为分析 I. ...

  6. MapReduce分析明星微博数据

    互联网时代的到来,使得名人的形象变得更加鲜活,也拉近了明星和粉丝之间的距离.歌星.影星.体育明星.作家等名人通过互联网能够轻易实现和粉丝的互动,赚钱也变得前所未有的简单.同时,互联网的飞速发展本身也造 ...

  7. WebRTC系列-RTCDataChannel发送非音视频数据

    文章目录 1. RTCDataChannel基本介绍 2. RTCDataChannel实战 2.1 negotiated=false 创建及事件处理 2.2 negotiated= true 创建及 ...

  8. Hadoop实战任务-----编写MapReduce进行数据清洗

    标题项目需求: 一个英文书籍包含成千上万个单词或者短语,在大量的单词中,找出相同字母组成的所有单词. 策略: 为加快数据处理的速度,借助Hadoop中的MapReduce编程模型的特点,编写出并行计算 ...

  9. 在线报表设计实战系列 – ③制作交叉分析表

    葡萄城报表是一套强大的报表开发和系统搭建工具,既能与您开发的报表软件项目紧密集成,也可独立部署运行,支持多数据源,具有无编码.灵活.稳定等特性,可以帮您快速搭建专业的报表软件系统,实现各类报表的设计. ...

最新文章

  1. IE的安全性设定增加“我的电脑”的安全性设定
  2. pipe 函数 (C语言)
  3. 网站用户登录验证:Servlet+JSP VS Struts书剑恩仇录
  4. C++反转字符串的算法(附完整源码)
  5. CCP(Cost complexity pruning) on sklearn with python implemention
  6. 高德地图画带箭头的线_精选 | 这款充电线逆天了!一条顶三条,让其它线都“下岗”吧...
  7. 十个最适合 Web 和 APP 开发的 NodeJS 框架 1
  8. mysql 回表 覆盖索引_mysql 14 覆盖索引+回表
  9. 洛谷3916 图的遍历
  10. 【渝粤教育】国家开放大学2018年春季 0266-22T设计构成 参考试题
  11. 修改 Ubuntu SSH 登录后的欢迎信息
  12. npm 下载为什么很慢?解决方案来了
  13. 宝德银河麒麟系统打印机安装及共享方法(一)
  14. html css 写百度页面,Html+CSS练习(百度注册页面)--div布局实现
  15. 《30天自制操作系统》学习笔记--第12天
  16. html遮罩层样式,遮罩层样式
  17. 阿里云盘内测邀请码是多少?阿里云盘邀请码获得方法
  18. 不是每个捕鱼都叫捕鱼达人:Cocos精品《捕鱼达人4》华丽升级
  19. python包装好后在pycharm IED中无法导入
  20. python爬虫基础(12:app数据爬取)

热门文章

  1. 链表c语言代码题库排坐标,C语言讲义——链表完整代码
  2. c语言讲义pdf,C语言基本讲义.pdf
  3. 2019-01-25T01:30:00.000+0000 格式转换
  4. CH455 数码管驱动以及键盘控制芯片 应用笔记
  5. debian linux镜像下载,Debian Wheezy 7.7 发布,已提供镜像下载更新
  6. 什么是跨域?怎么实现跨域请求?
  7. 2012年CSDN高校俱乐部秋季巡讲结案报告
  8. FANSEA泛海微MCU单片机IC方案LED智能紫外(UVC+UVA)消毒灯
  9. dae模型如何合并_PV3D学习笔记-导入DAE模型
  10. 2021CCPC华为云挑战赛热身赛