最近想学大数据的东西,那首先就要部署一个Hadoop环境,看了看官网,现在已经3.3.x、3.2.x、3.1.x、2.x.x版本,虽然最近都有更新,但就着不是最新的也不是最旧的原则,选择了3.2.2版本。网上也有很多部署教程,参考多份教程、文档,部署过程中总会多少有些问题,这里记录一下自己的部署过程,保证按照步骤肯定能够使用最基本的Hdfs和Mapreduce功能,至于后续更深入的应用,等学到的时候再开新文进行补充。
一、使用 VMware Workstation 15 Pro 15.5.1版本(下称VM)安装CentOS7(CentOS Linux release 7.9.2009),命名为 hadoop-master,IP设为 192.168.0.245。此处过程略,可参考网上的教程。
二、上传并安装JDK和Hadoop
2.1.在 /root 目录下创建 目录 app,通过XFtp将 JDK(jdk-8u281-linux-x64.tar.gz) 和 Hadoop(hadoop-3.2.2.tar.gz)上传至 /root/app/目录下。
2.2.安装JDK 和 Hadoop。
2.2.1.命令:cd /root/app 进入 /root/app/ 目录。
2.2.2.命令:tar -zxvf /root/app/jdk-8u281-linux-x64.tar.gz 解压 jdk-8u281-linux-x64.tar.gz,解压后的JDK目录为 /root/app/jdk1.8.0_281
2.2.3.命令:tar -zxvf /root/app/hadoop-3.2.2.tar.gz 解压 hadoop-3.2.2.tar.gz,解压后的Hadoop目录为 /root/app/hadoop-3.2.2。
2.2.4.配置环境变量,命令:vi /etc/profile 编辑 profile 文件,在文件末尾添加如下内容,保存。
export HADOOP_HOME=/root/app/hadoop-3.2.2
export JAVA_HOME=/root/app/jdk1.8.0_281
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=$PATH:${JAVA_HOME}/bin:${JRE_HOME}/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
2.2.5.命令:source /etc/profile 使新的环境变量生效。
2.2.6.通过 java -version 和 hadoop version 查看版本信息,如下图成功。
2.3. 关闭防火墙。
命令:systemctl stop firewalld.service 关闭防火墙。
命令:systemctl disable firewalld.service 禁用防火墙,防止虚拟机重启后防火墙自动开启。
命令:systemctl status firewalld.service 查看防火墙状态。
2.4.关闭 SELINUX 。
命令:setenforce 0 关闭 SELINUX。
命令:vi /etc/selinux/config 编辑 config 文件,设置 SELINUX=disabled ,保存。
2.5.虚拟机关机。
三、VM克隆hadoop-master,做另外两个虚拟机(创建完整克隆),分别命名为 hadoop-slave1 和 hadoop-slave2,IP分别设为 192.168.0.246 和 192.168.0.247。三台虚拟机对应IP如下。
hadoop-master 192.168.0.245
hadoop-slave1 192.168.0.246
hadoop-slave2 192.168.0.247
四、设置hostname 和 hosts(以 hadoop-master 为例)
4.1.远程登录到 hadoop-master 虚拟机。
4.2.命令:vi /etc/hostname 编辑 hostname 文件,将 localhost.localdomain 改成 hadoopmaster 后保存(hostname 尽量用全小写,否则,后续使用中会出现链接点击无法跳转的问题,其余虚拟机同理)。
4.3.命令:vi /etc/hosts 编辑 hosts 文件,在文件末尾增加如下内容后保存。
192.168.0.245 hadoopmaster
192.168.0.246 hadoopslave1
192.168.0.247 hadoopslave2
4.4.远程登录到 hadoop-slave1 虚拟机,同 4.2. 将 hostname 文件内容改成 hadoopslave1 后保存,同 4.3. 在 hosts 文件末尾增加 4.3. 一样的内容并保存。
4.4.远程登录到 hadoop-slave2 虚拟机,同 4.2. 将 hostname 文件内容改成 hadoopslave2 后保存,同 4.3. 在 hosts 文件末尾增加 4.3. 一样的内容并保存。
4.5.重启三台虚拟机,三台虚拟机网络设置如下。
虚拟机 | IP | hostname | hosts末尾追加 |
hadoop-master | 192.168.0.245 | hadoopmaster | 192.168.0.245 hadoopmaster 192.168.0.246 hadoopslave1 192.168.0.247 hadoopslave2 |
hadoop-slave1 | 192.168.0.246 | hadoopslave1 | 192.168.0.245 hadoopmaster 192.168.0.246 hadoopslave1 192.168.0.247 hadoopslave2 |
hadoop-slave2 | 192.168.0.247 | hadoopslave2 | 192.168.0.245 hadoopmaster 192.168.0.246 hadoopslave1 192.168.0.247 hadoopslave2 |
五、启动hadoop-master、hadoop-slave1、hadoop-slave2 三台虚拟机,修改 hadoop-master 虚拟机中 Hadoop 配置文件并将修改后的 Hadoop 拷贝到 hadoop-slave1、hadoop-slave2虚拟机上。
5.1.远程登录 hadoop-master 虚拟机。命令:cd /root/app/hadoop-3.2.2/etc/hadoop 进入目录。
5.2.命令:vi hadoop-env.sh 修改 hadoop-env.sh 文件并保存。可以不管原配置文件,直接在末尾增加如下内容。
export JAVA_HOME=/root/app/jdk1.8.0_281
export HADOOP_HOME=/root/app/hadoop-3.2.2
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export HADOOP_PID_DIR=${HADOOP_HOME}/tmp
export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
说明:_USER相关的设置如果不加,在启动 Hadoop 时会报找不到相关设置的错误,所以要加。
_PID_DIR 和 _LOG_DIR 设置好后,如果没有相关目录,可以自己创建相关目录。
HDFS_DATANODE_SECURE_USER 需要注释掉,打开在启动过程中会出错误。
HDFS_NFS3_SECURE_USER 可以设置也可以不设置,在我们这种应用中没有影响。
5.3.命令:vi core-site.xml 修改 core-site.xml 文件并保存。内容如下。
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/root/app/hadoop-3.2.2/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoopmaster:9000</value>
</property>
</configuration>
5.4.命令:vi hdfs-site.xml 修改 hdfs-site.xml 文件并保存。内容如下。
<configuration>
<!-- dfs.namenode.http-address 不用设置,
dfs.namenode.secondary.http-address 需要设置,并设置到 hadoopmaster,否则查看 NameNode会有问题 -->
<!--<property>
<name>dfs.namenode.http-address</name>
<value>hadoopmaster:50070</value>
</property>-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoopmaster:50090</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/root/app/hadoop-3.2.2/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/root/app/hadoop-3.2.2/tmp/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
5.5.命令:vi yarn-site.xml 修改 yarn-site.xml 文件并保存。内容如下。
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoopmaster</value>
</property>
<!-- 开启日志聚合,各节点日志会同步到master上,后会删除各节点日志 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
5.6.命令:vi mapred-site.xml 修改 mapred-site.xml 文件并保存。内容如下。
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoopmaster:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoopmaster:19888</value>
</property>
<!-- 以下设置为Mapreduce需要的配置,没有设置在Mapreduce计算时会报错 -->
<property>
<name>mapreduce.admin.user.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</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>
</configuration>
5.7.命令:vi workers 修改 workers 文件并保存。将两个从机 hadoopslave1 和 hadoopslave2 替换原内容,如下。
hadoopslave1
hadoopslave2
5.8.将 hadoop-master 虚拟机上的 Hadoop 复制到 hadoop-slave1 和 hadoop-slave2 两台虚拟机上。
命令:scp -r /root/app/hadoop-3.2.2/ root@hadoopslave1:/root/app/ 将 hadoop-3.2.2 目录拷贝到 hadoop-slave1 虚拟机 /root/app/ 目录下。
命令:scp -r /root/app/hadoop-3.2.2/ root@hadoopslave2:/root/app/ 将 hadoop-3.2.2 目录拷贝到 hadoop-slave2 虚拟机 /root/app/ 目录下。
注意:第一次拷贝时会有如下提示,输入 yes 即可。由于我们尚未使用SSH免密,因此传输时需要输入虚拟机的登录密码。
六、设置SSH免密
6.1.远程登录 hadoop-master、hadoop-slave1、hadoop-slave2 三台虚拟机。
6.2.以 hadoop-master 虚拟机为例,创建公私钥。
进入 /root 目录。
注意:由于是新的虚拟机,也从来没有用过ssh,因此,直接做即可。如果以前做过,则需要先找到 .ssh/ 目录,并删除其内所有文件。
命令:ssh-keygen -t rsa 创建公钥、私钥,过程中一路回车即可。如下图,生成后的公私钥文件在 /root/.ssh/ 目录下。
进入 /root/.ssh/ 目录。
命令:mv id_rsa.pub id_rsa_master.pub 修改公钥文件名为 id_rsa_master.pub 。
命令:cat id_rsa_master.pub >> authorized_keys 将公钥写入 authorized_keys 文件。
同样,在 hadoop-slave1 和 hadoop-slave2 虚拟机上的 /root/ 目录下 执行上述命令,创建公私钥。在 hadoop-slave1 虚拟机上将 /root/.ssh/ 目录下的 id_rsa.pub 改名为 id_rsa_slave1.pub,并写入 authorized_keys 文件。 在 hadoop-slave2 虚拟机上将 /root/.ssh/ 目录下的 id_rsa.pub 改名为 id_rsa_slave2.pub,并写入 authorized_keys 文件。
6.3.将公钥传到相互虚拟机并写入 authorized_keys 文件。
6.3.1.将 hadoop-master 虚拟机的 id_rsa_master.pub 传到 hadoop-slave1 和 hadoop-slave2 虚拟机并写入 authorized_keys 文件。
命令:scp id_rsa_master.pub root@hadoopslave1:/root/.ssh/
命令:scp id_rsa_master.pub root@hadoopslave2:/root/.ssh/
进入到 hadoop-slave1 虚拟机的 /root/.ssh/ 目录,通过命令:cat id_rsa_master.pub >> authorized_keys 将公钥写入 authorized_keys 文件。
进入到 hadoop-slave2 虚拟机的 /root/.ssh/ 目录,通过命令:cat id_rsa_master.pub >> authorized_keys 将公钥写入 authorized_keys 文件。
6.3.2.同 6.3.1. 将 hadoop-slave1 虚拟机的 id_rsa_slave1.pub 传到 hadoop-master 和 hadoop-slave2 虚拟机并将其写入各自的 authorized_keys 文件。
6.3.3.同 6.3.1. 将 hadoop-slave2 虚拟机的 id_rsa_slave2.pub 传到 hadoop-master 和 hadoop-slave1 虚拟机并将其写入各自的 authorized_keys 文件。
七、启动Hadoop
7.1.首次使用HDFS,必须首先进行格式化。命令:hdfs namenode -format 。
7.2.启动Hadoop。
命令:start-dfs.sh
命令:start-yarn.sh
命令:mapred --daemon start historyserver
7.3.关闭Hadoop。
命令:stop-dfs.sh
命令:stop-yarn.sh
命令:mapred --daemon stop historyserver
7.4.查看启动是否成功。
命令:jps
hadoopmaster 存在如下进程
hadoopslave1 和 hadoopslave2 存在如下进程
7.5.打开浏览器,查看相关信息监控。
注意:需要在浏览器所在主机同 4.3. 添加 hosts,否则,页面中的链接点击会访问不了。Windows系统则改 C:\Windows\System32\drivers\etc\hosts 文件。
http://192.168.0.245:9870/ 查看 NameNode 监控。
http://192.168.0.245:19888/ 查看 MapReduce JobHistory Server 监控。
http://192.168.0.245:8088/ 查看 ResourceManager 监控。
八、测试 Mapreduce。
8.1.进入 /root/app/hadoop-3.2.2/share/hadoop/mapreduce/ 目录。下边以网上常用的两个示例来测试。
8.2.测试 PI 的计算。
命令:hadoop jar hadoop-mapreduce-examples-3.2.2.jar pi 10 10
8.3.测试 WordCount 统计单词出现数量。
创建目录 /root/app/mapreduce-test/ 目录,在其内创建文件 wordcounttestinput.txt。内容如下:
命令:hadoop fs -mkdir /tmp/input 在 HDFS 中创建目录。
注意:mkdir 时候要在 /tmp 下进行创建,其他目录会报错,猜测由于 hadoop.tmp.dir 设置到了 tmp 目录,但具体原因仍需要继续查。
命令:hadoop fs -put /root/app/mapreduce-test/wordcounttestinput.txt /tmp/input 将测试文件上传到 HDFS 的 /tmp/input/ 目录下。
命令:hadoop jar hadoop-mapreduce-examples-3.2.2.jar wordcount /tmp/input/ /tmp/output 进行计算。
注意:/tmp/input 是参与统计的目录下所有文件,/tmp/output 是结果所在的文件夹。
命令:hdfs dfs -ls /tmp/output 查询结果目录下的结果文件。
命令:hadoop fs -text /tmp/output/part-r-00000 显示结果文件内容。
8.4.http://192.168.0.245:19888/ 查看 MapReduce JobHistory Server 中刚刚两个任务的结果。
8.5.
九、Hadoop 安装完成。通过不断尝试,按此配置可以使 Hadoop 正常启动、使用,但仍需要继续学习、了解细节,等后续有新的进展后,继续更新。