zoukankan      html  css  js  c++  java
  • 【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地址。

    image-20211128171458287

    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

    image-20211128173826359

    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目录结构

    image-20211128174201648

    • 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 集群规划

    image-20211128175516509

    3.2 配置文件说明

    image-20211128175545220

    3.3 配置集群

    cd $HADOOP_HOME/etc/hadoop

    3.3.1 核心配置文件

    vim core-site.xml

    <configuration>
     <!-- 指定 NameNode 的地址 -->
     <property>
     <name>fs.defaultFS</name>
     <value>hdfs://hadoop136:8020</value>
     </property>
     <!-- 指定 hadoop 数据的存储目录 -->
     <property>
     <name>hadoop.tmp.dir</name>
     <value>/opt/module/hadoop-3.1.3/data</value>
     </property>
     <!-- 配置 HDFS 网页登录使用的静态用户为 atguigu -->
     <property>
     <name>hadoop.http.staticuser.user</name>
     <value>dengschoo</value>
     </property>
    </configuration>
    

    3.3.2 HDFS配置文件

    vim hdfs-site.xml

    <configuration>
    <!-- nn web 端访问地址-->
    <property>
     <name>dfs.namenode.http-address</name>
     <value>hadoop136:9870</value>
     </property>
    <!-- 2nn web 端访问地址-->
     <property>
     <name>dfs.namenode.secondary.http-address</name>
     <value>hadoop137:9868</value>
     </property>
    </configuration>
    

    3.3.3 YARN配置文件

    vim yarn-site.xml

    <configuration>
     <!-- 指定 MR 走 shuffle -->
     <property>
     <name>yarn.nodemanager.aux-services</name>
     <value>mapreduce_shuffle</value>
     </property>
     <!-- 指定 ResourceManager 的地址-->
     <property>
     <name>yarn.resourcemanager.hostname</name>
     <value>hadoop135</value>
     </property>
     <!-- 环境变量的继承 -->
     <property>
     <name>yarn.nodemanager.env-whitelist</name>
     
    <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CO
    NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
    RED_HOME</value>
     </property>
    </configuration>
    

    3.3.4 MapReduce配置文件

    vim maored-site.xml

    <configuration>
    <!-- 指定 MapReduce 程序运行在 Yarn 上 -->
     <property>
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
     </property>
    </configuration>
    

    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

    image-20211128191910907

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

    sbin/start-yarn.sh

    image-20211128192308418

    4.2.4 web查看hdfs

    http://hadoop136:9870

    查看存储的数据信息

    image-20211128192014402

    4.2.5 web查看YARN的ResourceManager

    http:hadoop135:8088

    image-20211128192449922

    查看yarn上运行的job信息

    4.实验1 HDFS Shell命令

    4.1 命令

    hadoop fs [命令选项]

    image-20211128193330802

    image-20211128193340676

    image-20211128193400341

    4.2 常用命令实例

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

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

      image-20211128194150365

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

    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路径

      image-20211128194353616

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

    image-20211128194426697

    5.实验2 HDFS Java接口调用

    5.0 Hadoop Win依赖Path配置

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

    image-20211128201752176

    5.1 创建Maven工程导入依赖

    <dependencies>
     <dependency>
     <groupId>org.apache.hadoop</groupId>
     <artifactId>hadoop-client</artifactId>
     <version>3.1.3</version>
     </dependency>
     <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.12</version>
     </dependency>
     <dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-log4j12</artifactId>
     <version>1.7.30</version>
     </dependency>
    </dependencies>
    
    

    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();
        }
    }
    
    

    输出 成功通过测试

    image-20211128201931680

    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();
        }
    }
    
    

    输出:

    image-20211128202440327

    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<LocatedFileStatus> 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();
        }
    

    image-20211128203853647

    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();
        }
    

    image-20211128203823578

    6.实验3 MapReduce应用程序

    6.1 编写Mapper类

    public static class MyMapper
                extends Mapper<Object, Text, Text, IntWritable> {
            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<Text, IntWritable,Text,IntWritable> {
            private final IntWritable result = new IntWritable();//result表示单词出现的总次数
            public void reduce(Text key, Iterable<IntWritable> 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 运行结果

    image-20211128213121007

  • 相关阅读:
    【转】XP下安装IIS6.0的办法
    设计模式学习笔记十:单例模式(Singleton Pattern)
    linq学习笔记(2):DataContext
    设计模式学习笔记十二:桥接模式(Bridge Pattern)
    英文版c#数据结构
    linq学习笔记(3):Where
    一步步学习WCF(1):Hello
    linq学习笔记(5):Count/Sum/Min/Max/Avg
    [转]Asp.Net 面试题目收集
    从谷歌公司发现的十个至理名言
  • 原文地址:https://www.cnblogs.com/DengSchoo/p/15616727.html
Copyright © 2011-2022 走看看