目录
1. HADOOP背景介绍
1.1 什么是HADOOP
1.2 HADOOP产生背景
1.3 HADOOP在大数据、云计算中的位置和关系
1.4 国内外HADOOP应用案例介绍
1.5 HADOOP生态圈以及各组成部分的简介
2 分布式系统概述
2.1 分布式软件系统(Distributed Software Systems)
2.2 分布式软件系统举例:solrcloud
2.3 分布式应用系统模拟开发
3. 离线数据分析流程介绍
3.1 需求分析
3.1.1 案例名称
3.1.2 案例需求描述
3.1.3 数据来源
3.2 数据处理流程
3.2.1 流程图解析
3.2.2 项目技术架构图
3.2.3 项目相关截图
3.3 项目最终效果
4. 集群搭建
4.1 HADOOP集群搭建
4.1.1集群简介
4.1.2服务器准备
4.1.3网络环境准备
4.1.4服务器系统设置
4.1.5 Jdk环境安装
4.1.6 HADOOP安装部署
4.1.7 启动集群
4.1.8 上传文件到HDFS测试
5 集群使用初步
5.1 HDFS使用
5.2 MAPREDUCE使用
5.2.1 Demo开发——wordcount
5.2.2 程序打包运行
——分布式文件系统(GFS),可用于处理海量网页的存储
——分布式计算框架MAPREDUCE,可用于处理海量网页的索引计算问题。
——Bigtable发布于2006年,启发了无数的NoSQL数据库,比如:Cassandra、HBase等等
3.Nutch的开发人员完成了相应的开源实现HDFS和MAPREDUCE,并从Nutch中剥离成为独立项目HADOOP,到2008年1月,HADOOP成为Apache顶级项目,迎来了它的快速发展期。
1、HADOOP应用于数据服务基础平台建设
2、HADOOP用于用户画像
3、HADOOP用于网站点击流日志数据挖掘
重点组件:
注:由于大数据技术领域的各类技术框架基本上都是分布式系统,因此,理解hadoop、storm、spark等技术框架,都需要具备基本的分布式系统概念
总结:利用多个节点共同协作完成一项或多项具体业务功能的系统就是分布式系统。
需求:可以实现由主节点将运算任务发往从节点,并将各从节点上的任务启动;
程序清单:
AppMaster
AppSlave/APPSlaveThread
Task
程序运行逻辑流程:
注:本环节主要感受数据分析系统的宏观概念及处理流程,初步理解hadoop等框架在其中的应用环节,不用过于关注代码细节
一个应用广泛的数据分析系统:“web日志数据挖掘”
“网站或APP点击流日志数据挖掘系统”。PV-Page View,一般中型的网站(10W的PV以上),每天会产生1G以上Web日志文件。大型或超大型的网站,可能每小时就会产生10G的数据量。
具体来说,比如某电子商务网站,在线团购业务。每日PV数100w,独立IP数5w。用户通常在工作日上午10:00-12:00和下午15:00-18:00访问量最大。日间主要是通过PC端浏览器访问,休息日及夜间通过移动设备访问较多。网站搜索浏量占整个网站的80%,PC用户不足1%的用户会消费,移动用户有5%会消费。
对于日志的这种规模的数据,用HADOOP进行日志分析,是最适合不过的了。
“Web点击流日志”包含着网站运营很重要的信息,通过日志分析,我们可以知道网站的访问量,哪个网页访问人数最多,哪个网页最有价值,广告转化率、访客的来源信息,访客的终端信息等。
本案例的数据主要由用户的点击行为记录
获取方式:在页面预埋一段js程序,为页面上想要监听的标签绑定事件,只要用户点击或移动到标签,即可触发ajax请求到后台servlet程序,用log4j记录下事件信息,从而在web服务器(nginx、tomcat等)上形成不断增长的日志文件。
形如:
58.215.204.118 - - [18/Sep/2013:06:51:35 +0000] "GET /wp-includes/js/jquery/jquery.js?
ver=1.10.2 HTTP/1.1" 304 0 "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0
(Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0"
本案例跟典型的BI系统极其类似,整体流程如下:
但是,由于本案例的前提是处理海量数据,因而,流程中各环节所使用的技术则跟传统BI完全不同,后续课程都会一一讲解:
./sqoop export --connect jdbc:mysql://localhost:3306/weblogdb --username root --password
root --table t_display_xx --export-dir /user/hive/warehouse/uv/dt=2014-08-03
经过完整的数据处理流程后,会周期性输出各类统计指标的报表,在生产实践中,最终需要将这些报表数据以可视化的形式展现出来,本案例采用web程序来实现数据可视化,效果如下所示:
HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起
HDFS集群:负责海量数据的存储,集群中的角色主要有 NameNode / DataNode
YARN集群:负责海量数据运算时的资源调度,集群中的角色主要有 ResourceManager /NodeManager
部署图如下:
本案例使用虚拟机服务器来搭建HADOOP集群,所用软件及版本:
192.168.18.101 node01
192.168.18.102 node02
192.168.18.103 node03
192.168.18.104 node04
192.168.18.105 node05
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
service iptables stop //临时关闭防火墙
service iptables status
export JAVA_HOME=/usr/java/jdk1.7.0_79
PATH=$PATH:$JAVA_HOME/bin
远程复制:scp jdk-7u79-linux-x64.rpm [email protected]:/root/
扩展:
export HADOOP_HOME=/opt/huawei/hadoop-2.6.5
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
vi hadoop-env.sh / vi mapred-env.sh / vi yarn-env.sh
fs.defaultFS
hdfs://node02:9000
hadoop.tmp.dir
/var/huawei/hadoop/local
dfs.namenode.name.dir
/home/hadoop/data/name
dfs.datanode.data.dir
/home/hadoop/data/data
dfs.replication
1
dfs.namenode.secondary.http-address
node02:50090
mapreduce.framework.name
yarn
yarn.resourcemanager.hostname
hadoop01
yarn.nodemanager.aux-services
mapreduce_shuffle
hdp-node-01
hdp-node-02
hdp-node-03
初始化HDFS:hdfs namenode -format (只能格式化一次,再次启动集群不要执行)
启动HDFS:单机启动--sbin/start-dfs.sh ; 集群启动--sbin/start-all.sh
启动YARN:sbin/start-yarn.sh
角色进程查看:jps
帮助: hdfs
查看配置属性:hdfs getconf -confKey fs.default.name
常用:hdfs dfs
查看web UI: IP:50070
从本地上传一个文本文件到hdfs的/wordcount/input目录下
[HADOOP@hdp-node-01 ~]$ HADOOP fs -mkdir -p /wordcount/input
[HADOOP@hdp-node-01 ~]$ HADOOP fs -put /home/HADOOP/somewords.txt /wordcount/input
2、运行一个mapreduce程序: 在HADOOP安装目录下,运行一个示例mr程序
cd $HADOOP_HOME/share/hadoop/mapreduce/
hadoop jar mapredcue-example-2.6.1.jar wordcount /wordcount/input /wordcount/output
1、查看集群状态: hdfs dfsadmin -report
命令:
2、上传文件到HDFS
查看HDFS中的目录信息 :hdfs dfs -ls / 或者 hadoop fs –ls /
上传文件:hdfs dfs -put hadoop-2.6.5.tar.gz /user/root 或者: hadoop fs -put ./ scala-2.10.6.tgz to / ?
从HDFS下载文件: hadoop fs -get /yarn-site.xml
hadoop fs,hadoop dfs以及hdfs dfs区别:
hadoop fs: 该命令可以用于其他文件系统,不止是hdfs文件系统内,也就是说该命令的使用范围更广
hadoop dfs :专门针对hdfs分布式文件系统
hdfs dfs :和上面的命令作用相同,相比于上面的命令更为推荐,并且当使用hadoop dfs时内部会被转为hdfs dfs命令
mapreduce是hadoop中的分布式运算编程框架,只要按照其编程规范,只需要编写少量的业务逻辑代码即可实现一个强大的海量数据并发处理程序
1、需求
从大量(比如T级别)文本文件中,统计出每一个单词出现的总次数
2、mapreduce实现思路
Map阶段:
Reduce阶段:
3、具体编码实现
(1)定义一个mapper类
package cn.lxk.bigdata.mr.wcdemo;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
/**
* KEYIN: 默认情况下,是mr框架所读到的一行文本的起始偏移量,Long,
* 但是在hadoop中有自己的更精简的序列化接口,所以不直接用Long,而用LongWritable
*
* VALUEIN:默认情况下,是mr框架所读到的一行文本的内容,String,同上,用Text
*
* KEYOUT:是用户自定义逻辑处理完成之后输出数据中的key,在此处是单词,String,同上,用Text
* VALUEOUT:是用户自定义逻辑处理完成之后输出数据中的value,在此处是单词次数,Integer,同上,用IntWritable
*
*
*/
public class WordCountMapper extends Mapper {
/**
* map阶段的业务逻辑就写在自定义的map()方法中 maptask会对每一行输入数据调用一次我们自定义的map()方法
*/
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 将maptask传给我们的文本内容先转换成String
String line = value.toString();
// 根据空格将这一行切分成单词
String[] words = line.split(" ");
// 将单词输出为<单词,1>
for (String word : words) {
// 将单词作为key,将次数1作为value,以便于后续的数据分发,可以根据单词分发,以便于相同单词会到相同的reduce task
context.write(new Text(word), new IntWritable(1));
}
}
}
(2)定义一个reducer类
package cn.lxk.bigdata.mr.wcdemo;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/**
* KEYIN, VALUEIN 对应 mapper输出的KEYOUT,VALUEOUT类型对应
*
* KEYOUT, VALUEOUT 是自定义reduce逻辑处理结果的输出数据类型 KEYOUT是单词 VLAUEOUT是总次数
*
* @author
*
*/
public class WordCountReducer extends Reducer {
/**
*
*
* 入参key,是一组相同单词kv对的key
*/
@Override
protected void reduce(Text key, Iterable values, Context context)
throws IOException, InterruptedException {
int count = 0;
/*
* Iterator iterator = values.iterator();
* while(iterator.hasNext()){ count += iterator.next().get(); }
*/
for (IntWritable value : values) {
count += value.get();
}
context.write(key, new IntWritable(count));
}
}
(3)定义一个主类,用来描述job并提交job
package cn.lxk.bigdata.mr.wcdemo;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
* 相当于一个yarn集群的客户端 需要在此封装我们的mr程序的相关运行参数,指定jar包 最后提交给yarn
*
* @author
*
*/
public class WordCountRunner {
// 把业务逻辑相关的信息(哪个是mapper,哪个是reducer,要处理的数据在哪里,输出的结果放哪里。。。。。。)描述成一个job对象
// 把这个描述好的job提交给集群去运行
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job wcjob = Job.getInstance(conf);
// 指定我这个job所在的jar包
// wcjob.setJar("/home/hadoop/wordcount.jar");
wcjob.setJarByClass(WordCountRunner.class);
wcjob.setMapperClass(WordCountMapper.class);
wcjob.setReducerClass(WordCountReducer.class);
// 设置我们的业务逻辑Mapper类的输出key和value的数据类型
wcjob.setMapOutputKeyClass(Text.class);
wcjob.setMapOutputValueClass(IntWritable.class);
// 设置我们的业务逻辑Reducer类的输出key和value的数据类型
wcjob.setOutputKeyClass(Text.class);
wcjob.setOutputValueClass(IntWritable.class);
// 指定要处理的数据所在的位置
FileInputFormat.setInputPaths(wcjob, "hdfs://node02:9000/wordcount/input/test.txt");
// 指定处理完成之后的结果所保存的位置
FileOutputFormat.setOutputPath(wcjob, new Path("hdfs://node02:9000/wordcount/output/"));
// 向yarn集群提交这个job
boolean res = wcjob.waitForCompletion(true);
System.exit(res ? 0 : 1);
}
}
将程序打包
准备输入数据
Hello tom Hello jim Hello ketty Hello world Ketty tom |
vi /home/hadoop/test.txt
cd
在hdfs上创建输入数据文件夹:
hdfs dfs -mkdir -p /wordcount/input
将words.txt上传到hdfs上
hdfs dfs -put test.txt /wordcount/input
将程序jar包上传到集群的任意一台服务器上
使用命令启动执行wordcount程序jar包 :hadoop jar
$ hadoop jar wordcount.jar cn.lxk.bigdata.mr.wcdemo.WordCountRunner /wordcount/input /wordcount/out
查看执行结果
$ hadoop fs -cat /wordcount/output/part-r-00000