昨日内容概要
-
Hadoop环境准备
1.解压hadoop压缩包(2.X版本) 2.配置环境变量并重新加载 3.检测是否正常启动
-
Hadoop目录结构
bin 程序文件 etc 配置文件 share 说明文档 sbin 操作命令 readme 产品说明
-
Hadoop官网案例
1.grep过滤案例 hadoop jar share/.... grep 目标文件 输出位置 2.wordcount统计案例 hadoop jar share/.... word 目标文件 输出位置
-
异常情况
服务无法正常启动或者中途自动结束的情况 1.配置文件书写格式不到位 2.计算机硬件设备要求不够
-
伪分布式
分布式:将一个整体拆分成多个个体分撒在不同的机器上运行 伪分布式:用一台机器模拟多台机器的效果 完全分布式:真正的使用多台机器 说白了 在linux中所有的功能基本都是靠配置文件的形式来实现 hadoop/etc/hadoop2.X 配置文件常见后缀名 .xml .ini .conf 常见软件端口号 50070 # hadoop hdfs 8088 # hadoop yarn/mapreduce 3306 # MySQL 6379 # redis 27017 # mongodb
-
完全分布式
1.多台机器准备 2.文件拷贝 全量拷贝 scp 增量拷贝 rsync 3.如何高效管理多台机器 自定义内容分发脚本(shell语言) 1.脚本文件代码格式 2.修改文件权限chmod
今日内容概要
-
完全分布式环境搭建
可能会出现你们的机器无法操作的局面 不停的使用jps查看 哪个服务停了就去启动
-
配置集群
-
单点启动
一台台机器依次启动(效率低下 不推荐)
-
ssh配置
公钥私钥交互
-
群起配置
一台机器可以操作集群所有机器(实际工作推荐)
今日内容详细
完全分布式(开发重点)
1)准备 3台客户机
2)安装 JDK
3)配置环境变量
4)安装 Hadoop
5)配置环境变量
6)配置集群
7)单点启动
8)配置 ssh
9)群起并测试集群
详细:
1)准备 3台客户机(关闭防火墙、静态 ip、主机名称)
克隆机器修改主机名和主机IP地址
2)安装 JDK
利用scp命令拷贝数据文件至三个客户机
scp -r /opt/module root@hadoop102:/opt/module
scp -r /opt/module root@hadoop103:/opt/module
scp -r /opt/module root@hadoop104:/opt/module
"""
也可以在A机器将B机器文件拷贝给C机器
scp -r root@hadoop101:/opt/module root@hadoop103:/opt/module
"""
# 扩展:拷贝文件的命令有scp(全量拷贝)、rsync(增量拷贝)
"""
scp(全量拷贝)
scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
rsync(增量拷贝)
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
参数详解
r 递归
v 显示复制过程
l 拷贝符号连接
"""
3)配置环境变量
1.利用scp命令拷贝环境变量文件至三个客户机
scp /etc/profile root@hadoop102:/etc/profile
scp /etc/profile root@hadoop103:/etc/profile
scp /etc/profile root@hadoop104:/etc/profile
2.source文件配置
source /etc/profile
3.验证是否成功
java
4)扩展:集群分发脚本
复制文件到所有节点的相同目录下
1.在/usr/local/bin下创建sync文件并填写以下内容
[jason@hadoop102 ~]$ cd /usr/local/bin
[jason@hadoop102 bin]$ touch xsync
[jason@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
"""
2.修改权限
chmod 777 xsync
3.测试
在当前机器随便找一个其他机器没有的目录
xsync test/
5)集群配置
集群部署规划
hadoop102 hadoop103 hadoop104
HDFS NameNode/DataNode DataNode SecondaryNameNode/DataNode
YARN NodeManager ResourceManager/NodeManager NodeManager
'''在102上修改,然后用xsync脚本直接同步'''
1.配置 core-site.xml(修改主机名即可)
[jason@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>
"""
2.HDFS 配置文件
1.配置 hadoop-env.sh
[jason@hadoop102 hadoop]$ vi hadoop-env.sh
"""内容(有就不用改了)
export JAVA_HOME=/opt/module/jdk1.8.0_144
"""
2.配置 hdfs-site.xml(将伪分布式配置删除添加下列配置)
[jason@hadoop102 hadoop]$ vi hdfs-site.xml
"""内容
<!-- 指定 Hadoop 辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:50090</value>
</property>
"""
3.YARN 配置文件
1.配置 yarn-env.sh
[jason@hadoop102 hadoop]$ vi yarn-env.sh
"""内容(有就不用改了)
export JAVA_HOME=/opt/module/jdk1.8.0_144
"""
2.配置 yarn-site.xml(修改主机名即可)
[jason@hadoop102 hadoop]$ vi yarn-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>
"""
4.MapReduce 配置文件
1.配置 mapred-env.sh
[jason@hadoop102 hadoop]$ vi mapred-env.sh
"""内容(伪分布式配了就不用改了)
export JAVA_HOME=/opt/module/jdk1.8.0_144
"""
2.配置 mapred-site.xml(伪分布式配了就不用改了)
[jason@hadoop102 hadoop]$ cp mapred-site.xml.template mapred-site.xml
[jason@hadoop102 hadoop]$ vi mapred-site.xml
"""内容
<!-- 指定 MR 运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
"""
3.在集群上分发配置好的 Hadoop 配置文件
[jason@hadoop102 etc]$ xsync hadoop/
4.查看文件分发情况
[jason@hadoop103 hadoop]$ cat /opt/module/hadoop-
2.7.2/etc/hadoop/core-site.xml
集群单点启动
1.如果集群是第一次启动,需要格式化 NameNode(我们不是 因为前面弄了伪分布式)
[jason@hadoop102 hadoop-2.7.2]$ hadoop namenode -format
"""
如果集群不是第一次启动,需要删除data和logs目录
[jason@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/
[jason@hadoop103 hadoop-2.7.2]$ rm -rf data/ logs/
[jason@hadoop104 hadoop-2.7.2]$ rm -rf data/ logs/
"""
2.在 hadoop102 上启动 NameNode和DataNode
[jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
[jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
3.去103和104启动datanode(namenode就一个)
[jason@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
[jason@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
4.浏览器验证
hadoop102:50070
集群ssh配置
"""
上述单点启动的方式每次都一个一个节点启动
如果节点数量很多该如何解决
"""
# 公钥私钥工作原理
# 知识补充:查看know_hosts文件(访问过的主机地址)
[jason@hadoop102 ~]$ ll # 无法查看
[jason@hadoop102 ~]$ ls -al # 可以查看
[jason@hadoop102 ~]$ cd .ssh
[jason@hadoop102 .ssh]$ ll
[jason@hadoop102 .shh]$ cat known_hosts
# 生成公钥私钥
[jason@hadoop102 .ssh]$ ssh-keygen -t rsa # 连续回车即可
# 将102公钥拷贝到103和104
[jason@hadoop102 .shh]$ ssh-copy-id hadoop103
[jason@hadoop102 .shh]$ ssh-copy-id hadoop104
"""
hadoop103中的.ssh在拷贝前后文件是有变化的
hadoop104中的.ssh在拷贝前后文件是有变化的
"""
# 免密直接访问103和104
ssh hadoop103/hadoop104
# 自己用ssh访问自己也需要输入密码,可以采用相同措施解决
[jason@hadoop102 .shh]$ ssh-copy-id hadoop102
# 由于hadoop103上有一个resurcemanage所以也需要配置ssh
[jason@hadoop103 .ssh]$ ssh-keygen -t rsa
[jason@hadoop103 .shh]$ ssh-copy-id hadoop102
[jason@hadoop103 .shh]$ ssh-copy-id hadoop103
[jason@hadoop103 .shh]$ ssh-copy-id hadoop104
集群群起
1.配置
文件位置:/opt/module/hadoop-2.7.2/etc/hadoop/slaves
[jason@hadoop102 hadoop]$ vi slaves
"""内容(内容清空再添加)
hadoop102
hadoop103
hadoop104
"""
# 注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
2.同步所有节点配置文件
[jason@hadoop102 hadoop]$ xsync slaves
3.将之前单节点启动的datanode、namenode全部退出
[jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
[jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop namenode
[jason@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
[jason@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
4.启动HDFS
[jason@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
5.验证每个节点对于启动的服务
jps查看照着之前的表格比较不能出错
6.启动yarn(一定要在hadoop103上启动 因为rm在这里)
"""
这里需要将hadoop03的公钥分别发送给hadoop102、hadoop103、hadoop104
"""
[jason@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
7.验证每个节点对于启动的服务
jps查看照着之前的表格比较不能出错
集群测试
1.上传文件到集群
1.小文件
[jason@hadoop102 hadoop-2.7.2]$ bin/hdfs dfs -put wcinput/wc.input /
2.大文件
[jason@hadoop102 hadoop-2.7.2]$ bin/hdfs dfs -put /opt/software/hadoop-2.7.2.tar.gz /
3.浏览器界面测试
集群启动停止总结
1. 各个服务组件逐一启动/停止
(1)分别启动/停止 HDFS 组件
hadoop-daemon.sh start/stop namenode/datanode/ secondarynamenode
(2)启动/停止 YARN
yarn-daemon.sh start /stop resourcemanager/nodemanager
2. 各个模块分开启动/停止(配置 ssh 是前提)常用
(1)整体启动/停止 HDFS
start-dfs.sh/stop-dfs.sh
(2)整体启动/停止 YARN
start-yarn.sh/stop-yarn.sh
集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时 的同步,比如,每隔十分钟,同步一次时间
1. 时间服务器配置(必须 root 用户)
(1)检查 ntp 是否安装
[root@hadoop102 hadoop-2.7.2]# rpm -qa | grep ntp
(2)修改 ntp 配置文件
[root@hadoop102 hadoop-2.7.2]# vi /etc/ntp.conf
a)修改1(授权 192.168.1.0-192.168.1.255 网段上的所有机器可以从这台机器上查 询和同步时间)
# 解开注释
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
b)修改2(集群在局域网中,不使用其他互联网上的时间)
# 加上注释
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群 中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3)修改/etc/sysconfig/ntpd 文件
[root@hadoop102 hadoop-2.7.2]$ vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(4)重新启动 ntpd 服务
[root@hadoop102 桌面]$ service ntpd start
[root@hadoop102 桌面]$ service ntpd status
(5)设置 ntpd 服务开机启动
[root@hadoop102 桌面]$ chkconfig ntpd on
2. 其他机器配置(必须 root 用户)
分 时 日 月 周
(1)在其他机器配置 1 分钟与时间服务器同步一次
root@hadoop103 hadoop2-7.2]$ crontab -e
编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate hadoop102
(2)修改任意机器时间
[root@hadoop103 ~]$ date -s "2020-11-11 11:11:11"
(3)一分钟后查看机器是否与时间服务器同步
[root@hadoop103 ~]$ date
# 测试的时候可以将 10 分钟调整为 1 分钟,节省时间。
(4)主动同步时间
[root@hadoop103 root]$ /usr/sbin/ntpdate hadoop102
Hadoop源码编译
"""
我们从apche官网下载的hadoop包是32位的,如果我们需要将其编译成64位
可以在centos64位的环境下编译之后就会是64位并且在编译过程中还可以加入一些额外的功能
"""
1.前期准备工作
1.1.CentOS 联网
1.2.jar包准备(hadoop 源码、JDK8、maven、ant 、protobuf)
1)hadoop-2.7.2-src.tar.gz
2)jdk-8u144-linux-x64.tar.gz
3)apache-ant-1.9.9-bin.tar.gz(build 工具,打包用的)
4)apache-maven-3.0.5-bin.tar.gz
5)protobuf-2.5.0.tar.gz(序列化的框架)
2.jar包安装
2.1.JDK解压、配置环境变量 JAVA_HOME 和 PATH,验证 java-version(如下都需要验证是否配置成功)
[software] tar -zxf jdk-8u144-linux- x64.tar.gz -C /opt/module/
[software] vi /etc/profile
#JAVA_HOME:
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
[software] source /etc/profile
验证命令:java-version
2.2.Maven 解压、配置 MAVEN_HOME 和 PATH
[software] tar -zxvf apache-maven-3.0.5- bin.tar.gz -C /opt/module/
[apache-maven-3.0.5] vi conf/settings.xml
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf> <name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</ur l>
</mirror>
</mirrors>
[apache-maven-3.0.5] vi /etc/profile
#MAVEN_HOME
export MAVEN_HOME=/opt/module/apache-maven-3.0.5
export PATH=$PATH:$MAVEN_HOME/bin
[software] source /etc/profile
验证命令:mvn -version
2.3.ant 解压、配置 ANT _HOME 和 PATH
[software] tar -zxvf apache-ant-1.9.9- bin.tar.gz -C /opt/module/
[apache-ant-1.9.9] vi /etc/profile
#ANT_HOME
export ANT_HOME=/opt/module/apache-ant-1.9.9
export PATH=$PATH:$ANT_HOME/bin
[software] source /etc/profile
验证命令:ant -version
2.4.安装 glibc-headers 和 g++ 命令如下
[apache-ant-1.9.9] yum install glibc-headers
[apache-ant-1.9.9] yum install gcc-c++
2.5.安装 make 和 cmake
[apache-ant-1.9.9] yum install make
[apache-ant-1.9.9] yum install cmake
2.6.解压 protobuf ,进入到解压后 protobuf 主目录,/opt/module/protobuf-2.5.0,然后相继执行命令
[software] tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/
[opt] cd /opt/module/protobuf-2.5.0/
[protobuf-2.5.0] ./configure
[protobuf-2.5.0] make
[protobuf-2.5.0] make check
[protobuf-2.5.0] make install
[protobuf-2.5.0] ldconfig
[hadoop-dist] vi /etc/profile
#LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0
export PATH=$PATH:$LD_LIBRARY_PATH
[software] source /etc/profile
验证命令:protoc --version
2.7.安装 openssl 库
[software] yum install openssl-devel
2.8.安装 ncurses-devel 库
[software] yum install ncurses-devel
3.编译源码
1.解压源码到/opt/目录
[software] tar -zxvf hadoop-2.7.2-src.tar.gz -C /opt/
2.进入到 hadoop 源码主目录
[hadoop-2.7.2-src] pwd /opt/hadoop-2.7.2-src
3.通过 maven 执行编译命令(大概需要30分钟)
[hadoop-2.7.2-src] mvn package -Pdist,native - DskipTests -Dtar
4.成功的64位hadoop包在/opt/hadoop-2.7.2-src/hadoop-dist/target下
[target] pwd /opt/hadoop-2.7.2-src/hadoop-dist/target
5.编译源码过程中常见的问题及解决方案
1.MAVEN install 时候 JVM 内存溢出
处理方式:在环境配置文件和 maven 的执行文件均可调整 MAVEN_OPT 的 heap 大
小。(详情查阅 MAVEN 编译 JVM 调优问题,如:http://outofmemory.cn/code- snippet/12652/maven-outofmemoryerror-method)
2.编译期间 maven 报错。可能网络阻塞问题导致依赖库下载不完整导致,多次执行命 令(一次通过比较难):
mvn package -Pdist,nativeN -DskipTests -Dtar
3.报 ant、protobuf 等错误,插件下载未完整或者插件版本问题,最开始链接有较多特 殊情况,同时推荐