赞
踩
安装Linux系统参考:安装Linux操作系统详细步骤(附VMware16+CentOS7下载地址)
vi /ect/hostname
#主机名改完要重启才会生效 可以用hostname指令看看当前主机名是什么
vi /etc/sysconfig/network-scripts/ifcfg-ens33
systemctl restart network #重启网络服务 就会生效
完成这些配置后
接下来的操作 就可以用xshell远程连接
最小化安装用着还是很别扭的
分别指令下面两条命令
yum install -y epel-release
yum install -y psmisc nc net-tools rsync vim lrzsz ntp libzstd openssl-static tree iotop git
systemctl stop firewalld
systemctl disable firewalld
改Windows为了Xshell连接能用主机名
改Linux
因为不同主机之间的通信 还是希望用主机名来通信而不是IP地址
vim /etc/hosts
这里还是要在root用户下的
software放软件安装包
然后把软件解压到module里
修改所有者和所属组 因为前面说了 后面会用普通用户zcy来登录
至此 纯净模板机就配置好了
接下来 他的作用就是克隆新的机器
然后完成对应的配置
开始搭建Hadoop集群
克隆可以参考:
VMware16如何克隆虚拟机
主机名改成hadoop102
IP地址改成.162
改完记得reboot才会生效
先把两个安装包传输到software下
解压jdk到上一层的module下
tar -zxvf jdk-8u212-linux-x64.tar.gz -C …/module/
配置jdk的环境变量
vim /etc/profile
配置profile.sh
先 cd /etc/profile.d/
重新加载一下/etc/profile 环境变量就会生效
(我曾经有一个疑问 为什么不是加载profile.d 会看前面才发现 profile它里面有代码来读取到profile.h下面的sh脚本)
先解压到module
tar -zxvf hadoop-3.1.3.tar.gz -C ../module/
sudo vim /etc/profile.d/my_env.sh
重新加载一下环境变量生效(重启也可以)
Hadoop的运行模式介绍:
本地模式:hadoop默认安装后启动就是本地模式 就是将来的数据存在Linux本地并且运行MR程序的时候也是在本地机器上运行
伪分布式模式:伪分布式其实就只在一台机器上启动HDFS集群 启动YARN集群 并且数据存在HDFS集群上 以及运行MR程序也是在YARN上运行 计算后的结果也是输出到HDFS上 本质上就是利用一台服务器中多个java进程去模拟多个服务
完全分布式:完全分布式其实就是多台机器上分别启动HDFS集群 启动YARN集群 并且数据存在HDFS集群上的以及运行MR程序也是在YARN上运行 计算后的结果也是输出到HDFS上
上面安装好之后
就可以跑本地模式了
克隆之后 先修改IP和主机名 再用Xshell连接
hadoop103的主机名改成hadoop103 IPADDR改成.163
hadoop104的主机名改成hadoop104 IPADDR改成.164
记得reboot生效
改完就可以用Xshell登录了
各服务器之间也能ping通
这个时候103 和 104上面都是没有jdk这些软件的 需要从102分发过来
前提:在 hadoop102 hadoop103 hadoop104 都已经创建好 /opt/module 和 /opt/software 两个目录(因为是模板机克隆的 所以我这里是有的)
并且已经把这两个目录修改为zcy:zcy
sudo chown zcy:zcy -R /opt/module
下面 再介绍另一种分发的方法 自己写一个脚本
可以选择这两种方式的中的一种
#在102上让102分发给103
#在hadoop102上执行:
scp -r ./* zcy@hadoop103:/opt/module/
#在103上让102分发给104
#在hadoop103上执行:
scp -r zcy@hadoop102:/opt/module/* zcy@hadoop104:/opt/module/
#当然 也可以在104上拉取102上的东西
上面的分发方式 存在一定问题:如果集群机器特别多 怎么办?
这时候要是有一个脚本 执行它就遍历所有机器去同步分发就好了!!
去一台我们经常使用的机器上写这个脚本
而且希望该脚本能在任意位置执行
那也就要配置环境变量了!
那我把bin创建出来 在这里面写脚本!! 这样的话 就不需要我再手动配置环境变量了!! 这是对规则的合理利用
#!/bin/bash #1. 判断参数个数 if [ $# -lt 1 ] then echo "Not Enough Arguement!" #退出当前脚本 exit fi #2. 遍历集群所有机器 for host in hadoop103 hadoop104 do #3. 遍历所有目录,挨个发送 for file in $@ do #4. 判断文件是否存在 if [ -e $file ] then #5. 获取父目录 同时防止传参是软链接 pdir=$(cd -P $(dirname $file); pwd) #6. 获取当前文件的名称 因为我也可能传绝对路径进来 fname=$(basename $file) #7.登录目标机器 创建统一的目录结果 ssh $host "mkdir -p $pdir" #8.依次把要分发的文件和目录进行分发 rsync -av $pdir/$fname $host:$pdir else #文件不存在 echo "$file does not exists!" exit fi done done
zcy[普通用户]相对my_env文件进行分发(肯定有写操作)
应该看后三位 发现根本没有权限
所以不能用刚刚写的脚本
用scp手动发一下就行
分发完 同样要在103 104上source一下才生效
HDFS集群和yarn集群包含多个服务
启动在哪个机器 由自己来决定(改配置文件就行)
集群规划完之后 就要搭建集群了(说白了就是要修改配置文件)
hadoop的默认配置文件:
hadoop提供可自定义的配置文件:
当Hadoop集群启动后 先加载默认配置 然后再加载自定义配置文件 自定义的配置信息会覆盖默认配置
vim /opt/module/hadoop-3.1.3/etc/hadoop/coresite.xml <configuration> <!-- 指定NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop102:9820</value> </property> <!-- 指定hadoop数据的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-3.1.3/data</value> </property> <!-- 配置HDFS网页登录使用的静态用户为zcy --> <property> <name>hadoop.http.staticuser.user</name> <value>zcy</value> </property> <!-- 配置该atguigu(superUser)允许通过代理访问的主机节点 --> <property> <name>hadoop.proxyuser.zcy.hosts</name> <value>*</value> </property> <!-- 配置该atguigu(superUser)允许通过代理用户所属组 --> <property> <name>hadoop.proxyuser.zcy.groups</name> <value>*</value> </property> <!-- 配置该atguigu(superUser)允许通过代理的用户--> <property> <name>hadoop.proxyuser.zcy.groups</name> <value>*</value> </property> </configuration>
vim /opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
vim /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml <!-- 指定MR走shuffle --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定ResourceManager的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop103</value> </property> <!-- 环境变量的继承 --> <property> <name>yarn.nodemanager.env-whitelist</name> <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value> </property> <!-- yarn容器允许分配的最大最小内存 --> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>512</value> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>4096</value> </property> <!-- yarn容器允许管理的物理内存大小 --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>4096</value> </property> <!-- 关闭yarn对物理内存和虚拟内存的限制检查 --> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property>
vim /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
在102上 先生成密钥对
然后给102 103 104 都授权
上面两步 同样的操作 在103 104都做一遍
在103上 先生成密钥对 然后授权给102 103 104
在104上 先生成密钥对 然后授权给102 103 104
当我们用脚本启动的时候
肯定是在一台机器上执行这个脚本就行了
假如在102上群起hdfs
启动的时候一定会读取Hadoop的配置文件 它就知道在102上要启动nn
但是并没有指定在哪台机器启动dn(yarn的nm也是一样的)
这个时候 脚本是通过读取
/opt/module/hadoop-3.1.3/etc/hadoop/workers来确定要在哪里启动dn和nm
别忘记分发workers文件
如果集群是第一次启动,需要在hadoop102节点格式化NameNode
如果集群在运行过程中报错 需要重新格式化NameNode的话 一定要先停止namenode和datanode进程 并且要删除所有机器的data和logs目录 然后再进行格式化
因为格式化NameNode 会产生新的集群id 导致NameNode和DataNode的集群id不一致 集群找不到已往数据
hdfs namenode -format
这些群起群停的脚本 都在sbin里
根据自己集群的规划来启动hdfs和yarn(先后无所谓 但是要在正确的位置执行)
在hadoop102(nn在这)上启动hdfs start-dfs.sh
在hadoop103(rm在这)上启动yarn start-yarn.sh
在hadoop102(nn在这)上停止hdfs stop-dfs.sh
在hadoop103(rm在这)上启动yarn stop-yarn.sh
http://hadoop102:9870
Web端查看HDFS的NameNode 查看HDFS上存储的数据信息
http://hadoop103:8088
Web端查看YARN的ResourceManager 查看YARN上运行的Job信息
这里就有一个疑问
为什么同样的测试代码
这次就跑去找HDFS上的数据而不是本地Linux的数据了呢?
这和配置文件有关
本地模式:
/wcinput被解析成file:///wcinput(配置文件没改 默认)
hadoop jar share/hadoop/...jar wordcount file:///wcinput file:///wcoutput
完全分布式模式:
/wcinput被解析成hdfs://hadoop102:9820/wcinput
/wcoutput被解析成hdfs://hadoop102:9820/wcoutput
hadoop jar share/hadoop/...jar wordcount hdfs://hadoop102:9820/wcinput hdfs://hadoop102:9820/wcoutput
当MR程序在集群运行的时候
/代表的是HDFS的根目录 这是有core-site.xml中的配置信息决定的
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9820</value>
</property>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。