后面的Hive 等框架都是依托Hadoop.
入门第一个月拼命学习,扛下来就能成功。
RecourseManager 是整个资源集群的老大,
Nodemanager 单个节点资源老大 单个节点就是单个服务器 单个电脑。
数据传输层:
Sqoop 是专门导入数据库的数据
Flume 专门读写文件日志
数据存储层:
最主流:HDFS 文件存储
HBase 非关系数据库 利用 KV键值对进行存储。
Kaflka 消息队列 也能存储数据。
资源管理层:
有了数据,分析数据需要资源:内存、CPU、磁盘 那么由YARN来负责调度。
数据计算层:
分离线和在线计算,
离线计算:
有MapReduce离线计算 和 Spark Core 内存计算。现在新出了一个Flink???
在MapReduce基础上有两个开发工具Hive进行数据查询,利用SQL语句。
前两者是离线的 都是将日 月 年的数据收集好 然后开始进行计算。
Spark Core 还可以进行实时计算 (主流)
在线计算:
Storm 实时计算,在走下坡路
Spark Streaming 实时计算 实际通过批处理操作进行准实时计算。(主流)
任务调度层
服务器的IP地址要设置成固定的,首先输入命令:
vim /etc/udev/rules.d/70-persistent-net.rules
第二件事:
将 eth1 改成 eth0
第三件事:将划线部分复制:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
进去4件事
第一件把刚才复制的粘贴到 HWADDR= 后面
第二件把 ONBOOT 改为yes
第三件 把 BOOTPROTO 改成static
第四件 把IP地址 网关 DNS1 添加
第一点注意 网关GATEWAY 要和下图网关IP一致 DNS1要和网关GATEWAY保持一致
第二点注意 IPADDP=192.168.157.132 的前三个字段一定要和下面两个地方一致:
第一个地方:如下图 子网IP 前三个字段一样:192.168.157
第二个地方:IP的前三个字段一样。我的是自动获取 有点问题不知如何解决
此外IP的第四个字段132不能和网关IP的第四个字段相同。
修改后然后开始修改主机名 继续输入命令:
vim /etc/sysconfig/network
然后输入命令,建立主机名和IP地址之间的映射:
vim /etc/hosts
是否建立好IP 和主机名对应 没有的话按照下图画圈建立,在集群中,假设有102 103 104 服务器,在每个节点都要保存102 103 104主机名和IP地址之间的映射。然后保存退出
都好后 重启虚拟机 reboot
然后ifconfig 看IP地址是否修改好。
网络配置好后,新建一个BW用户和用户组:注意这是在102创建BW用户和用户组,等102环境全部配置好以后,克隆出103 104 ,这两个节点上也拥有BW用户和用户组
然后设置密码:
随后登录Xshell
然后输入:
vim /etc/sudoers
然后在root下面添加:划线行
然后 exit 退出root
到此虚拟机准备全部完成。
(1)在/opt目录下创建module、software文件夹
software 文件夹存放所有的jar包
module 文件夹 存放jar包解析后存放的位置。
用BW用户 cd 到opt 然后创建文件夹 发现权限不够 发现opt 属于root 肯定不行。
重新进入opt 目录 使用 sudo 命令创建 输入密码后创建成功
然后创建module文件夹
(2)修改module、software文件夹的所有者cd
发现创建者还是root 下面更改权限
(3)将JDK导入到opt目录下面的software文件夹下面
拷贝完成:
(4) 在Linux系统下的opt目录中查看软件包是否导入成功
下面安装jdk
安装两个jdk教程,不知道是否有用
(5)解压JDK到/opt/module目录下
sudo vim /etc/profile
到最后一行 输入划线内容 保存退出。
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
然后就可以了。
cd /opt/software/
tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/
[atguigu@hadoop101 hadoop-2.7.2]$ pwd
/opt/module/hadoop-2.7.2
(2)打开/etc/profile文件
[atguigu@hadoop101 hadoop-2.7.2]$ sudo vi /etc/profile
(3) 在profile文件末尾添加JDK路径:(shitf+g)
##HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
(1)bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本
(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
(4)sbin目录:存放启动或停止Hadoop相关服务的脚本
(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例
统计单词的个数
[atguigu@hadoop101 hadoop-2.7.2]$ mkdir wcinput
[atguigu@hadoop101 hadoop-2.7.2]$ cd wcinput
[atguigu@hadoop101 wcinput]$ touch wc.input
[atguigu@hadoop101 wcinput]$ vi wc.input
在文件中输入如下内容
hadoop yarn
hadoop mapreduce
atguigu
atguigu
保存退出::wq
[atguigu@hadoop101 hadoop-2.7.2]$ hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput
[atguigu@hadoop101 hadoop-2.7.2]$ cat wcoutput/part-r-00000
atguigu 2
hadoop 2
mapreduce 1
yarn 1
所有的配置都是按照完全分布式来的 但是只有一台服务器。
首先进行配置集群:
(a)配置 /core-site.xml
首先进入 /opt/module/hadoop-2.7.2 这个目录
然后输入命令:进入配置文件
vim etc/hadoop/core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
默认的是file:/// file 相当于一个本地的文件系统,所以路径都是本地的 什么是本地的:就是在下图的目录下
如果是hdfs 那么路径就变了 用的是两套不同的协议。
配置的是NameNode的地址
运行时产生的临时数据用的
默认是啥: 是将文件存放在/tmp下 以后很多的数据默认都是存放在/tmp 路径下 但是这里我们修改到上图所示的路径
(b)配置 hadoop-env.sh
只要遇到env文件 都要修改JAVA路径
export JAVA_HOME=/opt/module/jdk1.8.0_144
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
(a)格式化NameNode(第一次启动时格式化,以后就不要总格式化)
输入以下命令:
bin/hdfs namenode -format
格式化完成
第一次格式化一定不会出错,但是以后格式化很容易出错 按照下面三个步骤走:
第一步 关掉进程 第二步将data和logs文件夹还是里面的数据删除?,第三步再格式化
思考:为什么不能一直格式化NameNode,格式化NameNode,要注意什么?
(b)启动NameNode
所有的启动命令都在 sbin目录下,输入以下指令:
sbin/hadoop-daemon.sh start namenode
jps
sbin/hadoop-daemon.sh start datanode
web端查看HDFS文件系统
在浏览器输入:
192.168.186.132:50070
解释:
192.168.186.132 是IP地址
如果打不开,解决方案
注意:如果不能查看,看如下帖子处理
本机是关闭防火墙可以打开网页
类似于Linux的根目录系统。
可以在/ 目录下创建目录 使用命令:
其中 bin/hdfs dfs 是固定的 后面跟命令
(a)在HDFS文件系统上创建一个input文件夹
接下来将本地的文件上传到HDFS文件系统
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -mkdir -p /user/atguigu/input
(b)将测试文件内容上传到文件系统上
[atguigu@hadoop101 hadoop-2.7.2]$bin/hdfs dfs -put wcinput/wc.input /user/atguigu/input/
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -ls /user/atguigu/input/
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -cat /user/atguigu/ input/wc.input
或者在网页查看
Block Size 128M 最大的容量 目前使用了73B
(d)运行MapReduce程序
至此 所有的配置完成 下面运行程序
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input/ /user/atguigu/output
此时输入输出用的是HDFS的文件路径 注意output文件夹一定不能提前存在 不然会报错。
(e)查看输出结果
命令行查看:
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -cat /user/atguigu/output/*
[atguigu@hadoop101 hadoop-2.7.2]$ hdfs dfs -get /user/atguigu/output/part-r-00000 ./wcoutput/
(g)删除输出结果
[atguigu@hadoop101 hadoop-2.7.2]$ hdfs dfs -rm -r /user/atguigu/output
日志要经常查看 有助于debug
说明:在企业中遇到Bug时,经常根据日志提示信息去分析问题、解决Bug。
(a)配置yarn-env.sh
首先到该目录下
如果之前退出了要重新启动 namenode 和 datanode
进入etc/hadoop 目录 打开配置文件:
将$JAVA_HOME 路径复制
export JAVA_HOME=/opt/module/jdk1.8.0_144
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop02</value>
</property>
修改配置文件:
进入:
改完:
(c)配置:mapred-env.sh
改完:
(d)配置: (对mapred-site.xml.template重新命名为) mapred-site.xml
重命名:
[atguigu@hadoop101 hadoop]$ mv mapred-site.xml.template mapred-site.xml
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
我们制定在yarn上运行
先进去修改
修改后:
至此所有配置文件全部完成。接下来要启动集群
(a)启动前必须保证NameNode和DataNode已经启动
(b)启动ResourceManager
启动命令都在 sbin/ 目录下
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
(a)YARN的浏览器页面查看
然后操作集群 在浏览器输入:
192.168.186.132:8088
总结:50070 查看HDFS
8088 查看 MapReduce
(b)删除文件系统上的output文件
下面运行一个程序 先把输出文件删除:
[atguigu@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -rm -R /user/atguigu/output
本机:
bin/hdfs dfs -rm -r /user/BW2/output
输入命令:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/BW2/input /user/BW2/output
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
[atguigu@hadoop101 hadoop]$ vi mapred-site.xml
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop02:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop02:19888</value>
</property>
sbin/mr-jobhistory-daemon.sh start historyserver
[atguigu@hadoop101 hadoop-2.7.2]$ jps
然后查看:
点这里没反应?????没有配置好
但是输入:可以打开
http://192.168.186.132:19888/jobhistory
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
开启日志聚集功能具体步骤如下:
第一步: 关闭NodeManager 、ResourceManager和HistoryManager
第二步:配置yarn-site.xml
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
默认:关闭 所以要开启
604800 是604800秒 正好是7天
改完:
第三步: 刚才停掉的三个进程都重新启动:
然后再运行下Wordcount 程序
首先 删除输出文件夹output
然后运行
然后查看日志:
输入:
http://192.168.186.132:19888/jobhistory
完成。
分析:
1)准备3台客户机(关闭防火墙、静态ip、主机名称)
克隆CentOS01 不是克隆CentOS101 !!! 克隆之前一定要在01 上创建用户BW
三台机器都搞好
(3)案例实操
(a)在hadoop101上,将hadoop101中/opt/module目录下的软件拷贝到hadoop102 103 104上。
一定不要忘了: 号!!!!,并且:和/ 之间不能有空格!!!!!
复制完
注意:拷贝过来的/opt/module目录,别忘了在hadoop102、hadoop103、hadoop104上修改所有文件的,所有者和所有者组。sudo chown BW:BW -R /opt/module
然后修改module的权限。
然后将101的配置文件传到102 103 104上。
将hadoop101中/etc/profile文件拷贝到hadoop102的/etc/profile上。
[atguigu@hadoop101 ~]$ sudo scp /etc/profile root@hadoop102:/etc/profile
将hadoop101中/etc/profile文件拷贝到hadoop103的/etc/profile上。
[atguigu@hadoop101 ~]$ sudo scp /etc/profile root@hadoop103:/etc/profile
将hadoop101中/etc/profile文件拷贝到hadoop104的/etc/profile上。
[atguigu@hadoop101 ~]$ sudo scp /etc/profile root@hadoop104:/etc/profile
注意:拷贝过来的配置文件别忘了source一下/etc/profile
(a)在/home/BW目录下创建bin目录,并在bin目录下xsync创建文件,文件内容如下:
[atguigu@hadoop102 ~]$ mkdir bin
[atguigu@hadoop102 ~]$ cd bin/
[atguigu@hadoop102 bin]$ touch xsync
[atguigu@hadoop102 bin]$ vi xsync
在该文件中编写如下代码
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=103; host<105; host++)); do
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
(b)修改脚本 xsync 具有执行权限
[atguigu@hadoop102 bin]$ chmod 777 xsync
(c)调用脚本形式:xsync 文件名称
[atguigu@hadoop102 bin]$ xsync /home/atguigu/bin
注意:如果将xsync放到/home/atguigu/bin目录下仍然不能实现全局使用,可以将xsync移动到/usr/local/bin目录下。
NameNode 和 SecondaryNameNode 占用内存一比一 所以不能放到同一个节点上。
ResourceManager 是整个资源的老大 必须避开NameNode 和 SecondaryNameNode,所以只能配置到Hadoop04上。
配置core-site.xml
在102上配置:
[atguigu@hadoop102 hadoop]$ vi core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
配置hdfs-site.xml
[atguigu@hadoop102 hadoop]$ vi hdfs-site.xml
在该文件中编写如下配置
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop05:50090</value>
</property>
配置yarn-site.xml
[atguigu@hadoop102 hadoop]$ cp mapred-site.xml.template mapred-site.xml
[atguigu@hadoop102 hadoop]$ vi mapred-site.xml
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
[atguigu@hadoop102 hadoop]$ xsync /opt/module/hadoop-2.7.2/
[atguigu@hadoop103 hadoop]$ cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
都配置好后 要开始单点启动了
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop namenode -format
回到该目录下:
将data 和logs文件夹删除。
现在将102的删除了 同时将103 104的按照上述步骤删除。
然后回到102上 输入:
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop-daemon.sh start namenode
[atguigu@hadoop102 hadoop-2.7.2]$ jps
3461 NameNode
然后启动102上的namenode 和datanode
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop-daemon.sh start datanode
[atguigu@hadoop102 hadoop-2.7.2]$ jps
3461 NameNode
3608 Jps
3561 DataNode
[atguigu@hadoop103 hadoop-2.7.2]$ hadoop-daemon.sh start datanode
[atguigu@hadoop103 hadoop-2.7.2]$ jps
3190 DataNode
3279 Jps
[atguigu@hadoop104 hadoop-2.7.2]$ hadoop-daemon.sh start datanode
[atguigu@hadoop104 hadoop-2.7.2]$ jps
3237 Jps
3163 DataNode
然后启动103和104的DataNode (注意:103和104没有namenode)
至此102103 104 的namenode和DataNode都启动完成。
单点启动比较麻烦。下面设置ssh无密登录配置。
问题 用BW3普通用户无法登录Hadoop04 但是可以切换到root用户登录Hadoop04???
进入家目录 发现有一个.ssh 进入 有一个known_hosts 文件 看一下是之前访问过的主机。
(2)生成公钥和私钥:
[atguigu@hadoop102 .ssh]$ ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
(3)将公钥拷贝到要免密登录的目标机器上
然后将公钥拷贝到103 104
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop102
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop103
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop104
在103 和104 里可以看到公钥
但是这时候访问自己还是需要输入密码 所以继续拷贝一份给自己:
为什么要设置102的免密登录 由于102上有namenode 它需要去04 和 05上去分发和通信。
同理:
103上也有resourcemanager 它也需要配置免密登录:
然后将其拷贝到102 103 104上:
然后在102 的root用户生成密钥拷贝给102 103 104
1. 配置slaves
首先进入该目录下 修改slaves文件:
/opt/module/hadoop-2.7.2/etc/hadoop/slaves
[atguigu@hadoop102 hadoop]$ vi slaves
[atguigu@hadoop102 hadoop]$ xsync slaves
发现:
都分发成功。
然后关闭03 04 05 的namenode 和 datanode
03:
04:
05:
2. 启动集群
(1)启动HDFS
然后直接启动hdfs 里面包含namenode 和datanode 输入:
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
[atguigu@hadoop102 hadoop-2.7.2]$ jps
4166 NameNode
4482 Jps
4263 DataNode
[atguigu@hadoop103 hadoop-2.7.2]$ jps
3218 DataNode
3288 Jps
[atguigu@hadoop104 hadoop-2.7.2]$ jps
3221 DataNode
3283 SecondaryNameNode
3364 Jps
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
HDFS启动完成 现在开始启动YARN
注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN。
坑:在102 104启动就挂了 只能必须在103上启动,因为resourcemanager在103上 输入:
集群群起至此全部完成!!!
集群基本测试
上传一个大文件:
之前遇到错误:上传后只有102 103有 104没有 查阅是由于104的防火墙没有关闭 :
实际的压缩包存在了data里面:还可以拼接
先重启服务:
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
配置时间同步具体实操:
(2)修改ntp配置文件
在末尾:
(3)修改/etc/sysconfig/ntpd 文件
SYNC_HWCLOCK=yes
(4)重新启动ntpd服务
102配置好了 下面配置103 104:
详细看笔记1 已经在本电脑成功编译好了Hadoop105