【Hadoop 复习笔记】hadoop入门,
一、Hadoop背景
Hadoop最早起源于Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。
2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案。
——分布式文件系统(GFS),可用于处理海量网页的存储
——分布式计算框架MAPREDUCE,可用于处理海量网页的索引计算问题。
Nutch的开发人员完成了相应的开源实现HDFS和MAPREDUCE,并从Nutch中剥离成为独立项目HADOOP,到2008年1月,HADOOP成为Apache顶级项目,迎来了它的快速发展期。
1、Hadoop是apache旗下的一套开源平台
2、Hadoop提供的功能,利用服务器集群,根据用户自定义的业务逻辑,对海量数据进行分布式处理
3、Hadoop的核心组件有:
HDFS:分布式文件系统,解决海量数据存储
YARN:作业调度和集群资源调度系统,
MapReduce:分布式运算编程框架,解决海量数据计算
4、广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈
HDFS:分布式文件系统
MapReduce:分布式运算程序开发框架
Hive:基于 Hadoop 的分布式数据仓库,提供基于 SQL 的查询数据操作
HBase:基于 Hadoop 的分布式海量数据库
ZooKeeper:分布式协调服务基础组件
Mahout:基于 mapreduce/spark/flink 等分布式运算框架的机器学习算法库
Oozie:工作流调度框架
Sqoop:数据导入导出工具(比如用于 mysql 和 HDFS 之间)
Flume:日志数据采集框架
Impala: 基于 Hadoop 的实时分析
二、分布式系统
由于大数据技术领域的各类技术框架基本上都是分布式系统,因此,理解hadoop、storm、spark等技术框架,都需要具备基本的分布式系统概念。
三、离线数据分析流程
主要感受数据分析系统的宏观概念及处理流程,初步理解hadoop等框架在其中的应用环节,不用过于关注代码细节。
1、一个应用广泛的数据分析系统:“web日志数据挖掘”——网站或APP点击流日志数据挖掘系统
2、典型的BI系统开发流程
前提是处理海量数据,流程中各环节所使用的技术则跟传统BI完全不同,主要包括:
- 数据采集:定制开发采集程序,或使用开源框架FLUME
- 数据预处理:定制开发mapreduce程序运行于hadoop集群
- 数据仓库技术:基于hadoop之上的Hive
- 数据导出:基于hadoop的sqoop数据导入导出工具
- 数据可视化:定制开发web程序或使用kettle等产品
- 整个过程的流程调度:hadoop生态圈中的oozie工具或其他类似开源产
3、主要的技术架构
四、集群搭建
1、Hadoop集群搭建
HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起
HDFS集群:负责海量数据的存储,集群中的角色主要有 NameNode / DataNode
YARN集群:负责海量数据运算时的资源调度,集群中的角色主要有 ResourceManager /NodeManager
本集群搭建案例,以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 |
部署图如下:
2、服务器准备、环境准备、系统设置
本案例使用虚拟机服务器来搭建HADOOP集群,所用软件及版本:
- Vmware 11.0
- Centos 6.5 64bit
- 采用NAT方式联网
- 网关地址:192.168.33.1
- 3个服务器节点IP地址:192.168.33.101、192.168.33.102、192.168.33.103
- 子网掩码:255.255.255.0
- 添加HADOOP用户
- 为HADOOP用户分配sudoer权限
- 同步时间
- 设置主机名
- 配置内网域名映射:
- 配置ssh免密登陆
- 配置防火墙
- 上传jdk安装包
- 规划安装目录 /home/hadoop/apps/jdk_1.7.65
- 解压安装包
- 配置环境变量 /etc/profile
3、Hadoop安装部署
- 上传HADOOP安装包
- 规划安装目录 /home/hadoop/apps/hadoop-2.6.1
- 解压安装包
- 修改配置文件 $HADOOP_HOME/etc/hadoop/
最简化配置如下:
vi hadoop-env.sh
# The java implementation to use.
export JAVA_HOME=/home/hadoop/apps/jdk1.7.0_51
vi core-site.xml
<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>
vi hdfs-site.xml
<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>
vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
vi yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
vi salves
hdp-node-01
hdp-node-02
hdp-node-03
初始化HDFS
bin/hadoop namenode -format
启动HDFS
sbin/start-dfs.sh
启动YARN
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
运行一个mapreduce程序
在HADOOP安装目录下,运行一个示例mr程序
cd $HADOOP_HOME/share/hadoop/mapreduce/
hadoop jar mapredcue-example-2.6.1.jar wordcount /wordcount/input /wordcount/output
查看集群状态
hdfs dfsadmin –report
查看HDFS中的目录信息
hadoop fs –ls /
上传文件
hadoop fs -put ./ scala-2.10.6.tgz to /
从HDFS下载文件
hadoop fs -get /yarn-site.xml
4、MapReduce使用
MapReduce是Hadoop中的分布式运算编程框架,只要按照其编程规范,只需要编写少量的业务逻辑代码即可实现一个强大的海量数据并发处理程序。
从大量(比如T级别)文本文件中,统计出每一个单词出现的总次数,MapReduce实现思路
Map阶段:
- 从HDFS的源数据文件中逐行读取数据
- 将每一行数据切分出单词
- 为每一个单词构造一个键值对(单词,1)
- 将键值对发送给reduce
Reduce阶段:
- 接收map阶段输出的单词键值对
- 将相同单词的键值对汇聚成一组
- 对每一组,遍历组中的所有“值”,累加求和,即得到每一个单词的总次数
- 将(单词,总次数)输出到HDFS的文件中
定义一个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));
}
}
}
定义一个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));
}
}
定义一个主类,用来描述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