Hadoop 安装与 HDFS 基础实践

一、环境

        (1)操作系统:Linux (Ubuntu 20.04)

        (2)Hadoop 版本:3.3.2

        (3)JDK 版本:1.8 或者以上版本

(4)Java IDE:Eclipse

二、教程步骤

        (1)Hadoop 安装  

        该安装指南是在第一次实验的虚拟机中完成,所以例如安装 vim、更新 apt 或者换源等操作省去。若同学们创建新的虚拟机完成,则需要自行重新安装配置。

        有同学在实验1中安装 vmtools 但仍无法进行双向复制粘贴,可以使用下面命令来解决,注意执行完命令后需要重启生效。

        sudo apt-get autoremove open-vm-tools

        sudo apt-get install open-vm-tools

        sudo apt-get install open-vm-tools-desktop

       1、创建 hadoop 用户(使用 /bin/bash 作为 Shell)、设置密码(建议简单) 并为其添加管理员权限。具体命令如下:

        sudo useradd -m hadoop -s /bin/bash

        sudo passwd hadoop

        sudo adduser hadoop sudo

        完成上述步骤后,结果显示如下:

        2、切换到 hadoop 用户。

        sudo su - hadoop

        3、安装 SSH server,并测试登陆。

       sudo apt-get install openssh-server

       ssh localhost

        完成上述步骤后,结果如下:

        在执行命令时,注意要按照指示输入 yes,再输入 hadoop 用户的密码。在执行结束后,即可通过 SSH 登陆到本机。由于 hadoop 需要通过 SSH 来控制集群,所以需要对 SSH 设置免密登陆,即允许名称节点可以无密码登录集群中的所有机器。

        4、设置SSH 免密登录,利用 ssh-keygen 生成密钥并将秘钥加入到授权中。

        exit                         #退出刚才的ssh localhost

        cd ~/.ssh/                    #若没有该目录,请先执行一次ssh localhost

        ssh-keygen -t rsa              #会有提示,都按回车就可以

        cat ./id_rsa.pub >> ./authorized_keys      #加入授权

        在执行 ssh-keygen -t rsa 命令时,每次按回车键即可。此时免密设置完成,使用 ssh localhost 进行验证。整个过程如下图所示:

 

        5、安装 Java环境。Hadoop 3.3.2需要JDK版本在1.8及以上。JDK 1.8安装方式多种多样。这里采取手动安装,需要自行下载 JDK1.8 的安装包(见群文件)。将 JDK 安装包放在 Downloads 目录下,并且创建存放 JDK 文件的目录。如果在切换 Downloads 目录时出现找不到目录,可以重启系统,手动选择进入 hadoop 用户。

       cd /usr/lib

       sudo mkdir jvm    #创建/usr/lib/jvm目录用来存放JDK文件

       cd ~/Downloads

        sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm 

        #把JDK文件解压到/usr/lib/jvm目录下

        6、查看 JDK 是否解压到 jvm 文件夹中。

       cd /usr/lib/jvm

       ls

        7、设置 java 环境变量使其生效,并查看版本号验证是否安装成功。

        vim ~/.bashrc

       上述命令使用vim编辑器打开了hadoop这个用户的环境变量配置文件.bashrc,请在这个文件的开头位置插入如下内容:

        export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162

        export JRE_HOME=${JAVA_HOME}/jre

        export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

        export PATH=${JAVA_HOME}/bin:$PATH

        保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:

        source ~/.bashrc

        这时,可以使用如下命令查看是否安装成功:

        java -version

        最终结果显示如下:

         至此,成功安装了Java环境。下面将进入Hadoop的安装。

        8、下载 hadoop-3.3.2 至 Downloads 目录(见群文件),并将Hadoop安装至/usr/local/中。

       sudo tar -zxvf ~/Downloads/hadoop-3.3.2.tar.gz -C /usr/local #解压到/usr/local中

       cd /usr/local/

       sudo mv ./hadoop-3.3.2/ ./hadoop        #将文件夹名修改为hadoop

       sudo chown -R hadoop ./hadoop         #修改文件权限

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

       cd /usr/local/hadoop

       ./bin/hadoop version

       结果如下图所示:

        在执行上述命令的过程中,需要注意相对路径绝对路径

        9、Hadoop伪分布式配置。对core-sitehdfs-site两个配置文件分别进行修改。

       1)cd /usr/local/hadoop/etc/hadoop/

       2)vim core-site.xml     #使用vim打开配置文件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>

        3)vim hdfs-site.xml     #使用vim打开配置文件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>

        10、对NameNode进行格式化。(在执行此步之前可以存快照

       cd /usr/local/hadoop

       ./bin/hdfs namenode -format

       结果如下图所示(成功的话,会看到“successfully formatted”的提示):

         11、开启NameNode和DataNode守护进程。在启动完成后使用 jps 命令来查看是否启动成功。若成功启动则会列出如下进程:NameNode, DataNode和SecondaryNameNode(如果SecondaryNameNode没有启动,请运行./sbin/stop-dfs.sh关闭进程,然后再次尝试启动)。如果没有 NameNode 或 DataNode,那就是配置不成功,请仔细检查之前的步骤,或通过查看启动日志排查原因。

       ./sbin/start-dfs.sh

       jps

       结果如下图所示:

 

        注意:若此步运行出错,可以选择通过日志查看出错内容,恢复快照改正错误再重新启动进程。若 datanode 没有启动,可以输入以下语句解决:

        cd /usr/local/hadoop

        ./sbin/stop-dfs.sh  

        rm -r ./tmp

        ./bin/hdfs namenode -format

        ./sbin/start-dfs.sh

        12、安装成功后,在 linux 浏览器中访问 http://localhost:9870 来查看NameNode和DataNode信息,还可以在线查看HDFS中的文件。如下图所示:

 

        (2)利用Hadoop提供的shell命令按照顺序依次完成以下任务:

(具体命令请先阅读学习附录1)

        1、使用hadoop用户登录Linux系统,启动Hadoop(Hadoop的安装目录为/usr/local/hadoop),并使用Web界面查看HDFS信息;

        2、为hadoop用户在HDFS中创建用户目录/user/hadoop;

        3、接着在HDFS的目录/user/hadoop下,创建文件夹(zhangxinchao1903)

    4、将Linux系统本地的~/.bashrc (即/home/hadoop/.bashrc)文件上传到HDFS中zhangxinchao1903文件夹中,并查看是否上传成功;

         5、将HDFS文件夹zhangxinchao1903复制到Linux系统本地文件系统的/usr/local/hadoop目录下,并在Linux系统本地文件系统查看是否复制成功;

        6、在HDFS中删除文件夹zhangxinchao1903中的所有文件,并显示是否删除成功; 

        7、使用vim编辑器,在本地Linux文件系统的/home/hadoop/目录下创建一个文件myLocalFile.txt,文件里面输入以下内容:

        Hadoop

        zhangxinchao1903           

        Cloud Computing and Distributed Storage Systems

        8、将本地文件系统的“/home/hadoop/myLocalFile.txt”上传到HDFS中的“/user/hadoop/ zhangxinchao1903”目录下;

        9、查看文件myLocalFile.txt是否上传成功,如果上传成功,查看HDFS中的myLocalFile.txt这个文件的内容;

         10、将HDFS中的myLocalFile.txt文件下载到本地文件系统中的“/home/hadoop/下载”目录下,并在本地文件系统查看下载下来的文件myLocalFile.txt。

(3)利用Java API与HDFS进行交互

(具体操作过程请参照附录2)

            1、在Linux (Ubuntu)中安装Eclipse;

        2、在Eclipse中创建项目;

        3、为项目添加需要用到的JAR包;

        4、用Java编写程序检测HDFS中是否存在文件myLocalFile.txt;

        5、编译运行程序并显示检测结果。

  • 出现的问题与解决方案

        1、在系统文件里面找不到bashrc文件。

        解决方法:其实是存在的,bai文件是隐藏文件,需要按一下键盘Ctrl+H即可显示。

        2、在hdfs上创建文件夹

        解决方法:比如在hdfs创建zhangxinchao1903文件夹:

        Hadoop fs –mkdir /*****/zhangxinchao1903

        3、hdfs要区分删除文件、文件夹

        删除文件:bin/hdfs dfs –rm zhangxinchao1903/*

        删除文件夹:bin/hdfs dfs –rm -r zhangxinchao1903

        4、ls报错

        解决方法:有些指令不能直接word上的,编码不一样,需要手动键入。

        5、eclipse运行卡顿闪退

        问题:①运行内存不足

        ②不要在软件商城里下载,打开浏览器搜索下载

 

附录1利用Shell命令与HDFS进行交互

在进行HDFS编程实践前,需要首先启动Hadoop。可以执行如下命令启动Hadoop

cd /usr/local/hadoop

./sbin/start-dfs.sh #启动hadoop

Hadoop支持很多Shell命令,其中fsHDFS最常用的命令,利用fs可以查看HDFS文件系统的目录结构、上传和下载数据、创建文件等。

注意

本教程的命令是以”./bin/hadoop dfs”开头的Shell命令方式,实际上有三种shell命令方式。
1. hadoop fs
2. hadoop dfs
3. hdfs dfs

hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
hadoop dfs只能适用于HDFS文件系统
hdfs dfshadoop dfs的命令作用一样,也只能适用于HDFS文件系统

我们可以在终端输入如下命令,查看fs总共支持了哪些命令

./bin/hadoop fs

在终端输入如下命令,可以查看具体某个命令的作用

例如:我们查看put命令如何使用,可以输入如下命令

./bin/hadoop fs -help put

1.目录操作

需要注意的是,Hadoop系统安装好以后,第一次使用HDFS时,需要首先在HDFS中创建用户目录。本教程全部采用hadoop用户登录Linux系统,因此,需要在HDFS中为hadoop用户创建一个用户目录,命令如下:

cd /usr/local/hadoop

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

该命令中表示在HDFS中创建一个“/user/hadoop”目录,“–mkdir”是创建目录的操作,“-p”表示如果是多级目录,则父目录和子目录一起创建,这里“/user/hadoop”就是一个多级目录,因此必须使用参数“-p”,否则会出错。
“/user/hadoop”目录就成为hadoop用户对应的用户目录,可以使用如下命令显示HDFS中与当前用户hadoop对应的用户目录下的内容:

./bin/hdfs dfs –ls .

该命令中,“-ls”表示列出HDFS某个目录下的所有内容,“.”表示HDFS中的当前用户目录,也就是“/user/hadoop”目录,因此,上面的命令和下面的命令是等价的:

./bin/hdfs dfs –ls /user/hadoop

如果要列出HDFS上的所有目录,可以使用如下命令:

./bin/hdfs dfs –ls

下面,可以使用如下命令创建一个input目录:

./bin/hdfs dfs –mkdir input

在创建个input目录时,采用了相对路径形式,实际上,这个input目录创建成功以后,它在HDFS中的完整路径是“/user/hadoop/input”。如果要在HDFS的根目录下创建一个名称为input的目录,则需要使用如下命令:

./bin/hdfs dfs –mkdir /input

可以使用rm命令删除一个目录,比如,可以使用如下命令删除刚才在HDFS中创建的“/input”目录(不是“/user/hadoop/input”目录):

./bin/hdfs dfs –rm –r /input

上面命令中,“-r”参数表示如果删除“/input”目录及其子目录下的所有内容,如果要删除的一个目录包含了子目录,则必须使用“-r”参数,否则会执行失败。

2.文件操作

在实际应用中,经常需要从本地文件系统向HDFS中上传文件,或者把HDFS中的文件下载到本地文件系统中。
首先,使用vim编辑器,在本地Linux文件系统的“/home/hadoop/”目录下创建一个文件myLocalFile.txt,里面可以随意输入一些单词,比如,输入如下三行:

Hadoop
Spark
XMU DBLAB

然后,可以使用如下命令把本地文件系统的“/home/hadoop/myLocalFile.txt”上传到HDFS中的当前用户目录的input目录下,也就是上传到HDFS“/user/hadoop/input/”目录下:

./bin/hdfs dfs -put /home/hadoop/myLocalFile.txt  input

可以使用ls命令查看一下文件是否成功上传到HDFS中,具体如下:

./bin/hdfs dfs –ls input

该命令执行后会显示类似如下的信息:

Found 1 items   
-rw-r--r--   1 hadoop supergroup         36 2017-01-02 23:55 input/ myLocalFile.txt

下面使用如下命令查看HDFS中的myLocalFile.txt这个文件的内容:

./bin/hdfs dfs –cat input/myLocalFile.txt

下面把HDFS中的myLocalFile.txt文件下载到本地文件系统中的“/home/hadoop/下载/”这个目录下,命令如下:

./bin/hdfs dfs -get input/myLocalFile.txt  /home/hadoop/下载

可以使用如下命令,到本地文件系统查看下载下来的文件myLocalFile.txt

cd ~

cd 下载

ls

cat myLocalFile.txt

最后,了解一下如何把文件从HDFS中的一个目录拷贝到HDFS中的另外一个目录。比如,如果要把HDFS“/user/hadoop/input/myLocalFile.txt”文件,拷贝到HDFS的另外一个目录“/input”中(注意,这个input目录位于HDFS根目录下),可以使用如下命令:

./bin/hdfs dfs -cp input/myLocalFile.txt  /input

 

 

附录2利用Java APIHDFS进行交互

Hadoop不同的文件系统之间通过调用Java API进行交互,上面介绍的Shell命令,本质上就是Java API的应用。下面提供了Hadoop官方的Hadoop API文档,想要深入学习Hadoop,可以访问如下网站,查看各个API的功能。

Hadoop API文档http://hadoop.apache.org/docs/stable/api/

利用Java API进行交互,需要利用软件Eclipse编写Java程序。

() Ubuntu中安装Eclipse

Eclipse是常用的程序开发工具,很多程序代码都是使用Eclipse开发调试,因此,需要在Linux系统中安装Eclipse。可以在 ubuntu software 中直接下载 eclipse

(二)使用Eclipse开发调试HDFS Java程序

Hadoop采用Java语言开发的,提供了Java APIHDFS进行交互。上面介绍的Shell命令,在执行时实际上会被系统转换成Java API调用。Hadoop官方网站提供了完整的Hadoop API文档(http://hadoop.apache.org/docs/stable/api/),想要深入学习Hadoop编程,可以访问Hadoop官网查看各个API的功能和用法。本教程只介绍基础的HDFS编程。
为了提高程序编写和调试效率,本教程采用Eclipse工具编写Java程序。
现在要执行的任务是:用Java编写程序检测HDFS中是否存在文件myLocalFile.txt,编译运行程序并显示检测结果。

1. Eclipse中创建项目

启动Eclipse。当Eclipse启动以后,会弹出如下图所示界面,提示设置工作空间(workspace)。

可以直接采用默认的设置“/home/hadoop/eclipse-workspace”,点击“Launch”按钮。可以看出,由于当前是采用hadoop用户登录了Linux系统,因此,默认的工作空间目录位于hadoop用户目录“/home/hadoop”下。
Eclipse启动以后,会呈现如下图所示的界面。

选择“File–>New–>Java Project”菜单,开始创建一个Java工程,会弹出如下图所示界面。

“Project name”后面输入工程名称“HDFSExample”,选中“Use default location”,让这个Java工程的所有文件都保存到“/home/hadoop/workspace/HDFSExample”目录下。在“JRE”这个选项卡中,可以选择当前的Linux系统中已经安装好的JDK,比如jdk1.8.0_162。然后,点击界面底部的“Next>”按钮,进入下一步的设置。

2. 为项目添加需要用到的JAR

进入下一步的设置以后,会弹出如下图所示界面。

需要在这个界面中加载该Java工程所需要用到的JAR包,这些JAR包中包含了可以访问HDFSJava API。这些JAR包都位于Linux系统的Hadoop安装目录下,对于本教程而言,就是在“/usr/local/hadoop/share/hadoop”目录下。点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮,会弹出如下图所示界面。

在该界面中,上面的一排目录按钮(即“usr”“local”“hadoop”“share”“hadoop”“common”),当点击某个目录按钮时,就会在下面列出该目录的内容。
为了编写一个能够与HDFS交互的Java应用程序,一般需要向Java工程中添加以下JAR包:
1“/usr/local/hadoop/share/hadoop/common”目录下的所有JAR包,包括hadoop-common-3.3.2.jarhadoop-common-3.3.2-tests.jarhadoop-nfs-3.3.2.jarhadoop-kms-3.3.2.jarhadoop-registry-3.3.2.jar,注意,不包括目录jdifflibsourceswebapps
2“/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;
3“/usr/local/hadoop/share/hadoop/hdfs”目录下的所有JAR包,注意,不包括目录jdifflibsourceswebapps
4“/usr/local/hadoop/share/hadoop/hdfs/lib”目录下的所有JAR包。

比如,如果要把“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-3.3.2.jarhadoop-common-3.3.2-tests.jarhadoop-nfs-3.3.2.jarhadoop-kms-3.3.2.jarhadoop-registry-3.3.2.jar添加到当前的Java工程中,可以在界面中点击目录按钮,进入到common目录,然后,界面会显示出common目录下的所有内容。在界面中用鼠标点击选中hadoop-common-3.3.2.jarhadoop-common-3.3.2-tests.jarhadoop-nfs-3.3.2.jarhadoop-kms-3.3.2.jarhadoop-registry-3.3.2.jar(不要选中目录jdifflibsourceswebapps),然后点击界面右上角的“open”按钮,就可以把JAR包增加到当前Java工程中,出现的界面如下图所示。

从这个界面中可以看出,hadoop-common-3.3.2.jarhadoop-common-3.3.2-tests.jarhadoop-nfs-3.3.2.jarhadoop-kms-3.3.2.jarhadoop-registry-3.3.2.jar已经被添加到当前Java工程中。然后,按照类似的操作方法,可以再次点击“Add External JARs…”按钮,把剩余的其他JAR包都添加进来。需要注意的是,当需要选中某个目录下的所有JAR包时,可以使用“Ctrl+A”组合键进行全选操作。全部添加完毕以后,就可以点击界面右下角的“Finish”按钮,完成Java工程HDFSExample的创建。

3. 编写Java应用程序

下面编写一个Java应用程序,用来检测HDFS中是否存在一个文件。
请在Eclipse工作界面左侧的“Package Explorer”面板中(如下图所示),找到刚才创建好的工程名称“HDFSExample”,然后在该工程名称上点击鼠标右键,在弹出的菜单中选择“New->Class”菜单。

选择“New->Class”菜单以后会出现如下图所示界面。

在该界面中,只需要在“Name”后面输入新建的Java类文件的名称,这里采用名称“HDFSFileIfExist”,其他都可以采用默认设置,然后,点击界面右下角“Finish”按钮,出现如下图所示界面。

可以看出,Eclipse自动创建了一个名为“HDFSFileIfExist.java”的源代码文件,请在该文件中输入以下代码:

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

public class HDFSFileIfExist {

    public static void main(String[] args){

        try{

            String fileName = "test";

            Configuration conf = new Configuration();

            conf.set("fs.defaultFS", "hdfs://localhost:9000");

            conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");

            FileSystem fs = FileSystem.get(conf);

            if(fs.exists(new Path(fileName))){

                System.out.println("文件存在");

            }else{

                System.out.println("文件不存在");

            }

 

        }catch (Exception e){

            e.printStackTrace();

        }

    }

}

该程序用来测试HDFS中是否存在一个文件,其中有一行代码:

String fileName = "test"

这行代码给出了需要被检测的文件名称是“test”,没有给出路径全称,表示是采用了相对路径,实际上就是测试当前登录Linux系统的用户hadoop,在HDFS中对应的用户目录下是否存在test文件,也就是测试HDFS中的“/user/hadoop/”目录下是否存在test文件。(根据前序实验内容,myLocalFile.txt的完整路径为/user/hadoop/yuguo1801/myLocalFile.txt

4. 编译运行程序

在开始编译运行程序之前,请一定确保Hadoop已经启动运行,如果还没有启动,需要打开一个Linux终端,输入以下命令启动Hadoop

cd /usr/local/hadoop

./sbin/start-dfs.sh

现在就可以编译运行上面编写的代码。可以直接点击Eclipse工作界面上部的运行程序的快捷按钮,当把鼠标移动到该按钮上时,在弹出的菜单中选择“Run As”,继续在弹出来的菜单中选择“Java Application”,如下图所示。

然后,会弹出如下界面。

在该界面中,需要在“Select type”下面的文本框中输入“HDFSFileIfExist”Eclipse就会自动找到相应的类“HDFSFileIfExist-(default package)”(注意:这个类在后面的导出JAR包操作中的Launch configuration中会被用到),然后,点击界面右下角的“OK”按钮,开始运行程序。程序运行结束后,会在底部的“Console”面板中显示运行结果信息(如下图所示)。由于目前HDFS“/user/hadoop”目录下还没有test文件,因此,程序运行结果是文件不存在。同时,“Console”面板中还会显示一些类似“log4j:WARN…”的警告信息,可以不用理会。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值