学习慕课网hadoop笔记
1.内容
google大数据技术
MapReduce
BigTable
GFS
hadoop 模仿谷歌
开源 分布式存储和分布式计算
包括两个核心组成
HDFS:分布式文件系统,存储海量的数据
MapReduce: 并行处理框架,实现任务分解和调度
可以 搭建大型数据仓库,PB级数据的存储、处理、分析、统计等业务
优势 高扩展、低成本、成熟生态圈
HIVE sql语句转为hadoop任务
Hbase与关系型数据库 放弃了事务特性追求更高扩展
与HDFS 提供了数据的随机读写和实时访问,实现对表数据的读写功能
zookeeper 监控集群每个节点的状态,管理节点间配置,维护数据一致性..
版本选择1.2
2.安装
准备
Linux环境,jdk,配置hadoop
jdk安装可以参考这里
hadoop安装使用wget
wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz
下载好后可以放到opt目录下
mv hadoop-1.2.1.tar.gz /opt/
解压缩
tar -zxvf hadoop-1.2.1.tar.gz
进入hadoop的conf目录下
有4个文件需要配置
mapred-site.xml
core-site.xml
hdfs-site.xml
hadoop-env.sh
修改第一个
hadoop-env.sh
打开注释,修改路径
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.144-0.b01.el7_4.x86_64
修改第二个 core-site.xml
在configuration节点下添加配置
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/hadoop/name</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
三个节点的意思为 工作目录;原数据目录;文件系统的本机访问;
修改第三个 hdfs-site.xml
在configuration节点下添加配置
<property>
<name>dfs.data.dir</name>
<value>/hadoop/data</value>
</property>
文件系统数据存放目录
修改第四个配置 mapred-site.xml
<property>
<name>mapred.job.tracker</name>
<value>iZ2zeehe7yj61ktgrt2d3eZ:9001</value>
</property>
任务调度器访问
最后配置hadoop路径
vim /etc/profile
添加
export HADOOP_HOME=/opt/hadoop-1.2.1
在export PATH后追加
$HADOOP_HOME/bin
整体如下
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$PATH
保存 刷新 (source /etc/profile
)
执行hadoop会有打印
先执行格式化操作
hadoop namenode -format
进入bin目录下
执行start-all.sh
需要输入两次主机密码
输入jps查看有哪些进程
如果有第二至五项,说明启动成功
3.HDFS基本概念
-块(Bolck)
NameNode
DataNode
HDFS的文件被分成块进行存储
块默认大小64MB
块是文件存储的逻辑单元
有两类节点 NameNode和DataNode
NameNode是管理节点,存放文件元数据,元数据包括两个部分
①文件与数据块的映射表
②数据块与数据节点的映射表
客户端先去读取元数据,看需要的数据在哪些数据块中,再去读取数据块,组装成文件返回
DataNode是HDFS的工作节点,存放数据块
数据管理策略
每个数据块3个副本,分布在两个机架内的三个节点
心跳检测
DataNode定期向NameNode发送心跳消息
二级NameNode(Secondary NameNode) 定期同步元数据映像文件和修改日志NameNode发生故障时,备胎转正
HDFS中文件读取流程
① 把文件名,路径告诉NameNode
②返回元数据,告诉客户端,文件包含哪些块,这些块哪哪些DataNode中可以找到
③客户端读取Blocks,组装
HDFS中文件写入流程
①文件拆分成Bolck,通知NameNode
②返回DataNodes
③客户端写入Blocks
④流水线赋值到其他DataNode
⑤更新元数据
HDFS特点
1.数据冗余,硬件容错
2.流式数据访问(一次写入多次读取)
3.存储大文件(小文件对NameNode压力大)
适合数据批量读写,吞吐量高
不适合交互式应用,低延迟很难满足
HDFS命令行操作演示
hadoop fs -ls /
把hdfs的文件夹打印出来
hadoop fs -put hadhoop-env.sh input/
存放文件hadhoop-env.sh 到 input目录下
fs -rm input
fs -rm hadoop-env.sh
移除目录和移除文件
bash hadoop fs -mkdir input
创建input目录
可以通过指令查看在哪里
查看文件名
查看文件
hadoop fs -cat input/hadoop-env.sh
从hadoop下载文件
hadoop fs -get input/hadoop-env.sh hadoop-env2.sh
查看详细信息
hadoop dfsadmin -report
4.MapReduce原理
并行计算框架
分而治之,一个大任务分成多个小的子任务(map),并行执行后,合并结果(reduce)
有1000副扑克牌,少了1张如何找出?
①把所有牌分成多组
②各自统计(map)
③数据交换
④再统计
⑤筛选结果
运行流程
Job&Task
JobTracker
JobTracker
一个job拆分成多个task
task又分为MapTask和ReduceTask
客户端提交任务给JobTracker(管理节点)
JobTracker把任务拆分成多个Map任务和Reduce任务
分发给TaskTracker(一般TaskTracker和HDFS的DataNode是同一个节点)和ReduceTaskTracker
JobTracker
作业调度
分配任务、监控任务执行进度
监控TaskTracker的状态
TaskTracker
执行任务
汇报任务状态
数据分片
分配Map任务,产生一些k,v数据,交给Reduce
Reduce归并 写回HDFS中
容错机制
1.重复执行
2.推测执行(任务执行过程中,TaskTracker比其他的慢,会新建一个TaskTracker执行,旧的和新的谁先执行完就停止另一个)
5.应用程序
(1)WordCount 单词计数
入门程序,计算文件中每个单词的频数,输入结果按字母顺序进行排序。
要求:
输入
hello world bye world
hello hadoop bye hadoop
byehadoop hello hadoop
输出
bye 3
hello 3
hadoop 4
world 2
Map过程
1. Hello World Bye World --Map--> <Hello,1><World,1><Bye,1><World,1>
2. Hello Hadoop Bye Hadoop --Map--> <Hello,1><Hadoop,1><Bye,1><Hadoop,1>
3. Bye Hadoop Hello Hadoop --Map--> <Bye,1><Hadoop,1><Hello,1><Hadoop,1>
Reduce
使用 WordCount.java代码
https://gitee.com/LCJA/codes/7retjm38qzgnvocb5hlx477#WordCount.java
对代码进行编译
javac -classpath /opt/hadoop-1.2.1/hadoop-cor
e-1.2.1.jar:/opt/hadoop-1.2.1/lib/commons-cli-1.2.jar -d word_count_class/ WordCount.java
打包代码
jar -cvf wordcount.jar *.class
创建input文件夹 创建文件file1,里面随便输入几个单词
创建文件file2,也随便输入几个单词
现在把文件提交到hdfs中
先创建文件夹
hadoop fs -mkdir input_wordcount
再放入
hadoop fs -put input/* input_wordcount/
表示把input下的所有文件 放到了input_wordcount中
现在开始提交任务
hadoop jar word_count_class/wordcount.jar WordCount input_wordcount output_wordcount
这里的output_wordcount不存在会自动创建
执行完成
查看有3个文件夹
结果在part-r-00000中
hadoop fs -cat output_wordcount/part-r-00000
WordCount代码解析(自己的理解,如有错误请指正)
代码包含2个内部类WordCountMap,WordCountReduce,
WordCountMap继承Mapper接口
设置输入格式<LongWritable, Text, Text, IntWritable>
顺序表示输入的k,v输出的k,v
map方法表示对输入文本进行读取,然后再对一行进行截断分词
每有一个单词进行记1处理
如 hello hadoop hello 记 hello 1 hadoop 1 hello 1
WordCountReduce类继承Reducer类<Text, IntWritable, Text, IntWritable>
顺序表示输入的k,v,输出的k,v
reduce方法中表示把结果进行累加
main方法表示指定job配置
设置各个类,指定输入输入路径等
(2)MapReduce排序
将数据分片,对数据标记
样例 file1 中有几个数字 file2也有几个数字
运行与之前的过程相同,结果
Sort的解析
Map类的map方法
读取每一行,将每行的数字转换为整数
放入key,value随便放
Reduce类的Reduce方法
取出数字每取出一个key ,linenum+1
主要方法为Partition(分区)
把Map任务完成后交给Reduce前进行分区
把最大值除以分区数,这样每个区是相同大小
将数字放入分区(这里的分区不是很明白)
Reduce合并分区就成拍好序的了