Hadoop
Hadoop 是Apache基金会提供的一个开源的分布式存储和分析计算平台。它为我们提供了一个可靠的且可扩展的存储分析平台,可靠性在于它的数据备份带来的安全,可扩展在于其分布式存储特性,通过增加存储节点来扩展存储上限。
分布式思想
用更多更便宜的机器打败单一的更贵的机器。分布式的系统可以通过量的堆积实现硬件资源的扩展。而hadoop负责实现将分布式的机器捆绑到一起,上层无需关心这部分的具体实现,对上层显示的就是一个捆绑了众多机器的硬件资源的一个大机器。
Hadoop官网
http://hadoop.apache.org
Hadoop生态系统
底层是HDFS文件系统,然后通过flume,sqoop,kafka等框架采集信息存储到HDFS中,对HDFS的数据,上层Yarn负责统一的资源管理,还有一些计算框架等等。
Hadoop本地伪分布式部署
本地部署hadoop只需要本地机器和虚拟机系统,是一种伪分布式系统,因为其物理上的硬件仍然在同一台机器,主要用于调试MapReducem,适合在开发初期进行配置。
配置前基本配置信息检查
配置 | 说明 |
宿主机系统 | windows 11 |
虚拟机操作系统 | centos 7 |
虚拟机软件 | VMware |
ssh 工具 | Xshell 8.0(school for free) |
软件包上传路径 | /root/softwares |
软件安装路径 | /usr/local |
JDK | jdk1.8 |
Hadoop | hadoop-3.4.1 |
由于虚拟机会占用大量的磁盘空间,故最好首先在VMware上修改工作区目录。具体修改方式为:编辑--首选项--工作区--虚拟机的默认位置。除此之外可以给虚拟机的内存空间调大使其具备一定灵活性,设置为主机预留最小内存为主机内存的一半:编辑--首选项--内存--预留内存。
虚拟机网络部署
在创建虚拟机时,网络模块选择NAT协议网络,为了保证虚拟机的ip地址固定可用,我们需要修改三个地方,一个是VMware的NAT网络设置,一个是宿主机windows的网络设置,还有一个是虚拟机内部的网卡配置。
VMware:
首先打开虚拟网络编辑器,然后点击 [更改设置]
在这里,我们把NAT模式的子网IP设置为192.168.10.0网段,指示NAT协议要把虚拟机的ip分配到这个网段,同时在【NAT设置】里需要设置网关为192.168.10.2,网关的最后一位一般都为2。然后点击【确定】来应用设置。
windows:
在上面的vmware的配置中,我们可以看到NAT模式用的是VMnet8这块网卡,然后我们需要在windows中修改这块网卡的网络适配器选项。在设置中搜索-【更改网络适配器设置】,然后找到VMnet8,点击更多属性,设置对应的网关和首选DNS,备用DNS可以填写8.8.8.8公共域名解析器。
VM Machine:
在虚拟机里面,我们需要进到网卡的配置文件里面,网卡的配置文件在
/etc/sysconfig/network-scripts/ifcfg-ens33
文件名是网卡设备名,可以通过ifconfig命令查看虚拟机的网络信息,然后找到正确的网卡,其名字就是我们要更改的配置文件名。
这里可以看到第一块网卡就是连接到外部网络的网卡,名为ens33。
通过vim命令打开配置文件
vim /etc/sysconfig/network-scripts/ifcfg-ens33
原先的BOOTPROTO是DHCP,指示ip地址动态分配,这里我们改成静态分配 BOOTPROTO='static'。除此之外把ip地址和网关以及DNS地址都设置好:
IPADDR=192.168.10.100
PREFEX=24
GATEWAY=192.168.10.2
DNS1=192.168.10.2
然后保存退出之后,运用systemctl重启网络
systemctl restart network
然后ping一下百度和宿主机,能相互ping通说明配置成功。
ping baidu.com
ping 10.69.36.231 //这是我本机的ip 地址
能够ping通,则【配置成功】。
除此之外,为了便于我们识别和访问不同的结点,我们会对本机和其他结点命名,由于本次实验是单一结点的伪分布式,我们只需要修改hostname就好了
【vim编辑hostname文件】
vim /etc/hostname
修改本机设备标识名为hadoop100,如图所示
保存退出,重启机器并在终端输入hostname查看修改是否成功:
reboot
hostname
修改成功。
虚拟机本机免密
配置hadoop集群需要涉及跨机器的数据传输,为了高效跨机器访问数据,需要对不同节点配置免密登录。
- ssh秘钥对生成, 使用rsa算法生成秘钥
ssh-keygen -t rsa
- 秘钥生成之后,会在用户的home目录生成一个.ssh隐藏文件夹,进入这个文件夹会有两个文件
cd ~/.ssh
ls -l
-rw-------. 1 root root 1675 11月 30 03:22 id_rsa
-rw-r--r--. 1 root root 396 11月 30 03:22 id_rsa.pub
- 使用ssh-copy-id指令传输秘钥到远程机器,这里我们是单节点伪分布式,故传输本机的host名,后续如果要直接输入其他设备的标识名传输,那还需要在/etc/hosts文件里面编辑添加设备的ip地址和设备名映射,如:
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
这里我们直接把秘钥传到本机就好:
ssh-copy-id hadoop100
然后一直按回车或者输入yes,这时候目标(即本机)的.ssh目录下会出现两个文件,一个是验证文件authorized_keys,另一个是known_hosts。前者是用来验证其他机器要免密登录时的私钥的,后者是标识本设备登录过哪些节点。
至此,免密登录配置完成,通过ssh hadoop100来确定是否需要密码登录,不需要密码则说明配置成功。
hadoop软件环境配置
hadoop是使用java编写的程序,故必然要给节点安装java的环境,这里我们使用java1.8的环境,最好是自己安装,而不是用yum命令,因为hadoop会检查JAVA_HOME的环境变量,如果没有配置,hadoop是会运行报错的。
【java1.8环境配置】
首先找到华为的java镜像网站:
https://repo.huaweicloud.com/java/jdk/
在里面找到最新的java8版本:8u202-b08
然后选择linux需要的x64压缩包:jdk-8u202-linux-x64-tar.gz
https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
在虚拟机里,cd到软件的存放目录,并解压软件包:
cd /root/softwares //这是我提前创建的,没有的话需要创建
wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local //-C解压重定向到软件安装目录
mv /usr/local/jdk1.8.0_202 /usr/local/jdk-1.8.0 //改个名称
然后配置系统环境变量:
vim /etc/profile
插入以下几行(必须):
export JAVA_HOME=/usr/local/jdk-1.8.0 #注意等号两边不要有空格
export PATH=$PATH:$JAVA_HOME/bin
随后保存退出,用source命令激活
source /etc/profile
java -version看一下是否配置成功
java -version
【配置成功】
【hadoop环境配置】
我们首先去到清华的hadoop镜像站下载hadoop3.4.1
https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.4.1/hadoop-3.4.1.tar.gz
下载之后,复制到虚拟机,注意vmware的复制功能不是很好用,会缺掉文件的大部分,故用winscp等scp工具来复制文件。
我们已经复制文件到~/softwares目录下之后,解压软件包:
tar -zxvf hadoop-3.4.1.tar.gz -C /usr/local/
然后配置环境变量信息:
vim /etc/profile
插入以下环境变量:
#hadoop_home
export HADOOP_HOME=/usr/local/hadoop-3.4.1
export PATH=$PATH:$HADOOP_HOME/sbin //集群管理脚本
export PATH=$PATH:$HADOOP_HOME/bin //hdfs基本指令
同样退出保存,并source激活
source /etc/profile
输入hadoop命令查看是否配置成功
hadoop version
出现如上结果代表【配置成功】
hadoop集群启动配置信息
cd 到hadoop的安装目录:
cd $HADOOP_HOME //这里是我之前在环境变量已经配置好了,没有配置的需要自己去找安装路径
ls
bin include libexec licenses-binary logs NOTICE.txt sbin tmp
etc lib LICENSE-binary LICENSE.txt NOTICE-binary README.txt share
这里我们需要修改的是etc下的配置信息,故cd到对应目录
cd etc/hadoop/
这里主要要修改三个文件:core-site.xml,hdfs-site.xml,hadoop.env.sh
vim core-site.xml
插入以下信息:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop100:9820</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-3.4.1/tmp</value>
</property>
</configuration>
同理,针对hdfs-site.xml,插入以下信息:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop100:9868</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop100:9870</value>
</property>
</configuration>
这里9870是主节点的http访问端口,可以在web上通过hadoop100的ip地址的9870端口来查看集群和hdfs的信息。
replication是备份的意思,表示要每个节点的文件备份几份,这里是伪分布式,备份几份没有意义,简单设置为1即可。
最后针对hadoop.env.sh,添加如下信息:
##JAVA_HOME
export JAVA_HOME=/usr/local/jdk-1.8.0
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
这里指示了JAVA_HOME以及在主节点,次节点和数据节点上登录的用户角色,这里设置为root确保最高权限。
全部配置完成后保存退出。
启动集群
格式化集群(格式化集群之前保证我们在core-site.xml里面设置的hadoop.tmp.dir目录不存在,如果存在要么删掉要么重新设置一个不存在的目录),相当于初始化:
hdfs namenode -format
输入以下命令启动集群:
start-dfs.sh
jps //查看确实有对应java进程的运行
集群启动之后,就可以通过浏览器访问对应的端口来访问hadoop集群了
http://192.168.10.100:9870/
点击Utilities-Browse the file system 来查看hdfs文件系统:
如果浏览器有界面则说明集群【启动成功】
词频统计案例-hdfs测试案例
这里我们通过一个官方的案例来使用hdfs
首先我们构建输入文件夹
cd ~
mkdir input
cd input
echo "a b c d e f g" >> file1 //给file1一些初始输入
for i in {1..100};do cat file1 >> file2; done//把file1的内容拷贝100份到file2,注意;的位置
ls -l
hdfs不是用的linux的文件系统,所以我们需要先把input文件夹上传到hdfs里面才能使用
上传指令 -put
cd ..
hdfs dfs -put input /input
在浏览器已经可以看到我们的input文件夹了
然后运行hdfs的案例jar包的程序来实现词频统计:
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.1.jar wordcount /input /output
注意我们刚刚把input文件夹放到了hdfs的/input里,所以这里实际上的输入是/input 输出是/output,执行前确保输出目录不存在,否则无法执行。
等待执行结束之后,查看文件
hdfs dfs -cat /output/*
MapReduce成功利用hdfs执行了词频统计的功能。