Linux-Ubuntu环境下Hadoop的安装(单机模式&伪分布式模式)

目录

 

基本环境:

Hadoop3.x的安装

Hadoop单机配置(非分布式)

Hadoop伪分布式配置



  • 基本环境:

VMware下挂载安装Ubuntu16.0 

jdk1.8


  • Hadoop3.x的安装

Hadoop 3 可以通过 http://mirror.bit.edu.cn/apache/hadoop/common/ 或 http://mirrors.cnnic.cn/apache/hadoop/common/ 下载,一般选择下载最新的稳定版本,即下载 “stable” 下的 hadoop-3.x.y.tar.gz 这个格式的文件,这是已经编译好的,另一个包含 src 的则是 Hadoop 源代码,需要进行编译才可使用。所以建议下载前者。

注意:

1.如果采用的是使用虚拟机方式安装Ubuntu的用户,请用虚拟机中的Ubuntu自带firefox浏览器访问本指南,再点击下面的地址,才能把hadoop文件下载虚拟机ubuntu中。

2.如果是Windows系统下的浏览器下载的或者在windows本地已下载好,由于虚拟机中的Ubuntu无法访问外部Windows系统的文件,所以需要使用XShell或者SecurityCRT将本地的文件上传至Ubuntu中。

下载好后,一般可以直接使用,但是如果网络不好可能会导致文件缺失,官方网站提供的 hadoop-2.x.y.tar.gz.mds 这个文件,该文件包含了检验值可用于检查 hadoop-2.x.y.tar.gz 的完整性,否则若文件发生了损坏或下载不完整,Hadoop 将无法正常运行。(为了方便,我们可以直接在http://163.172.17.199/dist/hadoop/core上找到对应版本的.tar.tz.mds文件。如下图)

进入之后我们可以看到MD5对应有一个序列:

然后我们再通过命令查看我们所下载的Hadoop的MD5序列。Hadoop的默认下载位置是在“下载”目录中(若不是请自行更改tar命令的相应目录),另外,本人选择的是 3.2.1 版本,如果你用的不是 3.2.1 版本,则将所有命令中出现的 3.2.1 更改为你所使用的版本。#及后面的内容为注释

$ cd ~/下载
$ md5sum ./hadoop-3.2.1.tar.gz | tr "a-z" "A-Z"   # 计算md5值,并转化为大写,方便比较

对比两个序列,若两个字符串相等则文件没有损坏,如果不一样请务必重新下载!


我们选择将Hadoop安装到/usr/local中

$ sudo tar -zxf ~/下载/hadoop-2.6.0.tar.gz -C /usr/local    # 解压到/usr/local中
$ cd /usr/local/
$ sudo mv ./hadoop-2.6.0/ ./hadoop    # 将文件夹名改为hadoop
$ sudo chown -R hadoop ./hadoop       # 修改文件权限

解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息

$ cd /usr/local/hadoop
$ ./bin/hadoop version

Tips:

Linux下的相对路径与绝对路径:

请务必注意命令中的相对路径与绝对路径,本文后续出现的./bin/...,./etc/... 等包含 ./ 的路径均为相对路径,以 /usr/local/hadoop 为当前目录。例如在 /usr/local/hadoop 目录中执行 ./bin/hadoop version 等同于执行/usr/local/hadoop/bin/hadoop version。可以将相对路径改成绝对路径来执行,但如果你是在主文件夹 ~ 中执行 ./bin/hadoop version,执行的会是/home/hadoop/bin/hadoop version,这就不是我们所想要的了。


  • Hadoop单机配置(非分布式)

Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。现在我们可以执行例子来感受下 Hadoop 的运行。Hadoop 附带了丰富的例子(运行 ./bin/hadoop.jar  ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar可以看到所有例子),包括 wordcount、terasort、join、grep 等。这里我们选择运行 grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中。

$ cd /usr/local/hadoop
$ mkdir ./input
$ cp ./etc/hadoop/*.xml ./input   # 将配置文件作为输入文件
$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+'
$ cat ./output/*          # 查看运行结果

执行成功后如下所示,输出了作业的相关信息,输出的结果是符合正则的单词 dfsadmin 出现了1次。

注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。


  • Hadoop伪分布式配置

Hadoop 可以在单节点上通过伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。关于NameNode和DataNode的简单解释如下:

HDFS是Hadoop应用用到的一个最主要的分布式存储系统。一个HDFS集群主要由一个NameNode和很多个Datanode(通常以机架形式组织)组成:Namenode管理文件系统的元数据,而Datanode存储了实际的数据。HDFS的体系结构在这里有详细的描述。本文档主要关注用户以及管理员怎样和HDFS进行交互。上图描述了Namenode、Datanode和客户端之间的基本的交互操作。基本上,客户端联系Namenode以获取文件的元数据或修饰属性,而真正的文件I/O操作是直接和Datanode进行交互的。

进入正题:伪分布式的配置步骤如下

Hadoop的配置文件主要在/usr/local/hadoop/etc/hadoop/目录下。伪分布式需要修改core-site.xml 和 hdfs-site.xml 两个配置文件。

(1)通过命令  gedit ./etc/hadoop/core-site.xml修改core-site.xml

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

(2)通过命令  gedit ./etc/hadoop/hdfs-site.xml修改hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
</configuration>

关于配置文件的一点说明:

Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。

此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行(官方教程如此),不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。所以我们进行了设置,同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错

配置完成后,执行NameNode格式化

$ ./bin/hdfs namenode -format

成功的话会看到如下图所示:

可能会出现的问题:

如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。如果已经按照前面教程在.bashrc文件中设置了JAVA_HOME,还是出现 Error: JAVA_HOME is not set and could not be found. 的错误,那么,请到hadoop的安装目录修改配置文件“/usr/local/hadoop/etc/hadoop/hadoop-env.sh”,在里面找到“export JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成JAVA安装路径的具体地址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次启动Hadoop。

接着开启 NameNode 和 DataNode 守护进程。

$ ./sbin/start-dfs.sh  #start-dfs.sh是个完整的可执行文件,中间没有空格

如出现SSH提示,输入yes即可。启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable WARN 提示可以忽略,并不会影响正常使用。

启动 Hadoop 时提示 Could not resolve hostname

如果启动 Hadoop 时遇到输出非常多“ssh: Could not resolve hostname xxx”的异常情况,如下图所示

这个并不是 ssh 的问题,可通过设置 Hadoop 环境变量来解决。首先按键盘的 ctrl + c 中断启动,然后在 ~/.bashrc 中,增加如下两行内容(设置过程与 JAVA_HOME 变量一样,其中 HADOOP_HOME 为 Hadoop 的安装目录):

1.export HADOOP_HOME=/usr/local/hadoop
2.export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

保存后,必须要执行 source ~/.bashrc 使变量设置生效,然后再次执行 ./sbin/start-dfs.sh 启动 Hadoop。

执行成功后我们通过jps命令查看是否启动成功:

成功启动后,可以访问 Web 界面 http://localhost:9870 (从Hadoop 3.0开始端口配置发生了变化,使用Hadoop3.0以前版本的读者访问http://localhost:50070)查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。如下图:

运行Hadoop伪分布式实例:

刚才在我们介绍的单机模式的例子中读取的是本地数据,而伪分布式则是从HDFS上读取。要使用HDFS我们首先需要在HDFS中创建用户目录:

$ ./bin/hdfs dfs -mkdir -p /user/hadoop

对于hadoop fs、hadoop dfs、hdfs dfs三个命令的应用范围:

hadoop fs适用于操作不同的文件系统。比如本地文件系统和HDFS文件系统
hadoop dfs只能适用于操作HDFS文件系统
hdfs dfs跟hadoop dfs一样,只适用于操作HDFS文件系统

然后我们将./etc/hadoop中的.xml文件作为输入文件复制到HDFS文件系统中,就是将本地/usr/local/hadoop/etc/hadoop中的文件复制到分布式文件系统/usr/hadoop/input中。我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input

$ ./bin/hdfs dfs -mkdir input
$ ./bin/hdfs dfs -put ./etc/hadoop/*.xml input

复制完成后我们可以通过下面的命令查看文件列表信息:

./bin/hdfs dfs -ls input

伪分布式运行 MapReduce 作业的方式跟单机模式一样的,但区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点),而单机模式是读取的本地的input文件夹。

$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

成功后我们通过下面命令查看output的内容:(因为我们在配置伪分布式模式的时候修改了两个.xml配置文件的内容,所以运行结果和当初单机模式下的结果会不同。)

$ ./bin/hdfs dfs -cat output/*

我们也可以将运行结果取回本地:

$ rm -r ./output    # 先删除本地的 output 文件夹(如果存在)
$ ./bin/hdfs dfs -get output ./output     # 将 HDFS 上的 output 文件夹拷贝到本机
$ cat ./output/*

我们可以看到跟从HDFS文件系统上的内容是一样的。

Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:

$ ./bin/hdfs dfs -rm -r output    # 删除 output 文件夹

运行程序时,输出目录不能存在!

运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。

在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作:

Configuration conf = new Configuration();

Job job = new Job(conf);

/* 删除输出目录 */

Path outputPath = new Path(args[1]);

outputPath.getFileSystem(conf).delete(outputPath, true);

关闭Hadoop:

$ ./sbin/stop-dfs.sh

下次启动 hadoop 时,无需进行 NameNode 的初始化,只需要运行./sbin/start-dfs.sh就可以了

 

 

安装Hadoop3.x集群步骤详见:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值