大数据作为目前最主要的业务领域之一,对数据中心硬件的软件生态发展有着重要意义,因此也吸引了众多开发者的重点关注。Hadoop作为开源大数据领域的最核心项目,也成为了各公司重点投入的方向。经过半年的开发和推动,
本文将记录实际安装步骤以及过程中发现的问题,安装完成后将运行几个常见的任务,验证功能性。
hadoop 中,基于 Linux 命令可以给 hdfs 创建文件和文件夹,或者删除文件和文件夹
创建文件的命令为:
hadoop fs -touch /file.txt
创建文件夹的命令为:
hadoop fs -mkdir /filename
删除文件的命令为:
hadoop fs -rm -r /file.txt
删除文件夹的命令为:
hadoop fs -rm -r /filename
1. 下载
Hadoop 3.3.0版本发布后,在项目的下载页面(https://hadoop.apache.org/releases.html)增加了相应的连接,用户可以非常方便的进行下载:
我们的机器为ARM架构的鲲鹏920 CPU,因此下载binary-aarch64软件包:
P.S. util-linux需要升级到最新版本才lscpu功能才能够正常解析CPU具体信息,否则以编码形式呈现
下载:
解压:
tar -xzvf hadoop-3.3.0-aarch64.tar.gz
cd hadoop-3.3.0/
2. 配置Hadoop Core和HDFS
Hadoop支持多种部署方式,我们这里使用伪分布式(Pseudo-Distributed)模式进行部署,以便完整的验证HDFS、YARN、Mapreduce三个部分的功能。
首先修改Hadoop-core和HDFS的配置文件:
etc/hadoop/core-site.xml:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
etc/hadoop/hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
虽然是伪集群式部署模式,各组件间的交互仍然是会使用SSH调用的,为了能够正常相互访问,需要配置本机自己的免密SSH访问:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
通过下面命令检查是否配置成功:
ssh localhost
首先导入JAVA_HOME环境变量,具体路径需要根据自己系统的实际情况进行配置,同时通过Hadoop自带脚本启动Hadoop服务时要将环境变量导入到相应的脚本中:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64/
echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64/" >> etc/hadoop/hadoop-env.sh
初始化文件系统:
bin/hdfs namenode -format
启动Namenode和Datanode服务:
sbin/start-dfs.sh
在HDFS中创建文件目录:
bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/<username>
2.配置YARN
经过上面的配置,以及能够在本地运行MapReduce任务了,为了完整的验证功能,我们还需要配置YARN。
首先,对下面的这些文件进行配置:
etc/hadoop/mapred-site.xml:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration>
etc/hadoop/yarn-site.xml:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</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>
</configuration>
启动ResourceManager和NodeManager守护进程:
sbin/start-yarn.sh
至此,整个安装配置就完成了,可以从 http://localhost:9870/ 和 http://localhost:8088/ 查看HDFS和YARN的管理界面。
3.测试
接下来我们进行一些简单的测试,验证一下Hadoop在ARM架构上的基本功能是否能够正常使用:
1)Wordcount
wordcount是大数据领域的Hello World,运行一个统计文件中单词出现次数的程序,可以用来验证Hadoop集群的基本功能。
首先,在HDFS中创建input命令:
bin/hadoop fs -mkdir /input
可以通过 bin/hadoop fs -ls / 检查上面命令的结果:
统计单词出现的频率需要一个文档作为输入,本目录下的LICENSE.txt就是一个很适合作为输入的文本文件,我们将它上传到HDFS系统中:
bin/hadoop fs -put LICENSE.txt /input
可以通过 bin/hadoop fs -ls /input 检查上面命令的结果:
接下来使用Hadoop自带的wordcount示例程序来计算其中单词的出现频率:
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount /input /output
具体结果如下:
...
通过 bin/hadoop fs -ls / 命令可以看到,HDFS系统中多了 /output 和 /tmp 目录
打开/output命令可以看到有两个文件
打开part-r-00000查看结果:
可以看到,wordcount成功运行了。
2)TeraSort
TeraSort是Hadoop中的的一个排序作业,经常被用来进行性能比拼等测试。TeraSort源码包含很多个java文件,其中可以分为三个部分:TeraGen, TeraSort和TeraValidate。 TeraGen负责生成排序所需的随机数据,TeraSort负责进行排序作业,TeraValidate用来验证排序结果。下面我们就在我们的集群上进行TeraSort测试。
首先,我们用TeraGen生成5GB的测试数据作为输入,由于TeraSort内部以行为单位进行数据生成,每一行的大小为100B,因此需要提前计算好所需要的行数,然后使用Hadoop自带的TeraGen生成相应的测试数据:
rows=$((5*1024*1024*1024/100))
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar teragen -Dmapred.map.tasks=100 ${rows} terasort/tera1-input
通过 bin/hadoop fs -ls /user/kevin/terasort 命令查看结果
接下来对测试数据进行排序:
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar terasort -Dmapred.reduce.tasks=50 terasort/tera1-input terasort/tera1-output
通过 bin/hadoop fs -ls /user/kevin/terasort/tera1-output 命令查看结果
最后,通过TeraValidate来来检验排序输出结果是否是有序的:
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar teravalidate terasort/tera1-output terasort/tera1-validate
4.总结
Hadoop 3.3.0版本提供了ARM版本的软件包,用户从项目官网上下载后只需要经过简单的配置,就可以完成部署,运行Wordcount,TeraSort等实例程序没有出现问题。后续会继续进行更复杂的业务测试以及性能测试。
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation. Starting datanodes
错误描述:
解决方法:
方法一:
方法二、(推荐)
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation. Starting datanodes
在这里插入图片描述
错误描述:
Starting namenodes on [localhost]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [localhost]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.
2021-01-13 22:30:38,582 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting resourcemanager
ERROR: Attempting to operate on yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation.
Starting nodemanagers
ERROR: Attempting to operate on yarn nodemanager as root
ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting operation.
解决方法:
方法一:
在Hadoop安装目录下找到sbin文件夹
在里面修改四个文件
1、对于start-dfs.sh和stop-dfs.sh文件,添加下列参数:
#!/usr/bin/env bash
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
1
2
3
4
5
在这里插入图片描述
2、对于start-yarn.sh和stop-yarn.sh文件,添加下列参数:
#!/usr/bin/env bash
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
1
2
3
4
WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP
修改配置文档即可:
vim /usr/local/hadoop-3.3.0/sbin/start-dfs.sh
(stop-dfs.sh)
vim /usr/local/hadoop-3.3.0/sbin/start-yarn.sh
(stop-yarn.sh)
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
重新开始start…就可以。
方法二、(推荐)
The root cause of this problem,
hadoop install for different user and you start yarn service for different user. OR
in hadoop config's hadoop-env.sh specified HDFS_NAMENODE_USER and HDFS_DATANODE_USER user is something else.
1
2
Hence we need to correct and make it consistent at every place. So a simple solution of this problem is to edit your hadoop-env.sh file and add the user-name for which you want to start the yarn service. So go ahead and edit $HADOOP_HOME/etc/hadoop/hadoop-env.sh by adding the following lines
cd /usr/soft/hadoop/hadoop-3.3.0/etc/hadoop/
1
vim hadoop-env.sh
1
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
1
2
3
4
5
在这里插入图片描述
Now save and start yarn, hdfs service and check that it works.
我们在hadoop-env.sh文件中也可以找到如下的描述
To prevent accidents, shell commands be (superficially) locked to only allow certain users to execute certain subcommands.
为了防止发生意外,仅(部分)锁定shell命令以仅允许某些用户执行某些子命令。
It uses the format of (command)_(subcommand)_USER.For example, to limit who can execute the namenode command,export HDFS_NAMENODE_USER=hdfs
使用“命令_子命令_用户”,例如,通过使用export HDFS_NAMENODE_USER=hdfs来限制哪个用户可以执行namenode命令。
参考stackoverflow上的相关讨论
四、运行Hadoop
1.首先你需要初始化HDFS系统
在hadop3.1.1目录下使用如下命令:
bin/hdfs namenode -format
表示已经初始化完成。
2.开启NameNode和DataNode守护进程
在hadop3.1.1目录下使用如下命令:
sbin/start-dfs.sh
3.查看进程信息
在hadop3.1.1目录下使用如下命令:
jps
4.查看Web UI
在浏览器中输入http://localhost:50070,即可查看相关信息。但是有些同学可能出现访问不了50070端口的问题。你可以在终端使用
netstat -ntlp
查看一下服务器启动的端口。
以后关机在启动hadoop只需要执行sbin/start-all.sh就可以启动hadoop了
sbin/start-all.sh
然后一个个尝试,我最终找到的HDFS nameNode 的登陆端口是9870
最后如果局域网内其他电脑需要登录网站 需先在电脑hosts上映射服务器名称或ip