一、hadoop开发环境搭建
shell连接,以root用户登录。
1.准备一台虚拟机
① 最小化安装
2.hadoop101(模板机)
① 修改hostname
vi /etc/hostname
② 固定IP
vi /etc/sysconfig/network-scripts/ifcfg-ens33
③ 修改hosts
在windows上,cmd,管理员模式进入,cd /windows/system32/drivers/etc
然后start hosts 尾部追加一组服务器IP与主机名映射
vi /etc/hosts 将windows中追加的映射添加到虚拟机上
④ 关防火墙
关闭现防火墙:systemctl stop firewalld
关闭防火墙开机自启:systemctl disable firewalld
查看防火墙是否开机自启:systemctl is-enabled firewalld
⑤ Xshell工具链接模板机
为了加快连接速度,可以 vim /etc/ssh/sshd_config
然后/搜索: /DNS
将前面的#去掉,并将yes改为no (小写)
⑥ 通过yum安装方式安装必要的软件
###note!!!!需要联网:ping www.baidu.com
软件1:yum install -y epel-release
软件2:yum install -y psmiscnc net-tools rsync vim lrzsz ntp libzstd openssl- static tree iotop git
⑦ 创建普通户用cxl、提升为root权限
创建普通用户:useradd cxl
设置用户密码:passwd 123456
提升root权限:vim /etc/sudoers 在尾部加上cxl ALL=(ALL) NOPASSWD:ALL
⑧ 在opt下创建software、module文件夹,并修改所属主、组
创建software用于保存软件包:mkdir /opt/software
创建module用于保存解压后的软件:mkdir /opt/module
修改software所属主、组:chown cxl:cxl /opt/software
修改module所属主、组:chown cxl:cxl /opt/module
⑨ 重启虚拟机
重启:reboot
3. hadoop102
① 克隆hadoop101
② 修改ip
③ 修改 hostname
4. hadoop102安装jdk
由于Hadoop是java进程,所以需要添加jdk。
① Xshell连接hadoop102
以普通用户cxl登录hadoop102
② 将使用xftp将jdk的安装包上传到 /opt/software 下
③ 将jdk安装到 /opt/module 下
--jdk压缩包解压到module下:tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
5. 配置JDK环境变量
###note1:普通用户cxl,不sudo处理时,只能在/home/cxl 目录下创建文件
###note2: /etc/profile 文件保存的是系统PATH变量,不可以在内部更改
###note3:创建一个 my_env.sh文件,写入自己更改的环境变量,文件保存到/etc/profile.d/目录
创建shell脚本文件my_env.sh:sudo vim /etc/profile.d/my_env.sh
编辑shell脚本文件my_env.sh:export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
更新profile文件:source /etc/profile
检测是否可用:任意目录下 java -version 不成功的话就重启:sudo reboot
----!!!!note!!!!----
path变量时系统变量,这里声明之后,会去覆盖系统的那个path,所以要先拿到系统的那个path即$path,然后用:拼接自己的添加的环境变量。
环境变量时为了执行某个命令时,能找到该命令所在路径。
export会将变量提升为全局变量,那样该变量就可以被其他shell脚本(比如hadoop里面启动单项服务的脚本,里面都是用到了HADOOP_HOME这个变量,如果不提升,脚本就没法执行)内部使用。
全局变量提升是为了,当某些脚本中含有该环境变量时可以使用它的值。
所以环境变量配置+提升全局变量 应该是一体的,都要来做的。
6. hadoop102安装hadoop
① 将hadoop包传输到 /opt/software
② 解压到module
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
7. 配置hadoop环境变量
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
--bin下放的是单点命令
export PATH=$PATH:$HADOOP_HOME/sbin
--集群命令
8. hadoop目录
bin:存放对Hadoop集群单项服务(HDFS,YARN)操作的脚本
sbin:启停Hadoop相关服务的脚本
etc:Hadoop的配置文件目录,存放Hadoop的配置文件
share:存放Hadoop的依赖jar包、文档、和官方案例
data:
namenode在默认配置中,指定数据存储在hadoop.tmp.dir/dfs/name中,通过在core-site.xml中指定hadoop.tmp.dir=/opt/module/hadoop-3.1.3/data。
namenode格式化后自动生成,namenode的数据就默认存储在其下的dfs/name中。有id,如果后续需要重新格式化,需要删除该data
logs:
运行日志,有id,若重新格式化namenode,需要删除该logs。
--出问题时,一般查200行
9.hadoop103\hadoop104
克隆hadoop102、改ip、改hostname
10.文件传输方式
方式1-scp:
scp -r 源路径 登录用户@目的主机:目的路径
方式2-rsync:
rsync -av 源路径 登录用户@目的主机:目的路径
方式3-群发脚本
-- 注意:系统环境变量在用户cxl创建的时候,就加入了home/cxl/bin,但/home/cxl/现在下面是没有bin目录的,mkdir bin ,将要执行的脚本放在bin目录下,该脚本就可以在任何地方执行。
--编脚本:vim xsync.sh
--内容直接word上找。
--给权限: chmod 744 xsync.sh
常用于分发环境变量
sudo /home/cxl/bin/xsync.sh /etc/profile.d/my_env.sh
--在每台机器上source /etc/profile
二、hadoop完全分布式
1.配置4个xml(必要)
①规划
hadoop102 NameNode NodeManager DataNode
hadoop103 ResourceManager NodeManager DataNode
hadoop104 SecondaryNameNode NodeManager DataNode
②修改配置文件
配置core-site.xml:
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为cxl -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>cxl</value>
</property>
<!-- 配置该cxl(superUser)允许通过代理访问的主机节点 -->
<property>
<name>hadoop.proxyuser.cxl.hosts</name>
<value>*</value>
</property>
<!-- 配置该cxl(superUser)允许通过代理用户所属组 -->
<property>
<name>hadoop.proxyuser.cxl.groups</name>
<value>*</value>
</property>
<!-- 配置该cxl(superUser)允许通过代理的用户-->
<property>
<name>hadoop.proxyuser.cxl.groups</name>
<value>*</value>
</property>
配置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>
<!--
namenode数据的存储位置配置项:dfs.namenode.name.dir
datanode数据的存储位置配置项:dfs.datanode.data.dir
2nn数据的存储位置配置项:dfs.namenode.checkpoint.dir
以上三个配置项,都引用了变量hadoop.tmp.dir/来定义将来数据存储的位置,所以在core-site.xml中指定hadoop.tmp.dir的值,而hdfs-site.xml可以指定hadoop.tmp.dir/******中***的值。
块大小配置项:dfs.blocksize
副本数配置项:dfs.replication
-->
配置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>
---如果需要配置日志聚集,继续添加配置
-- 概念:日志是针对 MR 程序运行是所产生的的日志
-- 目的:方便后期分析问题 有更好的 执行过过程的依据
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
-- 重启集群(historyserver 、 yarn集群)
-- 日志聚集后,会在HDFS的 /tmp 目录下存储
配置mapred-site.xml
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
---如果需要配置历史服务器,继续添加配置
-- 概念:历史服务器是针对MR程序执行的历史记录,查看所有提交到yarn的job
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
-- 把历史服务器的 启停 操作配置到 自定义的群启群停脚本了
2.配置Workers(必要)
服务器会读取workers中的内容,如果发现有这台服务器的名字,就会在自己的服务器上部署DataNode。
为方便起见,只需要在一台服务器上的Workers文件上写上所有部署DataNode的服务器,然后分发给集群中的其余服务器。
在hadoop102上编辑:vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
删除:localhost
添加:hadoop102
hadoop103
hadoop104
注意:
1.该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
3.项目经验-配置
3.1.HDFS多目录存储
--NameNode多目录存储:NameNode多目录存储时,要求各个目录中的数据都是一样的,相当于是备份,而将来主要的生产环境是高可用,已经是实现了在不同服务器上有多个namenode,因此再配置多目录已经没有意义了。
--DataNode多目录存储:在现实生产中,一个服务器的磁盘大概10T左右,由多块磁盘构成的,将DataNode可以配置成多个目录,每个目录存储的数据不一样,不同的目录下挂载不同的磁盘,就可以保证磁盘存储均衡。
什么是挂载?
Linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。纠正一个误区,并不是根目录下任何一个目录都可以作为挂载点,由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录。
举个例子,我们想通过命令行访问某个U盘中的数据,目前U盘和Linux 系统文件分属两个文件系统,还无法使用命令行找到 U 盘文件,需要将两个文件系统进行挂载,接下来,我们在根目录下新建一个目录 /sdb-u,通过挂载命令将 U 盘文件系统挂载到此目录。
U盘插入到linux时,系统dev目录下只会记录一下该设备的一些基本信息。
在hdfs-site.xml文件中添加如下内容:
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2</value>
</property>
3.2.集群数据均衡
一般情况下,namenode会均衡的将数据存储,但是随着集群使用时间增长,删除文件时,可能会导致集群内部的数据不均衡。
--节点和节点之间的数据均衡(2.x):
start-balance.sh -threshold 10
10指的是利用率波动范围为10%,可以根据现实生产确定。
--节点内磁盘和磁盘之间的数据均衡(3.x,应对多块盘的情况):
step1生成均衡计划:hdfs diskbalancer -plan hadoop102
step2执行均衡计划:hdfs diskbalancer -execute hadoop102.plan.json
step3查看均衡状态:hdfs diskbalancer -query hadoop102
step4停止均衡计划:hdfs diskbalancer -cancel hadoop102.plan.json
3.3.支持LZO压缩配置
3.4.LZO创建索引
3.5.基准测试
3.6.hadoop参数调优
4.分发配置文件(直接分发整个hadoop)
5.免密登录(必要)
-- 普通用户实现免密访问 hadoop102 hadoop103 hadoop104
-- 在hadoop102上生成密钥对
ssh-keygen -t rsa (4下回车)
-- 在hadoop102上给 hadoop102 hadoop103 hadoop104进行授权
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
-- 实现 hadoop103 免密访问 hadoop102 hadoop103 hadoop104
(同上操作...)
-- 实现 hadoop104 免密访问 hadoop102 hadoop103 hadoop104
(同上操作...)
--在hadoop102上实现root用户免密登录hadoop102\hadoop103\hadoop104
-切换到root用户:su root
输入密码:123456
--ssh-keygen -t rsa(4下回车)
--ssh-copy-id hadoop102
--ssh-copy-id hadoop103
--ssh-copy-id hadoop104
原理:
step1:在服务器A上:ssh-keygen -t rsa 生成秘钥对:1个公钥+1个私钥
step2:将公钥拷贝给服务器B:ssh-copy-id,实现授权
step3:在A服务器上ssh访问B
step4:B验证A,给A出一道题,并用A的公钥加密发送给A
step5:A用自己的私钥解密数据,并算出答案,返回给B
step6:B接受到A发来的数据后,跟自己的答案做一个对比,相同则判定为A,允许登录。
6.一键启停hadoop
启动前先要格式化namenode:hdfs namenode -format
-- 首次搭建后需要对NameNode进行格式化操作
-- 如果集群在后期使用过程需要重新格式化,删除所有机器hadoop-3.1.3目录下的data、logs 目录。
一键启停脚本
在hadoop102编写总控开关脚本my_cluster.sh脚本,实现在hadoop102上一键启动hadoop:
-- 注意:为了省去配置环境变量的步骤,直接在/home/cxl/bin下创建
--在home/cxl/bin/下:touch my_cluster.sh脚本
--给my_env.sh脚本执行权限: chmod 744 my_cluster
--编辑my_rsync.sh脚本:vim my_cluster.sh
脚本内容如下:
#!/bin/bash
#参数校验
if [ $# -lt 1 ]
then
echo "参数不能为空!!!"
exit
fi
#根据参数的值进行 启停 操作
case $1 in
"start")
#启动操作
echo "===============start HDFS================="
ssh hadoop102 /opt/module/hadoop-3.1.3/sbin/start-dfs.sh
echo "===============start YARN================="
ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/start-yarn.sh
;;
"stop")
#停止操作
echo "===============stop HDFS================="
ssh hadoop102 /opt/module/hadoop-3.1.3/sbin/stop-dfs.sh
echo "===============stop YARN================="
ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/stop-yarn.sh
;;
*)
echo "ERROR!!!!"
;;
esac
7.一键查看集群进程
编脚本:myjps.sh
给权限:chmod 777 myjps.sh
--脚本内容如下:
#!/bin/bash
for i in hadoop102 hadoop103 hadoop104
do
echo ===================== $i =====================
ssh $i "jps $@ | grep -v Jps"
done
8.一键执行相同操作
编脚本:vim xcall.sh
给权限:chmod 777 xcall.sh
---------------------------------
#! /bin/bash
for i in hadoop102 hadoop103 hadoop104
do
echo --------- $i ----------
ssh $i "$*"
done
----------------------------------
9.测试
登录HDFS图形化界面:hadoop102:9870
--最右侧utilities 选中browse the file system
--然后可以输入框右侧creat dir是创建目录,upload files是上传文件:
创建一个tmp目录,上传一个hello.txt文件,
--当上传的文件超过128mb时,客户端会进行切块,可以点击文件,查看block0、1、2...
--再去Xshell中执行命令:
hadoop jar jar全路径名 程序名 输入路径 输出路径
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /tmp /final
------当被执行的文件夹下有多个文件时,会合并输出。
------fianl是输出文件目录,当HDFS中没有时,会自动生成。
------final文件夹中,最终会有两个文件:_success文件,part-r-00000文件。
如何结束一个mr程序:
--在yarn节点hadoop103上:yarn application -list查询到application_xxxxx
--复制带编号的application: yarn application -kill application application_XXXxxx
-----part指分区,有几个分区就有几个结果文件,最后几位数是分区编号(不一定是线性递增的,有自己的编码规则。)r指的是ruduce,表明结果是reduce阶段的结果(m表示map阶段)
--输出文件夹名字要求每次都不一样。
三、hadoop本地模式
没有更改任何配置的hadoop框架,也就是没有指定mr在yarn上跑,默认会运行在local上,就是本地模式,相当于既没有启动yarn,也没有使用到hdfs。
测试和调试MapReduce程序较为方便因此,这种模式适宜用在开发阶段。
四、启动补充
在关键节点,直接启动单项服务
-- 注意:
首次启动HDFS需要对NameNode进行格式化操作,在hadoop102执行::hdfs namenode -format
启/停HDFS: start/stop-dfs.sh (在hadoop102上输入命令,nn所在节点)
启/停YARN: start/stop-yarn.sh (在hadoop103上输入命令,yarn所在节点)
###一键启停脚本,就是封装了直接启动单项服务的命令。