一:Hadoop
1 什么使hadoop
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序
Hadoop框架的核心设计:HDFS和MapReduce,一句话来说Hadoop就是存储加计算(HDFS为海量的数据提供了存储,而MapReduce为海量的数据提供了计算)
Hadoop由以下几个项目构成
1.1Hadoop框架的主要模块:
HDFS,Hadoop Distributed File System,Hadoop分布式文件系统
MapReduce,一个计算框架。它以分布式和并行的方式处理大量的数据。当你对所有年龄> 18的用户在上述1 GB文件上执行查询时,将会有“8个映射”函数并行运行,以在其128 MB拆分文件中提取年龄> 18的用户,然后reduce函数将运行以将所有单独的输出组合成单个最终结果
YARN,用于作业调度和集群资源管理的框架
Hadoop Common,Hadoop体系最底层的一个模块,为Hadoop各子项目提供各种工具,如:配置文件和日志操作等
1.2 什么是MapReduce:
Thinking:我们有1TB的数据,如何统计单词数?如何建立倒排索引?
这其实是很复杂的过程,如果有10TB,或者1PB数据怎么办呢?这时候单机就没办法做,变得很复杂需要想办法来解决。
Map的本质实际上是拆解,比如说有辆红色的小汽车,把它拆成零件了,这就是Map
Reduce 就是组合,我们有很多汽车零件,还有很多其他各种装置零件,把他们拼装成变形金刚,这就是Reduce
MapReduce的6个部分:
Input,
Split,
Map,
Shuffle,
Reduce,
Finalize
split过程,输入很多文档,文档的每一行有很多不同的单词,分割之后方便找不同的worker来进行处理
Shuffle,将map的输出作为reduce的输入的过程就是shuffle,通过Shuffle把数据拉过来之后,方便后续Reduce进行计算。
Shuffle的本意是打乱的意思,在MapReduce中,Shuffle是洗牌的逆过程,即将map端的无规则输出按指定的规则“打乱”成具有一定规则的数据,相同的Key必须发送到同一个Reduce端处理
Reduce,把相同的数据放一起,计数统计,比如Car有3个就写3,River是2个就写2
MapReduce:
Map,输入每一行的ID是key,这一行的单词是value。这样后面就可以统计每个单词出现的次数
Reduce,输入的还是各个单词,但后面是一个串,表示在里面出现的次数,比如1,1,1。sum的过程就是把value(这里是1)累计到一起
MapReduce可以帮我们统计关键词和它的出现次数
1.3 MapReduce架构:
Master Worker,作为用户的代理来协调整个过程,比如让第一个Worker去拿0号数据,另一个Worker拿1号数据等等 => 分配数据的过程
每个Map Worker会在本地把数据切分开吧,写到本地的缓存或者硬盘上
Master让Reduce Worker去拿数据,他们就会从Map Worker的本地拿到数据,然后做完Reduce将结果写到最终的文件里(Finalize)
2.1 什么是HDFS
HDFS:
Hadoop分布式文件系统(HDFS)是一种分布式文件系统,
HDFS具有高度容错能力,数据自动保存多个副本。如果一个副本丢失后,它可以自动分配到其它节点作为新的副本
可以部署在低成本硬件上,通过多副本机制,提高可靠性
数据规模:能够处理的数据规模可以达到GB,TB,甚至PB级别的数据
HDFS:
NameNode和DataNode是HDFS的两个主要组件
元数据存储在NameNode上,数据存储在DataNode的集群上
NameNode不仅要管理存储在HDFS上内容的元数据,而且要记录一些事情,比如哪些节点是集群的一部分,某个文件有几份副本等。它还要决定当集群的节点宕机或者数据副本丢失的时候系统需要做什么
存储在HDFS上的每份数据片有多份副本(replica)保存在不同的服务器上。
在本质上,NameNode是HDFS的Master(主服务器),DataNode是Slave(从服务器)
2.2 HDFS写过程
客户端发送写请求给NameNode,要将a.log文件写入到HDFS,执行流程:
Step1,客户端发消息给NameNode,说要将a.log写入
Step2,NameNode发消息给客户端,让客户端写到DataNode A、B和D,并直接联系DataNode B
Step3,客户端发消息给DataNode B,让它保存一份a.log文件,并且发送副本给DataNode A和DataNode D
Step4,DataNode B发消息给DataNode A,让它保存a.log,并且发送一份副本给DataNode D
Step5,DataNode A发消息给DataNode D,让它保存a.log
Step6,DataNode D发确认消息给DataNode A
Step7,DataNode A发确认消息给DataNode B
Step8,DataNode B发确认消息给客户端,表示写入完成
2.3HDFS读过程
客户端发送读请求给NameNode,想要读取a.log文件,具体的执行流程:
Step1,客户端询问NameNode它应该从哪里读取文件
Step2,NameNode发送数据块的信息给客户端。数据块信息包含了保存着文件副本的DataNode的IP地址,以及DataNode在本地硬盘查找数据块所需要的数据块ID
Step3,客户端检查数据块信息,联系相关的DataNode,请求数据块
Step4,DataNode返回文件内容给客户端,然后关闭连接,完成读操作
客户端并行从不同的DataNode中获取一个文件的数据块,然后联结这些数据块,拼成完整的文件
3:hadoop安装
Ubuntu1804 安装 hadoop2.10
下载地址:https://hadoop.apache.org/releases.html
选择二进制下载:
wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.10.0/hadoop-2.10.0.tar.gz
解压到/data/hadoop目录下:
mkdir /data/hadoop
tar -zxvf hadoop-2.10.0.tar.gz -C /data/hadoop/
进入到hadoop工作目录:
cd /data/hadoop/hadoop-2.10.0
bin :Hadoop 最基本的管理脚本和使用脚本所在目录,这些脚本是sbin目录下管理脚本的基础实现,用户可以直接使用这些脚本管理和使用Hadoop 。
etc :Hadoop 配置文件所在的目录,包括core-site.xml 、hdfs-site.xml 、mapred-site.xml 等从Hadoop 1.0 继承而来的配置文件和yarn-site.xml 等Hadoop 2.0 新增的配置文件。
include :对外提供的编程库头文件(具体动态库和静态库在lib 目录中),这些头文件均是用C++ 定义的,通常用于C++ 程序访问HDFS 或者编写MapReduce 程序。
lib :该目录包含了Hadoop 对外提供的编程动态库和静态库,与include目录中的头文件结合使用。
libexec :各个服务对应的shell 配置文件所在目录,可用于配置日志输出目录、启动参数(比如JVM 参数)等基本信息。
sbin :Hadoop 管理脚本所在目录,主要包含HDFS 和YARN 中各类服务的启动/ 关闭脚本。
share :Hadoop 各个模块编译后的jar 包所在目录
配置hadoop-master的hadoop环境变量:
vim /etc/profile
export HADOOP_HOME=/data/hadoop/hadoop-2.10.0
export PATH=$PATH:$HADOOP_HOME/bin
生效
source /etc/profile
3.1: 部署:
有3中安装部署方法:
单机安装部署
伪分布式安装部署
全分布式安装部署
我们进行伪分布式安装部署‘
3.2:安装java
conda install openjdk=8.0.152
java -version 查看版本
java -verbose 查看java包路径
配置 hadoop-env.sh文件:
vim etc/hadoop/hadoop-env.sh
#The java implementation to use.
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/mnt/d/miniconda3/envs/big_data/jre/
3.3:配置core-site.xml,执行vim etc/hadoop/core-site.xml命令,通过fs.defaultFS指定NameNode
fs.defaultFS
hdfs://localhost:9000
hadoop.tmp.dir
file:/usr/local/hadoop/tmp
Abase for other temporary directories.
3.4 配置hdfs.-site.xml,执行vim etc/hadoop/hdfs-site.xml:(各property的含义)
dfs.replication
1
dfs.namenode.name.dir
file:/usr/local/hadoop/tmp/dfs/name
dfs.datanode.data.dir
file:/usr/local/hadoop/tmp/dfs/data
3.5 配置mapred-site.xml,先复制mapred-site.xml.template为mapred-site.xml
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
然后修改mapred-site.xml,执行vim etc/hadoop/mapred-site.xml:
mapreduce.framework.name
yarn
3.6:配置yarn-site.xml,执行vim etc/hadoop/yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
启动集群
格式化HDFS文件系统
在master节点执行:
hadoop namenode -format
格式化namenode,第一次启动服务前执行的操作,以后不需要执行。
启动hadoop集群:
$ sbin/start-all.sh
检查是否启动成功 运行jps:
72 Jps
32137 DataNode
31931 NameNode
30510 ResourceManager
32382 SecondaryNameNode
浏览NameNode和JobTracker的网络接口,它们的地址默认为:
NameNode - http://localhost:50070/
JobTracker - http://localhost:50030/
3.7 启动错误一:
connect to host localhost port 22: Connection refused
ssh-keygen
cd ~/.ssh/
cat ./id_rsa.pub >> ./authorized_keys # 加入授权
sudo service ssh restart # 重新启动ssh服务
ssh localhost # 无需输入密码就可以直接登陆了
3.8:Error: JAVA_HOME is not set and could not be found
java 的环境没用配置好参考3.2