A. HDFS(分布式文件系统)java
B. YARN(运算资源调度系统)node
C. MAPREDUCE(分布式运算编程框架)python
HADOOP最先起源于Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增长,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。mysql
2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案。jquery
——分布式文件系统(GFS),可用于处理海量网页的存储nginx
——分布式计算框架MAPREDUCE,可用于处理海量网页的索引计算问题。web
云计算是分布式计算、并行计算、网格计算、多核计算、网络存储、虚拟化、负载均衡等传统计算机技术和互联网技术融合发展的产物。借助IaaS(基础设施即服务)、PaaS(平台即服务)、SaaS(软件即服务)等业务模式,把强大的计算能力提供给终端用户。ajax
现阶段,云计算的两大底层支撑技术为“虚拟化”和“大数据技术”算法
而HADOOP则是云计算的PaaS层的解决方案之一,并不等同于PaaS,更不等同于云计算自己。sql
一、HADOOP应用于数据服务基础平台建设
2/HADOOP用于用户画像
三、HADOOP用于网站点击流日志数据挖掘
一、 HADOOP就业总体状况
A. 大数据产业已归入国家十三五规划
B. 各大城市都在进行智慧城市项目建设,而智慧城市的根基就是大数据综合平台
C. 互联网时代数据的种类,增加都呈现爆发式增加,各行业对数据的价值日益重视
D. 相对于传统JAVAEE技术领域来讲,大数据领域的人才相对稀缺
E. 随着现代社会的发展,数据处理和数据挖掘的重要性只会增不会减,所以,大数据技术是一个尚在蓬勃发展且具备长远前景的领域
二、 HADOOP就业职位要求
大数据是个复合专业,包括应用开发、软件平台、算法、数据挖掘等,所以,大数据技术领域的就业选择是多样的,但就HADOOP而言,一般都须要具有如下技能或知识:
A. HADOOP分布式集群的平台搭建
B. HADOOP分布式文件系统HDFS的原理理解及使用
C. HADOOP分布式运算框架MAPREDUCE的原理理解及编程
D. Hive数据仓库工具的熟练应用
E. Flume、sqoop、oozie等辅助工具的熟练使用
F. Shell/python等脚本语言的开发能力
三、 HADOOP相关职位的薪资水平
大数据技术或具体到HADOOP的就业需求目前主要集中在北上广深一线城市,薪资待遇广泛高于传统JAVAEE开发人员,以北京为例:
1.6 HADOOP生态圈以及各组成部分的简介
重点组件:
HDFS:分布式文件系统
MAPREDUCE:分布式运算程序开发框架
HIVE:基于大数据技术(文件系统+运算框架)的SQL数据仓库工具
HBASE:基于HADOOP的分布式海量数据库
ZOOKEEPER:分布式协调服务基础组件
Mahout:基于mapreduce/spark/flink等分布式运算框架的机器学习算法库
Oozie:工做流调度框架
Sqoop:数据导入导出工具
Flume:日志数据采集框架
注:因为大数据技术领域的各种技术框架基本上都是分布式系统,所以,理解hadoop、storm、spark等技术框架,都须要具有基本的分布式系统概念
该软件系统会划分红多个子系统或模块,各自运行在不一样的机器上,子系统或模块之间经过网络通讯进行协做,实现最终的总体功能
好比分布式操做系统、分布式程序设计语言及其编译(解释)系统、分布式文件系统和分布式数据库系统等。
A. 一个solrcloud集群一般有多台solr服务器
B. 每个solr服务器节点负责存储整个索引库的若干个shard(数据分片)
C. 每个shard又有多台服务器存放若干个副本互为主备用
D. 索引的创建和查询会在整个集群的各个节点上并发执行
E. solrcloud集群做为总体对外服务,而其内部细节可对客户端透明
总结:利用多个节点共同协做完成一项或多项具体业务功能的系统就是分布式系统。
需求:能够实现由主节点将运算任务发往从节点,并将各从节点上的任务启动;
程序清单:
AppMaster
AppSlave/APPSlaveThread
Task
程序运行逻辑流程:
注:本环节主要感觉数据分析系统的宏观概念及处理流程,初步理解hadoop等框架在其中的应用环节,不用过于关注代码细节
一个应用普遍的数据分析系统:“web日志数据挖掘”
“网站或APP点击流日志数据挖掘系统”。
“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彻底不一样,后续课程都会一一讲解:
1) 数据采集:定制开发采集程序,或使用开源框架FLUME
2) 数据预处理:定制开发mapreduce程序运行于hadoop集群
3) 数据仓库技术:基于hadoop之上的Hive
4) 数据导出:基于hadoop的sqoop数据导入导出工具
5) 数据可视化:定制开发web程序或使用kettle等产品
6) 整个过程的流程调度:hadoop生态圈中的oozie工具或其余相似开源产品
a) Mapreudce程序运行
b) 在Hive中查询数据
c) 将统计结果导入mysql
./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
(那mapreduce是什么呢?它实际上是一个应用程序开发包)
本集群搭建案例,以5节点为例进行搭建,角色分配以下:
节点 | 角色
---| ---
hdp-node-01 | NameNode SecondaryNameNode
hdp-node-02 | ResourceManager
hdp-node-03 | DataNode NodeManager
hdp-node-04 | DataNode NodeManager
hdp-node-05 | DataNode NodeManager
部署图以下:
4.1.2服务器准备
本案例使用虚拟机服务器来搭建HADOOP集群,所用软件及版本:
4.1.3网络环境准备
4.1.5 Jdk环境安装
4.1.6 HADOOP安装部署
# The java implementation to use. export JAVA_HOME=/home/hadoop/apps/jdk1.7.0_51
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hdp-node-01:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/HADOOP/apps/hadoop-2.6.1/tmp</value> </property> </configuration>
<configuration> <property> <name>dfs.namenode.name.dir</name> <value>/home/hadoop/data/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop/data/data</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.secondary.http.address</name> <value>hdp-node-01:50090</value> </property> </configuration>
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop01</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
hdp-node-01 hdp-node-02 hdp-node-03
bin/hadoop namenode -format
sbin/start-dfs.sh
sbin/start-yarn.sh
从本地上传一个文本文件到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
在HADOOP安装目录下,运行一个示例mr程序
cd $HADOOP_HOME/share/hadoop/mapreduce/ hadoop jar mapredcue-example-2.6.1.jar wordcount /wordcount/input /wordcount/output
命令: hdfs dfsadmin –report
能够看出,集群共有3个datanode可用
也可打开web控制台查看HDFS集群信息,在浏览器打开http://hdp-node-01:50070/
查看HDFS中的目录信息
命令: hadoop fs –ls /
上传文件
命令: hadoop fs -put ./ scala-2.10.6.tgz to /
从HDFS下载文件
命令: hadoop fs -get /yarn-site.xml
mapreduce是hadoop中的分布式运算编程框架,只要按照其编程规范,只须要编写少许的业务逻辑代码便可实现一个强大的海量数据并发处理程序
一、需求
从大量(好比T级别)文本文件中,统计出每个单词出现的总次数
二、mapreduce实现思路
Map阶段:
a) 从HDFS的源数据文件中逐行读取数据
b) 将每一行数据切分出单词
c) 为每个单词构造一个键值对(单词,1)
d) 将键值对发送给reduce
Reduce阶段:
a) 接收map阶段输出的单词键值对
b) 将相同单词的键值对汇聚成一组
c) 对每一组,遍历组中的全部“值”,累加求和,即获得每个单词的总次数
d) 将(单词,总次数)输出到HDFS的文件中
四、 具体编码实现
(1)定义一个mapper类
//首先要定义四个泛型的类型 //keyin: LongWritable valuein: Text //keyout: Text valueout:IntWritable public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ //map方法的生命周期: 框架每传一行数据就被调用一次 //key : 这一行的起始点在文件中的偏移量 //value: 这一行的内容 @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //拿到一行数据转换为string String line = value.toString(); //将这一行切分出各个单词 String[] words = line.split(" "); //遍历数组,输出<单词,1> for(String word:words){ context.write(new Text(word), new IntWritable(1)); } } }
(2)定义一个reducer类
//生命周期:框架每传递进来一个kv 组,reduce方法被调用一次 @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { //定义一个计数器 int count = 0; //遍历这一组kv的全部v,累加到count中 for(IntWritable value:values){ count += value.get(); } context.write(key, new IntWritable(count)); } }
(3)定义一个主类,用来描述job并提交job
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://hdp-server01:9000/wordcount/data/big.txt"); //指定处理完成以后的结果所保存的位置 FileOutputFormat.setOutputPath(wcjob, new Path("hdfs://hdp-server01:9000/wordcount/output/")); //向yarn集群提交这个job boolean res = wcjob.waitForCompletion(true); System.exit(res?0:1); }
++vi /home/hadoop/test.txt++
Hello tom Hello jim Hello ketty Hello world Ketty tom
在hdfs上建立输入数据文件夹:
hadoop fs mkdir -p /wordcount/input
将words.txt上传到hdfs上
hadoop fs –put /home/hadoop/words.txt /wordcount/input
将程序jar包上传到集群的任意一台服务器上
使用命令启动执行wordcount程序jar包
$ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver /wordcount/input /wordcount/out
查看执行结果
$ hadoop fs –cat /wordcount/out/part-r-00000