研究一下hadoop,所以在这里记录一下hadoop的学习过程。

今天先来尝试安装hadoop,hadoop软件一般都用于安装在linux系统下,似乎有说可以在windows下运行的,但毕竟还是在linux下运行效果比较好,所以这里只考虑在linux下运行安装的过程。

我下载安装的都是最新的版本,hadoop-3.0.0.tar.gz和jdk-9.0.4_linux-x64_bin.tar.gz。需要安装虚拟机,我们将这两个文件cp到centos虚拟机上去,进行解压配置。

我的个人目录为/home/xxx,所以将这两个压缩包文件放到这个目录下,创建一个app文件夹,将文件压缩到app文件夹下,

tar -zxvf hadoop-3.0.0.tar.gz /home/xxx/app

tar -zxvf jdk-9.0.4_linux-x64_bin.tar.gz /home/xxx/app

接下来我们配置jdk的环境变量,这里我提一下,因为hadoop是用java写的,所以它需要jre的环境。

执行:vi /ect/profile 注意权限问题

在最上面添加

export JAVA_HOME=/home/xxx/app/jdk-9.0.4
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/bin:$JRE_HOME/bin
export PATH=$PATH:${JAVA_HOME}/bin
保存退出后

执行:source /etc/profile

然后查询我们的java版本, java -version

java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)
就此证明jdk安装成功

下面我们来配置hadoop

我们来到hadoop配置文件的路径/home/xxx/app/hadoop-3.0.0/etc/hadoop

主要我们需要修改的配置文件为:hadoop-env.sh

我们找到:export JAVA_HOME=

我下载的hadoop文件里面就是这样的,可能你们下载的不一样,将其修改为:export JAVA_HOME=$JAVA_HOME

有人说这里如果直接写变量是不管用的,是hadoop的bug,但我这里是好用的,可能是最新版本进行各更新。修改之后我们进行保存退出即可

我们来到/home/xxx/app/hadoop-3.0.0/bin
执行./hadoop fs这时系统就会提示该命令的相关参数,如果不配置上面的JAVA_HOME就会提示没有找到JAVA_HOME路径

现在还不算完,我们还需要进行其他的配置,我们重新返回配置路径 ,开始配置core-site.xml

 1 <configuration>
 2         <property>
 3         <!--声明hadoop默认的文件系统使用的是哪种-->
 4                 <name>fs.defaultFS</name>
 5                 <!--URI namenode地址-->
 6                 <value>hdfs://centos-1:9000/</value>
 7         </property>
 8         <property>
 9         <!--hadoop工作目录-->
10         <name>hadoop.tmp.dir</name>
11         <value>/home/ljs/app/hadoop-3.0.0/tmp</value>
12         </property>
13 </configuration>
View Code

下面我们来配置hdfs-site.xml

1 <configuration>
2 <property>
3 <!--修改hdfs文件备份分数,默认为3,但暂时我们只有一台机器,所以需要更改为1-->
4 <name>dfs.replication</name>
5 <value>1</value>
6 </property>
7 </configuration>
View Code

配置mapred-site.xml

1 <configuration>
2     <property>
3     <!--mapreduce程序要运行在哪个资源框架上-->
4     <name>mapreduce.framework.name</name>
5     <!--yarn来负责调度资源-->
6     <value>yarn</value>
7     </property>
8 </configuration>
View Code

配置yarn-site.xml

 1 <configuration>
 2 <property>
 3 <name>yarn.resourcemanager.hostname</name>
 4 <value>centos-1</value>
 5 </property>
 6 <!-- Site specific YARN configuration properties -->
 7 <property>
 8 <name>yarn.nodemanager.aux-services</name>
 9 <value> mapreduce_shuffle</value>
10 </property>
11 
12 </configuration>
View Code

到此hadoop基本的配置就完成了

 下面我们来格式化文件系统

hadoop namenode -format执行后会有Storage directory /home/xxx/app/hadoop-3.0.0/tmp/dfs/name has been successfully formatted

成功提示,注意上面配置文件中的centos都是本机域名映射,可自行替换为localhost或者127.0.0.1。这个配置似乎是有bug的,我上面明明写的是centos-1,但执行格式化会提示找不到centos1的服务器,我又将centos1域名映射添加到了hosts文件中去,接下来执行格式化成功

下面看看hadoop的tmp文件夹下是不是有内容了

下面我们启动start-dfs.sh和start-yarn.sh见证奇迹的时刻到了。看是否启动成功

不幸的是报了各种错误,不知道其他人,但我这里是报了错误

错误1

Starting namenodes on [localhost]
ERROR: Attempting to launch hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting launch.

这个问题我也是在网上查到的解决方案

解决1:
是因为缺少用户定义造成的,所以分别编辑开始和关闭脚本
$ vim sbin/start-dfs.sh
$ vim sbin/stop-dfs.sh
在顶部空白处添加内容:
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

错误2

Starting resourcemanager
ERROR: Attempting to launch yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting launch.
Starting nodemanagers
ERROR: Attempting to launch yarn nodemanager as root
ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting launch.

解决2:
是因为缺少用户定义造成的,所以分别编辑开始和关闭脚本
$ vim sbin/start-yarn.sh
$ vim sbin/stop-yarn.sh

在顶部空白处添加内容:

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
保存后我们来重新启动

会提示一个警告说是HADOOP_SECURE_DN_USER替换了HDFS_SECURE_DN_USER,于是我将上面的参数名改成了这个,没有继续警告了。

我这里也没有那么顺利,会报各种权限和验证问题,是因为我个人操作问题,正常情况下不会有的.但启动没有报错并不证明启动成功,我启动的时候就没有报任何错误,但访问hdfs系统仍然不行,这时我们需要确定hadoop的各种进程是否成功启动

执行jps命令可以看到以下进程:

12704 NameNode
13013 SecondaryNameNode
13401 NodeManager
12812 DataNode
13293 ResourceManager
13710 Jps

进程不能少,否则证明个别服务启动失败,我当时namenode就没有,重新进行了格式化,然后再启动就成功了

下面也是我遇到的一个警告,但不影响使用

WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 

解决方案

第二个办法直接在log4j日志中去除告警信息。在/home/xxx/app/hadoop-3.0.0/etc/hadoop/log4j.properties文件中添加

log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR 

下面我们来试一试上传文件吧

执行命令hadoop fs -put /home/xxx/software/jdk-9.0.4_linux-x64_bin.tar.gz hdfs://centos-1:9000/

稍等一会,就上传完毕了,我们在看一下hdfs系统目录执行:hadoop fs -ls hdfs://centos-1:9000/

Found 1 items
-rw-r--r--   1 xxx supergroup  354635831 2018-02-03 21:37 hdfs://centos-1:9000/jdk-9.0.4_linux-x64_bin.tar.gz
就此hadoop的环境搭建及测试通过,可以睡觉去了