【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序

1.虚拟机准备

1.1 模板机器配置

1.1.1 主机配置

  • IP地址:在学校校园网Wifi下连接下 VMWare自己DHCP分配的是 192.168.190.xxx
  • 内存:4G(根据自己机器确定 我需要三台机器 我的内存是16G)
  • 硬盘:50G
  • OS:CentOS7 x64

1.1.2 环境工具安装

  • ping www.baidu.com先查看能否正常上网
  • yum install -y epel-release安装额外的软件包
  • yum install -y net-tools:如果是最小化安装(只有命令行)需要安装,包含ifconfig命令
  • yum install -y vim:vim编辑器

1.1.3 关闭防火墙

  • systemctl stop firewalld 关闭防火墙
  • systemctl disable firewalld.service 关闭防火墙开机自启动

1.1.4 创建hadoop用户 设置密码

  • useradd hadoop
  • passwd hadoop

1.1.5 配置hadoop用户具有root权限

修改etc/sudoers文件在%whell ALL=(ALL) ALL语句下增加:hadoop ALL=(ALL) NOPASSWD:ALL。实现免密功能。

1.1.6 在/opt下创建module和software两个软件 修改主和所属组

  • mkdir /opt/module
  • mkdir /opt/software
  • chown hadoop:hadoop /opt/module
  • chown hadoop:hadoop /opt/software

1.1.7 卸载虚拟机自带的JDK

rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps

1.1.8 重启虚拟机

reboot

1.2 克隆三台虚拟机

通过VMWare克隆模板机器,此处可以不使用静态IP, 但是要记得对应虚拟机的IP地址。

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第1张图片

1.2.1 修改主机名

这里因为我的IP是192.168.190.135所以我改为hadoop135

vim /etc/hostname -> hadoop135

1.2.2 增加主机映射

因为后续集群部署是三个机器所以要添加域名映射

vim /etc/hosts

192.168.190.135 hadoop135
192.168.190.136 hadoop136
192.168.190.137 hadoop137

重启即可。

reboot

1.3 在hadoop136上安装JDK

1.3.1 上传JDK Hadoop资源文件

通过远程链接软件Xshell或者FinalShell连接到虚拟机,上传JDK文件到/opt/software。

image-20211128172350946

1.3.2 解压到/opt/module目录下

tar -zxvf jdkxxxx.gz -C /opt/module

1.3.3 配置JDK环境变量

/etc/profile.d/新建jdk_path.sh文件

写入:

#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin

让资源文件生效:source /etc/profile

1.3.4 测试是否安装成功

java -version

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第2张图片

1.4 在hadoop136上安装hadoop

1.4.1 上传Hadoop

image-20211128172350946

1.4.2 解压Hadoop

1.4.3 配置Hadoop环境变量

1.4.3 测试Hadoop是否安装成功

2.本地模式

2.1 Hadoop目录结构

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第3张图片

  • bin目录:存放对 Hadoop 相关服务(hdfs,yarn,mapred)进行操作的脚本
  • etc目录:Hadoop 的配置文件目录,存放 Hadoop 的配置文件
  • lib目录:存放 Hadoop 的本地库(对数据进行压缩解压缩功能)
  • sbin目录:存放启动或停止 Hadoop 相关服务的脚本
  • share目录:存放 Hadoop 的依赖 jar 包、文档、和官方案例

2.2 本地运行模式(官方WordCount)

2.2.1 在hadoop-3.1.3 文件下创建wcinput文件夹

mkdir wcinput

2.2.2 在同文件夹下创建wcoutput

mkdir wcoutput

2.2.3 在wcinput文件夹下创建word.txt

vim word.txt

hadoop yarn
hadoop mapreduce
dengschoo
deng schoo

2.2.4 执行程序

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput wcoutput

deng    1
dengschoo       1
hadoop  2
mapreduce       1
schoo   1
yarn    1

3.集群模式(完全分布式运行模式)

3.1 集群规划

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第4张图片

3.2 配置文件说明

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第5张图片

3.3 配置集群

cd $HADOOP_HOME/etc/hadoop

3.3.1 核心配置文件

vim core-site.xml


 
 
 fs.defaultFS
 hdfs://hadoop136:8020
 
 
 
 hadoop.tmp.dir
 /opt/module/hadoop-3.1.3/data
 
 
 
 hadoop.http.staticuser.user
 dengschoo
 

3.3.2 HDFS配置文件

vim hdfs-site.xml




 dfs.namenode.http-address
 hadoop136:9870
 

 
 dfs.namenode.secondary.http-address
 hadoop137:9868
 

3.3.3 YARN配置文件

vim yarn-site.xml


 
 
 yarn.nodemanager.aux-services
 mapreduce_shuffle
 
 
 
 yarn.resourcemanager.hostname
 hadoop135
 
 
 
 yarn.nodemanager.env-whitelist
 
JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CO
NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
RED_HOME
 

3.3.4 MapReduce配置文件

vim maored-site.xml



 
 mapreduce.framework.name
 yarn
 

3.3.5 分发配置文件

将配置好的文件下发到hadoop135,hadoop136, hadoop137

最好的效果是三个worker的配置文件是一样的。

4.4 启动集群

4.1 配置worker

vim etc/hadoop/workers

删除localhost,文中不可以有空格 空行

hadoop135
hadoop136
hadoop137

4.2 启动集群

4.2.1 格式化节点

需要再hadoop136下格式化NameNode

hdfs namenode -format

4.2.2 启动hdfs

启动HDFS

sbin/start-dfs.sh

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第6张图片

4.2.3 在部署yarn节点上(hadoop135)启动yarn

sbin/start-yarn.sh

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第7张图片

4.2.4 web查看hdfs

http://hadoop136:9870

查看存储的数据信息

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第8张图片

4.2.5 web查看YARN的ResourceManager

http:hadoop135:8088

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第9张图片

查看yarn上运行的job信息

4.实验1 HDFS Shell命令

4.1 命令

hadoop fs [命令选项]

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第10张图片

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第11张图片

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第12张图片

4.2 常用命令实例

在HDFS文件系统上建立一个目录,将本地文件系统上传到该目录。

  1. hadoop fs -mkdir test : 在HDFS创建test目录

    【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第13张图片

  2. hadoop fs -ls /:显示HDFS目录结构

    【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第14张图片

  3. echo "Hello Hadoop DengSchoo" > file.txt : 创建一个文件

    image-20211128194236940

  4. hadoop fs -put file.txt /test/ : 上传该文件到/test/

    image-20211128194322004

  5. hadoop fs -ls /test/ :显示HDFS路径

    【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第15张图片

  6. hadoop fs -cat /test/file.ext:查看HDFS内容

image-20211128194426697

5.实验2 HDFS Java接口调用

5.0 Hadoop Win依赖Path配置

添加依赖:hadoop bin 到系统环境变量。

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第16张图片

5.1 创建Maven工程导入依赖


 
 org.apache.hadoop
 hadoop-client
 3.1.3
 
 
 junit
 junit
 4.12
 
 
 org.slf4j
 slf4j-log4j12
 1.7.30
 


5.2 API操作

5.2.1 创建文件夹

package com.dengschoo.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;


/**
 * @author :Deng Schoo
 * @version :V1.0
 * @className :HdfsClient
 * @description :TODO
 * @date :2021/11/28 19:57
 */
public class HdfsClient {
    @Test
    public void testMkdirs() throws URISyntaxException, IOException, InterruptedException {
        // 1. 获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"), configuration, "hadoop");
        // 2. 创建目录
        fs.mkdirs(new Path("/javaAPI/test/"));

        // 3. 关闭资源
        fs.close();
    }
}

输出 成功通过测试

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第17张图片

5.2.2 上传文件

package com.dengschoo.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;


/**
 * @author :Deng Schoo
 * @version :V1.0
 * @className :HdfsClient
 * @description :TODO
 * @date :2021/11/28 19:57
 */
public class HdfsClient {
    @Test
    public void testMkdirs() throws URISyntaxException, IOException, InterruptedException {
        // 1. 获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"), configuration, "hadoop");
        // 2. 创建目录
        fs.mkdirs(new Path("/javaAPI/test/"));

        // 3. 关闭资源
        fs.close();
    }

    @Test
    public void testCopyFromLocalFile() throws URISyntaxException, IOException, InterruptedException {
        // 1. 获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"), configuration, "hadoop");

        // 2. 上传文件
        fs.copyFromLocalFile(new Path("D:\\Study\\GradeFour\\Course\\CloudComputingProjects\\src\\main\\java\\com\\dengschoo\\hdfs\\file.txt"), new Path("/javaAPI/test/"));

        //3.关闭资源
        fs.close();
    }
}

输出:

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第18张图片

5.2.3 文件下载

 @Test
    public void testCopyToLocalFile() throws URISyntaxException, IOException, InterruptedException {
        // 1. 获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"), configuration, "hadoop");
        // 指向文件下载操作
        // boolean 是否删除源文件
        // src
        // des
        // 是否开启文件校验
        fs.copyToLocalFile(false,new Path("/javaAPI/test/file.txt"), new Path("D:\\Environment\\TestEnv"), true);

        //3.关闭资源
        fs.close();
    }

5.2.4 文件更名和移动

@Test
    public void testRename() throws IOException, InterruptedException, URISyntaxException{
        // 1 获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"),
                configuration, "hadoop");
        // 2 修改文件名称
        fs.rename(new Path("/javaAPI/test/file.txt"), new
                Path("/javaAPI/test/file——new.txt"));
        // 3 关闭资源
        fs.close();
    }

5.2.5 HDFS删除文件和目录

@Test
    public void testDelete() throws IOException, InterruptedException,
            URISyntaxException{
        // 1 获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"),
                configuration, "hadoop");
        // 2 执行删除
        fs.delete(new Path("/javaAPI/test"), true);
        // 3 关闭资源
        fs.close();
    }

5.2.6 文件详情查看

@Test
    public void testListFiles() throws IOException, InterruptedException,
            URISyntaxException {
        // 1 获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"),
                configuration, "hadoop");
        // 2 获取文件详情
        RemoteIterator listFiles = fs.listFiles(new Path("/"),
                true);
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            System.out.println("========" + fileStatus.getPath() + "=========");
            System.out.println(fileStatus.getPermission());
            System.out.println(fileStatus.getOwner());
            System.out.println(fileStatus.getGroup());
            System.out.println(fileStatus.getLen());
            System.out.println(fileStatus.getModificationTime());
            System.out.println(fileStatus.getReplication());
            System.out.println(fileStatus.getBlockSize());
            System.out.println(fileStatus.getPath().getName());
            // 获取块信息
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            System.out.println(Arrays.toString(blockLocations));
        }
        // 3 关闭资源
        fs.close();
    }

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第19张图片

5.2.7 HDFS文件和文件夹判断

@Test
    public void testListStatus() throws IOException, InterruptedException,
            URISyntaxException{
        // 1 获取文件配置信息
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"),
                configuration, "hadoop");
        // 2 判断是文件还是文件夹
        FileStatus[] listStatus = fs.listStatus(new Path("/"));
        for (FileStatus fileStatus : listStatus) {
            // 如果是文件
            if (fileStatus.isFile()) {
                System.out.println("f:"+fileStatus.getPath().getName());
            }else {
                System.out.println("d:"+fileStatus.getPath().getName());
            }
        }
        // 3 关闭资源
        fs.close();
    }

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第20张图片

6.实验3 MapReduce应用程序

6.1 编写Mapper类

public static class MyMapper
            extends Mapper {
        private final static IntWritable one = new IntWritable(1);//one表示单词在该行 中的出现次数
        private final Text word = new Text(); //word存放一行中的单词
        /*定义map方法,分割文本行中的单词,将单词及其在该行中的出现次数1写入conte
        xt;形参value表示一行文本*/
        public void map(Object key, Text value, Context context
        ) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, one);//把word、one写入到context中
            }
        }
    }

6.2 编写Reducer类

public static class MyReducer
            extends Reducer {
        private final IntWritable result = new IntWritable();//result表示单词出现的总次数
        public void reduce(Text key, Iterable values,
                           Context context
        ) throws IOException, InterruptedException {
            int sum = 0;//sum存放该单词出现的总次数
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum); //result表示单词的总次数,是最后输出的“值”
            context.write(key, result);
        }
    }

6.3 编写主类

public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        Configuration conf = new Configuration();
        System.setProperty("HADOOP_USER_NAME","hadoop");
        Job job = Job.getInstance(conf, "wordcount"); //创建一个job对象
        job.setUser("hadoop");
        job.setJarByClass(MapReduceTest.class); //创建一个job对象
        job.setMapperClass(MyMapper.class); //设置自定义的Mapper类
        job.setCombinerClass(MyReducer.class);
        job.setReducerClass(MyReducer.class);//设置自定义的Reducer类
        job.setOutputKeyClass(Text.class);//设置map()方法输出的key类型
        job.setOutputValueClass(IntWritable.class);//设置输出的value的类型
        job.setUser("hadoop");
        FileInputFormat.addInputPath(job,
                new Path("hdfs://192.168.190.136:8020/javaAPI/test/input"));
//job作业执行时输入文件的路径
        FileOutputFormat.setOutputPath(job,
                new Path("hdfs://192.168.190.136:8020/javaAPI/test/out"));
        System.exit(job.waitForCompletion(true) ? 0 : 1);//设置job作业执行的输出路
    }

6.4 运行结果

【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序_第21张图片

你可能感兴趣的:(【Cloud Computing】Hadoop环境安装、基本命令及MapReduce字数统计程序)