我正在参加「掘金·启航计划」
介绍一下:
本文主要内容是,在 centos 系统上,安装 jdk 和 hadoop 集群,学习 HDFS 的基本操作,以动手实践为主要内容。
准备工作
一、环境准备
-
准备 3 台 Linux 虚拟机,或者同一内网下的服务器
172.18.234.50 master 172.18.234.52 slave1 172.18.234.47 slave2 -
修改主机名
通过下述命令查看主机名称
hostname修改主机名称为master
方法一
hostnamectl set-hostname master方法二
修改配置文件修改主机名,将原有内容删除然后输入名称 master 即可
vi /etc/hostname断开重新连接,在查看主机名称。同理配置其它两台机器,分别设置主机名为slave1,slave2
-
添加域名映射
修改hosts文件,添加所有主机IP地址和主机名对应关系。
vi /etc/hosts输入下述内容(根据自己的IP进行修改)
格式为: 主机IP 制表符 主机名 172.18.234.50 master 172.18.234.52 slave1 172.18.234.47 slave2修改完成后,用cat命令 查看hosts文件内容
cat /etc/hosts同理,把修改的内容复制到slave1、slave2的hosts文件
二、实现 SSH 无密码登入
-
使用命令生成服务器密钥(输完命令按四次回车,三台机器均需要操作)
ssh-keygen输完命令按四次回车,结果如下
[root@master ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:wj6K0hg7YCuubpow/PcSZDq/t4vdOa8yHjNxwect46k root@master The key's randomart image is: +---[RSA 2048]----+ | | | . | | o . | | + + . | | + o.S. + . | |+. o o .o . + | |=*. o ++ o | |B=o. =o==.o | |@=..oo**=E+. | +----[SHA256]-----+ [root@master ~]# -
进入.ssh/目录,查看生成的密钥
cd /root/.ssh/ ll文件夹内容如下
总用量 12 -rw-------. 1 root root 393 10月 14 02:57 authorized_keys -rw-------. 1 root root 1675 10月 14 03:01 id_rsa -rw-r--r--. 1 root root 393 10月 14 03:01 id_rsa.pub -
使用 ssh-copy-id 命令拷贝公钥到目标主机:
所有节点都需进行下列操作(操作时有提示,输入yes)
执行这条命令后,就可以 ssh 免密登入目标主机
ssh-copy-id master ssh-copy-id slave1 ssh-copy-id slave2 -
使用ssh登录目标主机 (发现三台结点间可以任意互通,不再需要输入密码,登录后,输入exit可退回自己的主机)
示例:进入slave1
ssh slave1 -
退出slave1结点,回到master结点
exit
三、命令同步脚步
-
创建脚本存储目录
mkdir /root/bin/ -
创建命令同步脚本文件
cd /root/bin/ vi xcall -
输入以下代码
#!/bin/bash if(($#==0)) then echo "请输入参数" exit; fi echo "----------------master-----------------" ssh master $@ for((i=1;i<3;i++)) do echo "----------------slave$i-----------------" ssh slave$i $@ done echo "命令已执行完毕" -
赋予脚本权限
chmod 777 xcall -
在配置文件,末尾追加下列代码
echo 'source /etc/profile' >> /root/.bashrc
以上操作必须在三台机器都要执行。
-
测试脚本是否可以使用
cd /root/ xcall ls /root/bin/
四、文件同步脚本
-
进入创建的/root/bin 目录
cd /root/bin -
创建文件同步脚本文件
vi xsync -
输入下列代码
#!/bin/bash if(($#!=1)) then echo "只能输入一个参数" exit; fi dirpath=$(cd -P `dirname $1`;pwd) filename=$(basename $1) echo "-----------------master--------------" rsync -rvlt $dirpath/$filename root@master:$dirpath for((i=1;i<3;i++)) do echo "-----------------slave$i----------------" rsync -rvlt $dirpath/$filename root@slave$i:$dirpath done echo "命令执行完毕" -
赋予脚本权限
chmod 777 xsync -
使用文件同步脚本将文件同步脚本分发到另外两台机器
xsync xsync
可以到其他节点的 /root/bin 目录下查看文件是否分发成功。
注意:执行同步文件命令之前,在相同目录下先创建文件夹 (或者加上文件夹绝对路径在同步)
五、 Linux scp命令
Linux scp 命令用于 Linux 之间复制文件和目录。
scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。
-
简易写法:
scp [可选参数] file_source file_target -
从本地复制到远程
复制目录命令格式:
scp -r local_folder remote_username@remote_ip:remote_folder -
从远程复制到本地
从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可,如下实例
scp root@maste:/home/root/others/music /home/space/music/1.mp3
注意说明
-
如果远程服务器防火墙有为scp命令设置了指定的端口,我们需要使用 -P 参数来设置命令的端口号,命令格式如下:
scp 命令使用端口号 4588
scp -P 4588 remote@master:/usr/local/sin.sh /home/administrator -
使用scp命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则scp命令是无法起作用的
实例操作:
-
将 1.txt 文件,复制到远程服务器,home / slave1 目录下
scp -r 1.txt slave1:/home/slave1 -
将 master 目录,复制到远程服务器,home / slave1 目录下
scp -r master/ slave1:/home/slave1
其中 -r 意思是,递归复制整个目录。-P port ,注意是大写的P, port是指定数据传输用到的端口号。
六、目录和镜像站
-
创建两个目录,用来存放软件和安装包的目录
mkdir -p /usr/local/software && mkdir -p /usr/local/install_pack -
北京外国语大学开源软件镜像站
https://mirrors.bfsu.edu.cn/
安装 JDK
一、下载和配置 JDK
-
进入安装包目录 install_pack
cd /usr/local/install_pack -
执行以下命令,下载JDK1.8安装包。
wget https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz -
执行以下命令,解压下载的JDK1.8安装包。
tar -zxvf openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz -C /usr/local/software/ -
执行以下命令,进入软件包目录,并重命名JDK包。
cd /usr/local/software && mv java-se-8u41-ri java8 -
执行以下命令,配置Java环境变量。
echo 'export JAVA_HOME=/usr/local/software/java8' >> /etc/profile echo 'export PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile source /etc/profile -
执行以下命令,查看Java是否成功安装。
java -version如果返回以下信息,则表示安装成功。
openjdk version "1.8.0_41" OpenJDK Runtime Environment (build 1.8.0_41-b04) OpenJDK 64-Bit Server VM (build 25.40-b25, mixed mode)
二、复制到其它服务器上
-
使用脚本同步,拷贝整个软件包目录 software 包含 java 解压包至其它服务器,slave1,slave2
xsync /usr/local/software/ -
拷贝配置环境变量文件,至其它服务器,slave1,slave2
xsync /etc/profile -
Ssh 进入 slave1,slave2 服务器,重新加载配置文件,并查看 java 是否配置成功
source /etc/profile -
执行命令同步脚步,查看进程
xcall jps结果如下
----------------master----------------- 2135 Jps ----------------slave1----------------- 1976 Jps ----------------slave2----------------- 1948 Jps 命令已执行完毕
安装 Hadoop
一、安装 hadoop
-
进入安装包目录 install_pack
cd /usr/local/install_pack -
执行以下命令,下载 Hadoop 安装包。
wget --no-check-certificate https://mirrors.bfsu.edu.cn/apache/hadoop/common/hadoop-3.2.3/hadoop-3.2.3.tar.gz -
执行以下命令,解压 Hadoop 安装包至 /usr/local/software/。
tar -zxvf hadoop-3.2.3.tar.gz -C /usr/local/software/ -
执行以下命令,进入软件包目录,并重命名 hadoop 包。
cd /usr/local/software && mv hadoop-3.2.3 hadoop -
执行以下命令,配置 Hadoop 环境变量。
echo 'export HADOOP_HOME=/usr/local/software/hadoop/' >> /etc/profile echo 'export PATH=$PATH:$HADOOP_HOME/bin' >> /etc/profile echo 'export PATH=$PATH:$HADOOP_HOME/sbin' >> /etc/profile source /etc/profile -
执行以下命令,修改配置文件 yarn-env.sh 和 hadoop-env.sh 和 mapred-env.sh ,设置JDK安装目录
echo "export JAVA_HOME=/usr/local/software/java8" >> /usr/local/software/hadoop/etc/hadoop/yarn-env.sh echo "export JAVA_HOME=/usr/local/software/java8" >> /usr/local/software/hadoop/etc/hadoop/hadoop-env.sh echo "export JAVA_HOME=/usr/local/software/java8" >> /usr/local/software/hadoop/etc/hadoop/mapred-env.sh -
执行以下命令,测试 Hadoop 是否安装成功。
hadoop version如果返回以下信息,则表示安装成功。
Hadoop 3.2.3 Source code repository https://github.com/apache/hadoop -r abe5358143720085498613d399be3bbf01e0f131 Compiled by ubuntu on 2022-03-20T01:18Z Compiled with protoc 2.5.0 From source with checksum 39bb14faec14b3aa25388a6d7c345fe8 This command was run using /usr/software/hadoop-3.2.3/share/hadoop/common/hadoop-common-3.2.3.jar
二、配置 Hadoop 指定 HDFS 主节点:
-
修改 Hadoop 配置文件 core-site.xml。
a. 执行以下命令开始进入编辑页面。
vi /usr/local/software/hadoop/etc/hadoop/core-site.xmlb. 输入i进入编辑模式。
c. 在
<configuration></configuration>节点内插入如下内容。<!-- 指定 hadoop 临时目录 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/software/hadoop/cloud</value> <description>location to store temporary files</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://master:8020</value> </property>d. 按Esc键退出编辑模式,输入:wq保存退出。
三、指定 HDFS 从节点,
-
修改 Hadoop 配置文件 hdfs-site.xml。
a. 执行以下命令开始进入编辑页面。
vi /usr/local/software/hadoop/etc/hadoop/workersb. 输入i进入编辑模式。
将下列代码追加到文件末尾,同时删除 localhost
master slave1 slave2
四、配置 yarn-site.xml
-
添加在 configuration 标签之间
vi /usr/local/software/hadoop/etc/hadoop/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>master</value> </property>
五、配置 mapred-site.xml
-
添加在 configuration 标签之间
vi /usr/local/software/hadoop/etc/hadoop/mapred-site.xml添加下列代码
<!-- 指定 MR 运行在 Yarn 上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property>
六、配置文件 hdfs-site.xml。
-
执行以下命令开始进入编辑页面。
vi /usr/local/software/hadoop/etc/hadoop/hdfs-site.xml -
在
<configuration></configuration>节点内插入如下内容。<!-- 指定 Hadoop 辅助名称节点主机配置 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>slave2:50090</value> </property> <property> <name>dfs.replication</name> <value>3</value> <description>设置副本数</description> </property> <!--配置 namenode 的 web 界面--> <property> <name>dfs.namenode.http-address</name> <value>master:50070</value> </property> -
按Esc键退出编辑模式,输入:wq保存退出。
七、复制到集群
-
拷贝整个 hadoop 解压包至其它服务器,slave1,slave2
xsync /usr/local/software/hadoop/
集群环境格式化及启动
一、在master服务器上,格式化主节点
-
执行以下命令,初始化namenode 。
hadoop namenode -format -
在 start-dfs.sh,stop-dfs.sh 两个文件顶部添加以下参数(从第2行开始写)
vi /usr/local/software/hadoop/sbin/start-dfs.sh vi /usr/local/software/hadoop/sbin/stop-dfs.sh添加下列内容
HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root -
start-yarn.sh,stop-yarn.sh 顶部也需添加以下内容
vi /usr/local/software/hadoop/sbin/start-yarn.sh vi /usr/local/software/hadoop/sbin/stop-yarn.sh添加下列内容
YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root -
分发修改后文件(不能直接分发/usr/local/software/hadoop 这个目录如果分发 了这个目录只能重做集群)
xsync /usr/local/software/hadoop/sbin/ -
依次执行以下命令,启动Hadoop。
start-dfs.sh start-yarn.sh -
启动成功后,执行以下命令,查看已成功启动的进程。
xcall jps进程如下
18240 SecondaryNameNode 18001 DataNode 18532 ResourceManager 17860 NameNode 18678 NodeManager 19004 Jps -
退出集群
stop-all.sh -
同步环境变量配置文件
xsync /etc/profile xcall source /etc/profile
HDFS 基本操作
-
查看 HDFS 文件
递归列出 HDFS 根目录下多层文件夹的内容
hadoop fs -ls -R / -
在 HDFS 文件中创建目录/user/hadoop
hadoop fs -mkdir -p /user/hadoop -
删除 HDFS 文件中删除 data 文件夹
hadoop fs -rm -r /data -
上传本地 text.txt 文件到 HDFS 文件的/user/hadoop 目录中
hadoop fs -put /usr/local/hadoop/data/text.txt /user/hadoop -
查看 HDFS 文件中 text.txt 的文件内容
hadoop fs -cat /user/hadoop/text.txt -
下 面 演 示 把 HDFS 文 件 上 的 text.txt 文件下载到本地 download 文件系统中
hadoop fs -get /user/hadoop/text.txt /usr/local/hadoop/data/download/ -
文件权限,把 HDFS 文件上的 text.txt 文件賦予所有权限
hadoop fs -chmod 777 /user/hadoop/text.txt -
查看文件的权限
hadoop fs -ls /user/hadoop/
报错总结
-
报错内容
Exception in thread "main" java.net.ConnectException: Call From master/172.18.232.60 to master:8020 failed on connection exception: java.net.ConnectException: 拒绝连接;解决办法:
域名配置问题,localhost 不能用
vi /usr/local/software/hadoop/etc/hadoop/core-site.xml # 配置下面内容 <property> <name>fs.defaultFS</name> <value>hdfs://master:8020</value> </property> -
hadoop 集群环境多次格式化
启动 DataNode 节点报错
解决办法
找到 hadoop/etc/hadoop/core-site.xml 文件中如下配置, rm -rf cloud/ 删除 value 中的文件夹,重新格式化。
<property> <name>hadoop.tmp.dir</name> <value>/usr/local/software/hadoop/cloud</value> </property>集群进行格式化
hdfs namenode -format