第一章配置Hadoop
前言
本次我们python+大数据的作业我选择附加一
利用hadoop+python实现,最近考完试有时间来完成。
这次我们用到的是Hadoop,利用python进行操作首先我们要配置我们的虚拟机
简介: MapReduce是面向大数据并行处理的计算模型、框架和平台,它隐含了以下三层含义:
(1)MapReduce是一个基于集群的高性能并行计算平台(Cluster Infrastructure)。它允许用市场上普通的商用服务器构成一个包含数十、数百至数千个节点的分布和并行计算集群。
(2)MapReduce是一个并行计算与运行软件框架(Software Framework)。它提供了一个庞大但设计精良的并行计算软件框架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算涉及到的很多系统底层的复杂细节交由系统负责处理,大大减少了软件开发人员的负担。
(3)MapReduce是一个并行程序设计模型与方法(Programming Model & Methodology)。它借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Reduce两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理
简言之: mapreduce是一种计算引擎,可以把我们对大批量数据的计算通过抽象成map与reduce两个子任务进行计算从而更快的得到想要的结果。
下面我们来准备我们的hadoop的虚拟机这里我们基于的是centos7.5
集群搭建
2.1 模板虚拟机环境准备
0)安装模板虚拟机,IP地址192.168.10.100、主机名称hadoop100、内存4G、硬盘50G
1)hadoop100虚拟机配置要求如下(本文Linux系统全部以CentOS-7.5-x86-1804为例子)
(1)使用yum安装需要虚拟机可以正常上网,yum安装前可以先测试下虚拟机联网情况
[root@hadoop100 ~]# ping www.baidu.com
PING www.baidu.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=128 time=8.60 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=128 time=7.72 ms
(2)安装epel-release
注:Extra Packages for Enterprise Linux是为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux。相当于是一个软件仓库,大多数rpm包在官方 repository 中是找不到的)
[root@hadoop100 ~]# yum install -y epel-release
(3)注意:如果Linux安装的是最小系统版,还需要安装如下工具;如果安装的是Linux桌面标准版,不需要执行如下操作
net-tool:工具包集合,包含ifconfig等命令
[root@hadoop100 ~]# yum install -y net-tools
vim:编辑器
[root@hadoop100 ~]# yum install -y vim
2)关闭防火墙,关闭防火墙开机自启
[root@hadoop100 ~]# systemctl stop firewalld
[root@hadoop100 ~]# systemctl disable firewalld.service
注意:在企业开发时,通常单个服务器的防火墙时关闭的。公司整体对外会设置非常安全的防火墙
3)在/opt目录下创建文件夹,并修改所属主和所属组
(1)在/opt目录下创建module、software文件夹
[root@hadoop100 ~]# mkdir /opt/module
[root@hadoop100 ~]# mkdir /opt/software
(2)修改module、software文件夹的所有者和所属组均为atguigu用户
[root@hadoop100 ~]# chown atguigu:atguigu /opt/module
[root@hadoop100 ~]# chown atguigu:atguigu /opt/software
(3)查看module、software文件夹的所有者和所属组
[root@hadoop100 ~]# cd /opt/
[root@hadoop100 opt]# ll
总用量 12
drwxr-xr-x. 2 atguigu atguigu 4096 5月 28 17:18 module
drwxr-xr-x. 2 root root 4096 9月 7 2017 rh
drwxr-xr-x. 2 atguigu atguigu 4096 5月 28 17:18 software
4)卸载虚拟机自带的JDK
注意:如果你的虚拟机是最小化安装不需要执行这一步。
[root@hadoop100 ~]# rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
rpm -qa:查询所安装的所有rpm软件包
grep -i:忽略大小写
xargs -n1:表示每次只传递一个参数
rpm -e –nodeps:强制卸载软件
5)重启虚拟机
[root@hadoop100 ~]# reboot
这样我们的基础虚拟机就弄好了,我们在此基础之上复制两个分别是Haoop101,和Hadoop102
2.2 克隆虚拟机
1)利用模板机hadoop100,克隆2台虚拟机:hadoop101 hadoop102
注意:克隆时,要先关闭hadoop100
2)修改克隆机IP,下面以hadoop100为例子说明
(1)修改克隆虚拟机的静态IP
[root@hadoop100 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
改成
DEVICE=ens33
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
NAME="ens33"
IPADDR=192.168.10.100
PREFIX=24
GATEWAY=192.168.10.2
DNS1=192.168.10.2
(2)查看Linux虚拟机的虚拟网络编辑器,编辑->虚拟网络编辑器->VMnet8
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EUNZenmL-1639641787977)(C:Users86157AppDataLocalTemps9634674668.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来
直接上传(img-iUJpKMVM-1639641787978)(C:Users86157AppDataLocalTemps9634685117.png)]
(3)查看Windows系统适配器VMware Network Adapter VMnet8的IP地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MElwdgU8-1639641787979)(C:Users86157AppDataLocalTemps9634750321.png)]
(4)保证Linux系统ifcfg-ens33文件中IP地址、虚拟网络编辑器地址和Windows系统VM8网络IP地址相同。
3**)修改克隆机主机名,以下以hadoop100****举例说明**
(1)修改主机名称
[root@hadoop100 ~]# vim /etc/hostname
hadoop100
(2)配置Linux克隆机主机名称映射hosts文件,打开/etc/hosts
[root@hadoop100 ~]# vim /etc/hosts
添加如下内容
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
4**)重启克隆机hadoop102**
[root@hadoop100 ~]# reboot
5**)修改windows的主机映射文件(hosts文件)**
(1)如果操作系统是window7,可以直接修改
(a)进入C:WindowsSystem32driversetc路径
(b)打开hosts文件并添加如下内容,然后保存
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
(2)如果操作系统是window10,先拷贝出来,修改保存以后,再覆盖即可
(a)进入C:WindowsSystem32driversetc路径
(b)拷贝hosts文件到桌面
(c)打开桌面hosts文件并添加如下内容
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
(d)将桌面hosts文件覆盖C:WindowsSystem32driversetc路径hosts文件
2.3 在Hadoop100安装JDK
1)卸载现有JDK
注意:安装JDK前,一定确保提前删除了虚拟机自带的JDK。详细步骤见问文档3.1节中卸载JDK步骤。
2)用XShel传输工具将JDK导入到opt目录下面的software文件夹下面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pgs6NP2R-1639641787980)(C:Users86157AppDataLocalTemps9634950345.png)]
3)在Linux系统下的opt目录中查看软件包是否导入成功
[atguigu@hadoop100 ~]$ ls /opt/software/
看到如下结果:
jdk-8u212-linux-x64.tar.gz
4)解压JDK到/opt/module目录下
[atguigu@hadoop100 software]$ tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
5)配置JDK环境变量
(1)新建/etc/profile.d/my_env.sh文件
[atguigu@hadoop100 ~]$ sudo vim /etc/profile.d/my_env.sh
添加如下内容
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
(2)保存后退出
:wq
(3)source一下/etc/profile文件,让新的环境变量PATH生效
[atguigu@hadoop100 ~]$ source /etc/profile
6)测试JDK是否安装成功
[atguigu@hadoop100 ~]$ java -version
如果能看到以下结果,则代表Java安装成功。
java version "1.8.0_212"
注意:重启(如果java -version可以用就不用重启)
[atguigu@hadoop100 ~]$ sudo reboot
2.4 在Hadoop100安装Hadoop
Hadoop下载地址:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/
1)用XShell文件传输工具将hadoop-3.1.3.tar.gz导入到opt目录下面的software文件夹下面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D624hHTP-1639641787980)(C:Users86157AppDataLocalTemps9635182977.png)]
2)进入到Hadoop安装包路径下
[atguigu@hadoop100 ~]$ cd /opt/software/
3)解压安装文件到/opt/module下面
[atguigu@hadoop100 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
4)查看是否解压成功**
[atguigu@hadoop100 software]$ ls /opt/module/
hadoop-3.1.3
5)将Hadoop添加到环境变量
(1)获取Hadoop安装路径
[atguigu@hadoop100 hadoop-3.1.3]$ pwd
/opt/module/hadoop-3.1.3
(2)打开/etc/profile.d/my_env.sh文件
[atguigu@hadoop100 hadoop-3.1.3]$ sudo vim /etc/profile.d/my_env.sh
在my_env.sh文件末尾添加如下内容:(shift+g)
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
保存并退出: :wq
(3)让修改后的文件生效
[atguigu@hadoop100 hadoop-3.1.3]$ source /etc/profile
6)测试是否安装成功
[atguigu@hadoop100 hadoop-3.1.3]$ hadoop version
Hadoop 3.1.3
7)重启(如果Hadoop命令不能用再重启虚拟机)
[atguigu@hadoop100 hadoop-3.1.3]$ sudo reboot
2.5 Hadoop目录结构
1)查看Hadoop目录结构
[atguigu@hadoop100 hadoop-3.1.3]$ ll
总用量 52
[root@hadoop100 hadoop-3.1.3]# ll
总用量 184
drwxr-xr-x. 2 1 1 183 9月 12 2019 bin
drwxr-xr-x. 4 root root 37 11月 20 20:34 data
drwxr-xr-x. 3 1 1 20 9月 12 2019 etc
drwxr-xr-x. 2 1 1 106 9月 12 2019 include
drwxr-xr-x. 3 1 1 20 9月 12 2019 lib
drwxr-xr-x. 4 1 1 288 9月 12 2019 libexec
-rw-rw-r--. 1 1 1 147145 9月 4 2019 LICENSE.txt
drwxr-xr-x. 3 root root 4096 11月 28 16:12 logs
-rw-rw-r--. 1 1 1 21867 9月 4 2019 NOTICE.txt
-rw-rw-r--. 1 1 1 1366 9月 4 2019 README.txt
drwxr-xr-x. 3 1 1 4096 11月 18 23:11 sbin
drwxr-xr-x. 4 1 1 31 9月 12 2019 share
drwxr-xr-x. 2 root root 22 11月 18 23:00 wcinput
drwxr-xr-x. 2 root root 88 11月 18 23:01 wcoutput
-rw-r--r--. 1 root root 46 11月 18 23:24 word.txt
2)重要目录
(1)bin目录:存放对Hadoop相关服务(hdfs,yarn,mapred)进行操作的脚本
(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
(4)sbin目录:存放启动或停止Hadoop相关服务的脚本
(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例
Hadoop运行模式
1)Hadoop官方网站:http://hadoop.apache.org/
2)Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式。
本地模式:单机运行,只是用来演示一下官方案例。生产环境不用。
**伪分布式模式:**也是单机运行,但是具备Hadoop集群的所有功能,一台服务器模拟一个分布式的环境。个别缺钱的公司用来测试,生产环境不用。
**完全分布式模式:**多台服务器组成分布式环境。生产环境使用。
3.1 本地运行模式(官方WordCount)
1)创建在hadoop-3.1.3文件下面创建一个wcinput文件夹
[atguigu@hadoop102 hadoop-3.1.3]$ mkdir wcinput
2)在wcinput文件下创建一个word.txt文件
[atguigu@hadoop102 hadoop-3.1.3]$ cd wcinput
3)编辑word.txt文件
[atguigu@hadoop102 wcinput]$ vim word.txt
在文件中输入如下内容
bingbing bingbing
lanlan lanlan lanlan
xiaozhao
保存退出::wq
4)回到Hadoop目录/opt/module/hadoop-3.1.3
5)执行程序
[atguigu@hadoop100 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput wcoutput
6)查看结果
[atguigu@hadoop100 hadoop-3.1.3]$ cat wcoutput/part-r-00000
看到如下结果:
bingbing 2
lanlan 3
xiaozhao 1
3.2 完全分布式运行模式(开发重点)
分析:
1)准备3台客户机(关闭防火墙、静态IP、主机名称)
2)安装JDK
3)配置环境变量
4)安装Hadoop
5)配置环境变量
6)配置集群
7)单点启动
8)配置ssh
9)群起并测试集群
3.2.1 虚拟机准备
详见2.1、2.2两节。
3.2.2 编写集群分发脚本xsync
1)scp(secure copy)安全拷贝
(1)scp定义
scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)
(2)基本语法
scp -r p d i r / pdir/ pdir/fname u s e r @ user@ user@host: p d i r / pdir/ pdir/fname
命令 递归 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
(3)案例实操
前提:在hadoop102、hadoop103、hadoop104都已经创建好的/opt/module、 /opt/software两个目录,并且已经把这两个目录修改为atguigu:atguigu
[atguigu@hadoop102 ~]$ sudo chown atguigu:atguigu -R /opt/module
(a)在hadoop102上,将hadoop102中/opt/module/jdk1.8.0_212目录拷贝到hadoop103上。
[atguigu@hadoop102 ~]$ scp -r /opt/module/jdk1.8.0_212 atguigu@hadoop103:/opt/module
(b)在hadoop103上,将hadoop102中/opt/module/hadoop-3.1.3目录拷贝到hadoop103上。
[atguigu@hadoop103 ~]$ scp -r atguigu@hadoop102:/opt/module/hadoop-3.1.3 /opt/module/
(c)在hadoop103上操作,将hadoop102中/opt/module目录下所有目录拷贝到hadoop104上。
[atguigu@hadoop103 opt]$ scp -r atguigu@hadoop102:/opt/module/* atguigu@hadoop104:/opt/module
2**)rsync****远程同步工具**
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(1)基本语法
rsync -av p d i r / pdir/ pdir/fname u s e r @ user@ user@host: p d i r / pdir/ pdir/fname
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
选项参数说明
选项
功能
-a
归档拷贝
-v
显示复制过程
(2)案例实操
(a)删除hadoop103中/opt/module/hadoop-3.1.3/wcinput
[atguigu@hadoop103 hadoop-3.1.3]$ rm -rf wcinput/
(b)同步hadoop102中的/opt/module/hadoop-3.1.3到hadoop103
[atguigu@hadoop102 module]$ rsync -av hadoop-3.1.3/ atguigu@hadoop103:/opt/module/hadoop-3.1.3/
3**)xsync****集群分发脚本**
(1)需求:循环复制文件到所有节点的相同目录下
(2)需求分析:
(a)rsync命令原始拷贝:
rsync -av /opt/module atguigu@hadoop103:/opt/
(b)期望脚本:
xsync要同步的文件名称
(c)期望脚本在任何路径都能使用(脚本放在声明了全局环境变量的路径)
[atguigu@hadoop102 ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/atguigu/.local/bin:/home/atguigu/bin:/opt/module/jdk1.8.0_212/bin
(3)脚本实现
(a)在/home/atguigu/bin目录下创建xsync文件
[atguigu@hadoop102 opt]$ cd /home/atguigu
[atguigu@hadoop102 ~]$ mkdir bin
[atguigu@hadoop102 ~]$ cd bin
[atguigu@hadoop102 bin]$ vim xsync
在该文件中编写如下代码
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
(b)修改脚本 xsync 具有执行权限
[atguigu@hadoop102 bin]$ chmod +x xsync
(c)测试脚本
[atguigu@hadoop102 ~]$ xsync /home/atguigu/bin
(d)将脚本复制到/bin中,以便全局调用
[atguigu@hadoop102 bin]$ sudo cp xsync /bin/
(e)同步环境变量配置(root所有者)
[atguigu@hadoop102 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh
注意:如果用了sudo,那么xsync一定要给它的路径补全。
让环境变量生效
[atguigu@hadoop103 bin]$ source /etc/profile
[atguigu@hadoop104 opt]$ source /etc/profile
3.2.3 SSH无密登录配置
1**)配置ssh**
(1)基本语法
ssh另一台电脑的IP地址
(2)ssh连接时出现Host key verification failed的解决方法
[atguigu@hadoop102 ~]$ ssh hadoop103
如果出现如下内容
Are you sure you want to continue connecting (yes/no)
输入yes,并回车
(3)退回到hadoop102
[atguigu@hadoop103 ~]$ exit
2**)无密钥配置**
(1)免密登录原理
(2)生成公钥和私钥
[atguigu@hadoop102 .ssh]$ pwd
/home/atguigu/.ssh
[atguigu@hadoop102 .ssh]$ ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
(3)将公钥拷贝到要免密登录的目标机器上
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop102
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop103
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop104
注意:
还需要在hadoop103上采用atguigu账号配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。
还需要在hadoop104上采用atguigu账号配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。
还需要在hadoop102上采用root账号,配置一下无密登录到hadoop102、hadoop103、hadoop104;
3**).ssh文件夹下(~/.ssh)的文件功能解释**
known_hosts
记录ssh访问过计算机的公钥(public key)
id_rsa
生成的私钥
id_rsa.pub
生成的公钥
authorized_keys
存放授权过的无密登录服务器公钥
3.3 集群配置
1**)集群部署规划**
注意:
NameNode和SecondaryNameNode不要安装在同一台服务器
ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。
hadoop100
hadoop101
hadoop102
HDFS
NameNode DataNode
DataNode
SecondaryNameNode DataNode
YARN
NodeManager
ResourceManager NodeManager
NodeManager
2**)配置文件说明**
Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
(1)默认配置文件:
要获取的默认文件
文件存放在Hadoop的jar包中的位置
[core-default.xml]
hadoop-common-3.1.3.jar/core-default.xml
[hdfs-default.xml]
hadoop-hdfs-3.1.3.jar/hdfs-default.xml
[yarn-default.xml]
hadoop-yarn-common-3.1.3.jar/yarn-default.xml
[mapred-default.xml]
hadoop-mapreduce-client-core-3.1.3.jar/mapred-default.xml
(2)自定义配置文件:
core-site.xml**、hdfs-site.xml****、yarn-site.xml****、mapred-site.xml**四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。
3)配置集群
(1)核心配置文件
配置core-site.xml
[root@hadoop100 ~]$ cd $HADOOP_HOME/etc/hadoop
[root@hadoop100 ~]$ vim core-site.xml so-ascii-f
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!-- 指定 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop100:8020</value>
</property>
<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 atguigu -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
</configuration>
(2)HDFS配置文件
配置hdfs-site.xml
[root@hadoop100 ~]$ vim hdfs-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
```
http://www.apache.org/licenses/LICENSE-2.0
```
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!-- nn web 端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop100:9870</value>
</property>
<!-- 2nn web 端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop102:9868</value>
</property>
</configuration>
(3)YARN配置文件
配置yarn-site.xml
[root@hadoop100 ~]$ vim yarn-site.xml
文件内容如下:
<?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
```
http://www.apache.org/licenses/LICENSE-2.0
```
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<configuration>
<property>
<name>yarn.application.classpath</name>
<value>
/opt/module/hadoop-3.1.3/etc/hadoop,
/opt/module/hadoop-3.1.3/share/hadoop/common/lib/*,
/opt/module/hadoop-3.1.3/share/hadoop/common/*,
/opt/module/hadoop-3.1.3/share/hadoop/hdfs,
/opt/module/hadoop-3.1.3/share/hadoop/hdfs/lib/*,
/opt/module/hadoop-3.1.3/share/hadoop/hdfs/*,
/opt/module/hadoop-3.1.3/share/hadoop/mapreduce/lib/*,
/opt/module/hadoop-3.1.3/share/hadoop/mapreduce/*,
/opt/module/hadoop-3.1.3/share/hadoop/yarn,
/opt/module/hadoop-3.1.3/share/hadoop/yarn/lib/*,
/opt/module/hadoop-3.1.3/share/hadoop/yarn/*,
</value>
</property>
<!-- 指定 MR 走 shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 ResourceManager 的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CO
NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
RED_HOME</value>
</property>
</configuration>
(4)MapReduce配置文件
配置mapred-site.xml
[root@hadoop100 ~]$ vim mapred-site.xml
文件内容如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
4)在集群上分发配置好的Hadoop配置文件
[root@hadoop100 ~]$ xsync /opt/module/hadoop-3.1.3/etc/hadoop/
5)去101和102上查看文件分发情况
[atguigu@hadoop101 ~]$ cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
[atguigu@hadoop102 ~]$ cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
3.4 群起配置
1)配置workers
[root@hadoop100 hadoop]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
在该文件中增加如下内容:
hadoop100
hadoop101
hadoop102
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件
[root@hadoop100 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc
2)启动集群
(1)如果集群是第一次启动,需要在hadoop102节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的data和logs目录,然后再进行格式化。)
[root@hadoop100 hadoop-3.1.3]$ hdfs namenode -format
(2)启动HDFS
[root@hadoop100 hadoop-3.1.3]$ sbin/start-dfs.sh
(3)在配置了ResourceManager的节点(hadoop103)启动YARN
[root@hadoop100 hadoop-3.1.3]$ sbin/start-yarn.sh
(4)Web端查看HDFS的NameNode
(a)浏览器中输入:http://hadoop100:9870
(b)查看HDFS上存储的数据信息
(5)Web端查看YARN的ResourceManager
(a)浏览器中输入:http://hadoop101:8088
(b)查看YARN上运行的Job信息
3**)集群基本测试**
(1)上传文件到集群
上传小文件
[root@hadoop100 ~]$ hadoop fs -mkdir /input
[root@hadoop100 ~]$ hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input
上传大文件
[root@hadoop100 ~]$ hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz /
(2)上传文件后查看文件存放在什么位置
查看HDFS文件存储路径
[root@hadoop100 subdir0]$ pwd
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1436128598-192.168.10.102-1610603650062/current/finalized/subdir0/subdir0
查看HDFS在磁盘存储文件内容
[root@hadoop100 subdir0]$ cat blk_1073741825
hadoop yarn
hadoop mapreduce
atguigu
atguigu
(3)拼接
-rw-rw-r--. 1 atguigu atguigu 134217728 5月 23 16:01 **blk_1073741836**
-rw-rw-r--. 1 atguigu atguigu 1048583 5月 23 16:01 blk_1073741836_1012.meta
-rw-rw-r--. 1 atguigu atguigu 63439959 5月 23 16:01 **blk_1073741837**
-rw-rw-r--. 1 atguigu atguigu 495635 5月 23 16:01 blk_1073741837_1013.meta
[root@hadoop100 subdir0]$ cat blk_1073741836>>tmp.tar.gz
[root@hadoop100 subdir0]$ cat blk_1073741837>>tmp.tar.gz
[root@hadoop100 subdir0]$ tar -zxvf tmp.tar.gz
(4)下载
[root@hadoop102 software]$ hadoop fs -get /jdk-8u212-linux-x64.tar.gz ./
(5)执行wordcount程序
[root@hadoop100 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
3.5 配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
1)配置mapred-site.xml
[atguigu@hadoop102 hadoop]$ vim mapred-site.xml
在该文件里面增加如下配置。
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop100:19888</value>
</property>
2)分发配置
[atguigu@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
3)在hadoop102启动历史服务器
[atguigu@hadoop102 hadoop]$ mapred --daemon start historyserver
4)查看历史服务器是否启动
[atguigu@hadoop102 hadoop]$ jps
5)查看JobHistory
http://hadoop100:19888/jobhistory
最后
这样我们的Hadoop就配置好了
[root@hadoop100 hadoop-3.1.3]# jps
3488 DataNode
3858 NodeManager
32405 Jps
3341 NameNode
[root@hadoop101 hadoop-3.1.3]# jps
3364 NodeManager
8132 Jps
3210 ResourceManager
2990 DataNode
[root@hadoop102 hadoop-3.1.3]# jps
3056 DataNode
3154 SecondaryNameNode
3336 NodeManager
7230 Jps
常见错误及解决方案
1)防火墙没关闭、或者没有启动YARN
INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
2)主机名称配置错误
3)IP地址配置错误
4)ssh没有配置好
5)root用户和atguigu两个用户启动集群不统一
6)配置文件修改不细心
7)不识别主机名称
java.net.UnknownHostException: hadoop102: hadoop102
at java.net.InetAddress.getLocalHost(InetAddress.java:1475)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:146)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
解决办法:
(1)在/etc/hosts文件中添加192.168.10.102 hadoop102
(2)主机名称不要起hadoop hadoop000等特殊名称
8)DataNode和NameNode进程同时只能工作一个。
9)执行命令不生效,粘贴Word中命令时,遇到-和长–没区分开。导致命令失效
解决办法:尽量不要粘贴Word中代码。
10)jps发现进程已经没有,但是重新启动集群,提示进程已经开启。
原因是在Linux的根目录下/tmp目录中存在启动的进程临时文件,将集群相关进程删除掉,再重新启动集群。
11)jps不生效
原因:全局变量hadoop java没有生效。解决办法:需要source /etc/profile文件。
12)8088端口连接不上
[atguigu@hadoop102 桌面]$ cat /etc/hosts
注释掉如下代码
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 hadoop102
第二章Linux安装Python3
1、先查看系统python的位置在哪
whereis python
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-akMXpdmX-1639641787981)(C:Users86157AppDataLocalTemps8082686986.png)]
python2.7默认安装是在 /usr/bin目录中,切换到/usr/bin/
cd /usr/bin/
ll python*
从下面的图中我们可以看到,python指向的是python2,python2指向的是python2.7,因此我们可以装个python3,然后将python指向python3,然后python2指向python2.7,那么两个版本的python就能共存了。
2、下载python3的包之前,要先安装相关的依赖包,用于下载编译python3:
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
运行了以上命令以后,就安装了编译python3所用到的相关依赖
3、默认的centos7是没有安装pip,先添加epel扩展源
yum -y install epel-release
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ioPbqZWm-1639641787981)(C:Users86157AppDataLocalTemps8082943629.png)]
4、安装pip
yum install python-pip
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NxKtRCte-1639641787982)(C:Users86157AppDataLocalTemps8082913977.png)]
5、用pip装wget
pip install wget
6、用wget下载python3的源码包,或者自己先下载好,上传到服务器再安装,如果网络快可以直接安装
wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
7、编译python3源码包,解压
xz -d Python-3.6.8.tar.xz
tar -xf Python-3.6.8.tar
8、进入解压后的目录,依次执行下面命令进行手动编译
cd Python-3.6.8
./configure prefix=/usr/local/python3
make && make install
9、安装依赖zlib、zlib-deve
yum install zlib zlib
yum install zlib zlib-devel
10、最后没提示出错,就代表正确安装了,在/usr/local/目录下就会有python3目录
11、添加软链接,将原来的链接备份
mv /usr/bin/python /usr/bin/python.bak
12、添加python3的软链接
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python
13、测试是否安装成功了
python -V
14、更改yum配置,因为其要用到python2才能执行,否则会导致yum不能正常使用
vi /usr/bin/yum
15、把第一行的#! /usr/bin/python 修改为如下
#! /usr/bin/python2
16、还有一个地方也需要修改
vi /usr/libexec/urlgrabber-ext-down
17、把第一行的#! /usr/bin/python 修改如下
#! /usr/bin/python2
18、启动python2
python2
19、启动python3
python
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-woCFJ3QO-1639641787983)(C:Users86157AppDataLocalTemps8086692414.png)]
参考文档centos安装python3详细教程_知行合一-CSDN博客_centos python
第三章集成python
任务目的: 统计单词数量
准备工作:
# 创建word.txt
vi word.txt
# 在word.txt中添加几行单词
hadoop is good
spark is fast
spark is better
python is basics
java also good
hbase is nosql
mysql is relational database
mongdb is nosql
relational database or nosql is good
# 将word.txt上传到hdfs的data文件夹下
hadoop dfs -put word.txt /data
map代码
# !/usr/bin/env python
import sys
words=[]
for i in sys.stdin:
i=i.strip()
word=i.split(" ")
words.append(word)
for i in words:
for j in i:
print(j,1)
reduce代码
# !/usr/bin/env python
from operator import itemgetter
import sys
words=[]
num=[]
index=-1
for i in sys.stdin:
word=i.strip()
word=word.split(" ")
word[1]=int(word[1])
for i in range(len(words)):
if(words[i][0]==word[0]):
index=i
if(index==-1):
words.append(word)
if(index!=-1):
words[index][1]+=1
index=-1
for i in words:
print(i)
cat word.txt |python map.py|python reduce.py
['hadoop', 1]
['is', 8]
['good', 3]
['spark', 2]
['fast', 1]
['better', 1]
['python', 1]
['basics', 1]
['java', 1]
['also', 1]
['hbase', 1]
['nosql', 3]
['mysql', 1]
['relational', 2]
['database', 2]
['mongdb', 1]
['or', 1]
hadoop运行mapreduce
说明:mapreduce支持除java以外其他语言进行开发,需要使用_hadoop-streaming-2.7.3.jar_ 这个计算框架运行mapreuce任务。
# 运行mapreduce任务
hadoop jar share/hadoop/tools/lib/hadoop-streaming-3.1.3.jar -files /root/map.py,/root/reduce.py -mapper "python /root/map.py" -reducer "python /root/reduce.py" -input /input -output /out_python
//参数说明 hadoop jar +hadoop-streaming-2.7.3.jar所在路径 -file+
编写的map与reduce代码文件所在路径 -mapper +执行map文件命令 -reducer +执行reduce文件命令 -input +输入文件在hdfs的路径 -output +输出文件所在hdfs的路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eZyaPxTX-1639641787983)(C:Users86157Desktoppytest并发编程python调用hadoop成功.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5UGVxQNl-1639641787984)(C:Users86157AppDataLocalTemps9640868477.png)]
参考文档:
(6条消息) mapreduce(python开发)_小爽123的博客-CSDN博客_mapreduce python
(6条消息) Linux系统安装Python3环境(超详细)_L-CSDN博客_linux安装python
index=i
if(index==-1):
words.append(word)
if(index!=-1):
words[index][1]+=1
index=-1
for i in words:
print(i)
cat word.txt |python map.py|python reduce.py
[‘hadoop’, 1]
[‘is’, 8]
[‘good’, 3]
[‘spark’, 2]
[‘fast’, 1]
[‘better’, 1]
[‘python’, 1]
[‘basics’, 1]
[‘java’, 1]
[‘also’, 1]
[‘hbase’, 1]
[‘nosql’, 3]
[‘mysql’, 1]
[‘relational’, 2]
[‘database’, 2]
[‘mongdb’, 1]
[‘or’, 1]
**hadoop运行mapreduce**
说明:mapreduce支持除java以外其他语言进行开发,需要使用*hadoop-streaming-2.7.3.jar* 这个计算框架运行mapreuce任务。
运行mapreduce任务
hadoop jar share/hadoop/tools/lib/hadoop-streaming-3.1.3.jar -files /root/map.py,/root/reduce.py -mapper “python /root/map.py” -reducer “python /root/reduce.py” -input /input -output /out_python
//参数说明 hadoop jar +hadoop-streaming-2.7.3.jar所在路径 -file+
编写的map与reduce代码文件所在路径 -mapper +执行map文件命令 -reducer +执行reduce文件命令 -input +输入文件在hdfs的路径 -output +输出文件所在hdfs的路径
[外链图片转存中...(img-eZyaPxTX-1639641787983)]
[外链图片转存中...(img-5UGVxQNl-1639641787984)]
在完成作业之后我将文档上传到了我的个人博客
[利用python集成hadoop实现并行计算.md - 小岚](http://8.142.109.15:8090/archives/%E5%88%A9%E7%94%A8python%E9%9B%86%E6%88%90hadoop%E5%AE%9E%E7%8E%B0%E5%B9%B6%E8%A1%8C%E8%AE%A1%E7%AE%97md)
参考文档:
[(6条消息) mapreduce(python开发)_小爽123的博客-CSDN博客_mapreduce python](javascript:void(0))
[(6条消息) Linux系统安装Python3环境(超详细)_L-CSDN博客_linux安装python](javascript:void(0))
[(6条消息) Hadoop的安装和使用_战 胜的博客-CSDN博客_hadoop安装](https://blog.csdn.net/qq_45021180/article/details/104640540?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163964121216780274173287%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163964121216780274173287&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-104640540.pc_search_insert_es_download&utm_term=%E5%AE%89%E8%A3%85hadoop&spm=1018.2226.3001.4187)