• Ubuntu搭建Hadoop环境


    本文是在一个全新的Ubuntu 22.04 虚拟机上安装Hadoop 3.3.4。

    环境

    • Ubuntu 22.04
    • JDK 11
    • Hadoop 3.3.4

    安装Hadoop

    首先安装JDK

    # apt install openjdk-11-jdk-headless
    
    • 1

    安装好以后查看:

    # java -version
    openjdk version "11.0.17" 2022-10-18
    OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
    OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu222.04, mixed mode, sharing)
    
    • 1
    • 2
    • 3
    • 4

    注意:Hadoop 3.3.4貌似不支持JDK 17,会报一个类似 java.lang.IllegalStateException: Unable to load cache item 的错误,换成JDK 11就好了。参见 https://blog.csdn.net/duke_ding2/article/details/123932532

    然后要求在localhost上ssh免密登录,效果如下:

    # ssh localhost
    Ubuntu 22.04.1 LTS
    Last login: Wed Nov 30 18:29:00 2022 from 9.200.47.148
    
    • 1
    • 2
    • 3

    如果需要配置ssh免密登录,只需在客户端机器生成一对public/private key,把public key复制到服务器端机器(本例就是本机)的 ~/.ssh/authorized_keys 里面即可,具体做法不再赘述,可以网上搜一下。

    访问 https://hadoop.apache.org/ ,下载Hadoop的压缩文件。我下载的文件是 hadoop-3.3.4.tar.gz

    # wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz
    
    • 1

    解压缩:

    # tar -zxvf hadoop-3.3.4.tar.gz
    
    • 1

    编辑 etc/hadoop/hadoop-env.sh 文件,添加:

    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
    
    • 1

    注:我是用 which javall 命令来查看java所在目录的。

    验证Hadoop

    有3种模式:

    • Local (Standalone) Mode
    • Pseudo-Distributed Mode
    • Fully-Distributed Mode

    Local (Standalone) Mode

    Hadoop的默认配置就支持非分布式模式。所以现在就可以试一下。比如,复制一些文件到 input 目录,然后统计里面的一些特定文本信息。

    # mkdir input
    # cp etc/hadoop/*.xml input
    # bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar grep input output 'dfs[a-z.]+'
    # cat output/*
    1	dfsadmin
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看 output 目录:

    # ll output/
    total 16
    drwxr-xr-x  2 root root   88 Nov 30 18:39 ./
    drwxr-xr-x 13 1024 1024 4096 Nov 30 18:42 ../
    -rw-r--r--  1 root root    8 Nov 30 18:39 ._SUCCESS.crc
    -rw-r--r--  1 root root   12 Nov 30 18:39 .part-r-00000.crc
    -rw-r--r--  1 root root    0 Nov 30 18:39 _SUCCESS
    -rw-r--r--  1 root root   11 Nov 30 18:39 part-r-00000
    # cat output/part-r-00000
    1	dfsadmin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Pseudo-Distributed Mode

    修改 etc/hadoop/core-site.xml 文件,添加如下配置:

    <configuration>
        <property>
            <name>fs.defaultFSname>
            <value>hdfs://localhost:9000value>
        property>
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    修改 etc/hadoop/hdfs-site.xml 文件,添加如下配置:

    <configuration>
        <property>
            <name>dfs.replicationname>
            <value>1value>
        property>
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意确认一下 ssh localhost 可以免密登录。

    格式化HDFS:

    # bin/hdfs namenode -format
    
    • 1

    启动HDFS,报错如下:

    # sbin/start-dfs.sh
    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 [schlepps1.fyre.ibm.com]
    ERROR: Attempting to operate on hdfs secondarynamenode as root
    ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在网上搜了一下,解决方法是,在 etc/hadoop/hadoop-env.sh 里添加以下几行内容:

    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

    参考: https://stackoverflow.com/questions/48129029/hdfs-namenode-user-hdfs-datanode-user-hdfs-secondarynamenode-user-not-defined

    现在,就可以用 sbin/start-dfs.sh 命令启动HDFS了。

    同理,也可以用 sbin/stop-dfs.sh 命令停止HDFS。

    启动HDFS后,通过 jps 命令查看:

    # jps
    14386 DataNode
    14611 SecondaryNameNode
    14266 NameNode
    14750 Jps
    
    • 1
    • 2
    • 3
    • 4
    • 5

    类似的,还可以通过 sbin/start-all.shsbin/stop-all.sh 命令来启动所有服务。对应的 jps 查看结果如下:

    # jps
    15473 DataNode
    15938 ResourceManager
    16050 NodeManager
    15700 SecondaryNameNode
    16420 Jps
    15353 NameNode
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    可见,二者区别在于,后者比前者多了 ResourceManagerNodeManager

    启动HDFS后,可以通过浏览器访问 http://:9870/

    在这里插入图片描述

    在HDFS里初始化root的根目录:

    # bin/hdfs dfs -mkdir /user
    # bin/hdfs dfs -mkdir /user/root
    
    • 1
    • 2

    此时,目录是空的:

    # bin/hdfs dfs -ls
    
    • 1

    注: ls 后面可以加上一个参数,指定协议和路径。比如:

    # bin/hadoop fs -ls hdfs://localhost:9000/
    Found 1 items
    drwxr-xr-x   - root supergroup          0 2022-12-06 22:40 hdfs://localhost:9000/user
    
    • 1
    • 2
    • 3

    该命令等同于 bin/hadoop fs -ls / 。这是因为我们在 core-site.xml 文件里配置了默认的文件系统为 hdfs://localhost:9000 ,所以 / 就等同于 hdfs://localhost:9000/ 。注意最后面的 /

    如果要查看本地路径,则用 file:// 协议,例如: bin/hadoop fs -ls file:/// (注意最后面的 / )就等同于 ls / 命令。

    另外,如果 ls 后面不指定参数,则查看的是 hdfs://localhost:9000/user/root

    在管理控制台页面上,通过 Utilities -> Browse the file system ,可以打开图形化的文件管理系统,就像Windows系统的“我的电脑”,可以通过图形界面来添加删除文件。

    在这里插入图片描述

    本文还是主要介绍命令行的方式。我们来创建一个 input 目录:

    # bin/hdfs dfs -mkdir input
    
    • 1

    再来查看一下:

    # bin/hdfs dfs -ls
    Found 1 items
    drwxr-xr-x   - root supergroup          0 2022-11-30 19:51 input
    
    • 1
    • 2
    • 3

    接下来,复制一些文件到HDFS。例如, input2 是一个本地目录,里面有 aaa.txtbbb.txt 两个文本文件。把这两个文件复制到HDFS:

    # bin/hdfs dfs -put /root/Downloads/hadoop-3.3.4/input2/* input
    
    • 1

    查看文件内容:

    # bin/hdfs dfs -cat input/aaa.txt
    abcdef
    hi
    haha
    hello
    world
    hhii
    # bin/hdfs dfs -cat input/bbb.txt
    hhh
    hihihi
    aaabbb
    cccddd
    high
    12345
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    统计 hi 出现的次数:

    # bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar grep input output 'hi'
    
    • 1

    运行完之后,会自动生成 output 目录。把 output 目录复制出来:

    # bin/hdfs dfs -get output output
    
    • 1

    注:我先把已存在的本地 output 目录删掉了。

    # ll output
    total 8
    drwxr-xr-x  2 root root   42 Nov 30 19:55 ./
    drwxr-xr-x 14 1024 1024 4096 Nov 30 19:55 ../
    -rw-r--r--  1 root root    5 Nov 30 19:55 part-r-00000
    -rw-r--r--  1 root root    0 Nov 30 19:55 _SUCCESS
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    # cat output/part-r-00000
    6	hi
    
    • 1
    • 2

    Fully-Distributed Mode

    参考

    • https://hadoop.apache.org
    • https://yanglinwei.blog.csdn.net/article/details/125170230
    • https://stackoverflow.com/questions/48129029/hdfs-namenode-user-hdfs-datanode-user-hdfs-secondarynamenode-user-not-defined
  • 相关阅读:
    第5章 总体设计【软件设计一般分为总体设计和详细设计,它们之间的关系是全局与局部】
    【Flink状态管理(六)】Checkpoint的触发方式(1)通过CheckpointCoordinator触发算子的Checkpoint操作
    MySQL的EXPLAIN执行计划的属性解释
    外包干了3天,技术退步明显.......
    笔记redis
    系统提示缺少或找不到msvcp140.dll文件的解决方法
    【管理工具】CMAK安装和使用(kafka-manager)
    代码随想录训练营第III期--021--python
    社区团购平台(java版)
    关于图像处理和Python深度学习的教程:第二部分
  • 原文地址:https://blog.csdn.net/duke_ding2/article/details/128128435