大数据处理(选修)实验课:实验一 Map Reduce实验

第一部分 Hadoop与spark的安装与配置实验
  1. VMware安装Ubuntu,配置虚拟机

    VMware 安装 Ubuntu(2023 当然要看热乎的教程了)_vmware安装ubuntu-CSDN博客

  2. Java环境与Hadoop配置

    Hadoop3.1.3安装教程_单机/伪分布式配置

  3. spark安装

    Spark 学习指南

  4. 环境变量配置,没有的就补充上

    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
    #顶部
    export HADOOP_HOME=/usr/local/hadoop
    export HADOOP_OPTS=-Djava.library.path=$HADOOP_HOME/lib
    export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
    export SPARK_HOME=/usr/local/spark
    export PATH=$SPARK_HOME/bin:$PATH
    export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
    #底部
    
  5. 配置Spark和Hadoop,确保Spark可以找到Hadoop的配置文件。将Hadoop的配置文件复制到Spark的conf目录下

    cp $HADOOP_HOME/etc/hadoop/core-site.xml $SPARK_HOME/conf/
    cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml $SPARK_HOME/conf/
    
第二部分 HDFS的配置、启动和使用
  1. 向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件;

    # hdfs dfs -test 是用来测试文件或目录的命令。
    # -e 参数表示测试文件或目录是否存在
    # hdfs dfs -copyFromLocal 是用来从本地文件系统复制文件到 HDFS 的命令。
    # -f 参数表示强制覆盖目标文件(如果它已经存在)。
    if $(hdfs dfs -test -e text.txt); 
    then $(hdfs dfs -appendToFile /home/hadoop/MapReduce/myLocalFile.txt text.txt); 
    else $(hdfs dfs -copyFromLocal -f /home/hadoop/MapReduce/myLocalFile.txt text.txt); 
    fi
    
  2. 从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;

    if $(hdfs dfs -test -e file:///home/hadoop/MapReduce/text.txt); 
    then $(hdfs dfs -copyToLocal text.txt /home/hadoop/MapReduce/text1.txt);  
    else $(hdfs dfs -copyToLocal text.txt /home/hadoop/MapReduce/text.txt);  
    fi
    
  3. 将HDFS中指定文件的内容输出到终端中;

    hdfs dfs -cat text.txt
    
  4. 显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息;

    # -h	以更人性化(human-readable)的格式显示文件大小
    hdfs dfs -ls -h text.txt
    
  5. 给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息;

    # 参数解读:
    # -R	目录操作
    hdfs dfs -ls -R -h /user/hadoop
    
  6. 提供一个HDFS内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录;

    # 如果存在就创建文件,否则同时创建目录与文件
    # -p 参数允许用户创建目录及其不存在的父目录。具体来说,如果指定的目录路径中某些目录不存在,-p 参数将自动创建这些目录,确保指定的整个目录路径都会被创建。
    if $(hdfs dfs -test -d dir1/dir2);
    then $(hdfs dfs -touchz dir1/dir2/filename); 
    else $(hdfs dfs -mkdir -p dir1/dir2 && hdfs dfs -touchz dir1/dir2/filename); 
    fi
    
    # 删除文件
    hdfs dfs -rm dir1/dir2/filename
    
    # 删除目录
    hdfs dfs -rm -r dir1
    
  7. 提供一个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录;

    # 创建目录
    hdfs dfs -mkdir -p dir1/dir2
    
    # 删除目录(如果目录非空则会提示not empty,不执行删除)
    # 以下指令的执行结果:
    # rmdir: `dir1/dir2': Directory is not empty
    hdfs dfs -rmdir dir1/dir2
    
    # 强制删除目录:
    # 在rm指令和cp指令中,-r参数和-R参数是可以互换使用的
    hdfs dfs -rm -R dir1/dir2
    
  8. 向HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾;

    # 追加到文件末尾:
    # local.txt应该替换为本地目录中的本地文件
    # 示例:hdfs dfs -appendToFile ~/MapReduce/text.txt text.txt
    hdfs dfs -appendToFile local.txt text.txt
    
    # 追加到文件开头:
    # (由于没有直接的命令可以操作,方法之一是先移动到本地进行操作,再进行上传覆盖)
    # get指令是将hdfs中制定的文件保存在本地的位置,并且不会删除text的内容
    # 相关参数解读:
    # -f	覆盖目标
    # -p 	保留文件属性
    # -crc	启动文件crc校验
    hdfs dfs -get text.txt
    cat text.txt >> local.txt
    hdfs dfs -copyFromLocal -f text.txt text.txt
    
    
  9. 删除HDFS中指定的文件;

    # 删除文件
    hdfs dfs -rm dir1/dir2/filename
    
  10. 删除HDFS中指定的目录,由用户指定目录中如果存在文件时是否删除目录;

    # 删除目录(如果目录非空则会提示not empty,不执行删除)
    # 以下指令的执行结果:
    # rmdir: `dir1/dir2': Directory is not empty
    hdfs dfs -rmdir dir1/dir2
    
    # 强制删除目录:
    # 在rm指令和cp指令中,-r参数和-R参数是可以互换使用的
    hdfs dfs -rm -R dir1/dir2
    
  11. 在HDFS中,将文件从源路径移动到目的路径。

    hdfs dfs -mv text.txt text2.txt
    
第三部分 WordCount实验
  1. 启动spark

    cd /usr/local/spark
    bin/spark-shell
    
  2. 使用命令行执行scala代码,注意双引号格式,在spark-shell中读取Linux系统本地文件file:///home/stu/software/hadoop/README.txt, 统计“Hadoop”单词的个数。

    val sc = new SparkContext()
    /*
    但实际上,如果你是在命令行中使用 Scala 和 Spark 的交互式 shell,那么 Spark shell 会自动为你创建 SparkContext,并命名为 sc。在这种情况下,你无需手动创建 SparkContext,因为 Spark shell 已经帮你做好了初始化。
    */
    val textFile = sc.textFile("file:///usr/local/hadoop/README.txt")
    textFile.count()
    

    输出结果如下:

    WordCount输出结果1

    val linesWithHadoop = textFile.filter(line => line.contains("Hadoop"))
    linesWithHadoop.count()
    

    输出结果如下:

    WordCount结果2

  • 上面两条语句可以通过链式操作合并为:

    val linesCountWithHadoop = textFile.filter(line => line.contains("Hadoop")).count()
    
  1. 在spark-shell中读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;

    如果文件不存在的创建:

    if $(hdfs dfs -test  -e user/hadoop/test.txt); 
    then $(hdfs dfs -appendToFile /home/hadoop/MapReduce/myLocalFile.txt test.txt); 
    else $(hdfs dfs -copyFromLocal -f /home/hadoop/MapReduce/myLocalFile.txt test.txt); 
    fi
    
    val lines = sc.textFile("hdfs://localhost:9000/user/hadoop/test.txt")
    lines.count()
    
  2. 使用命令行来实现wordcount,即统计文件中各个单词的计数:

    val sc = new SparkContext()
    val textFile = sc.textFile("file:///usr/local/hadoop/README.txt")
    val wordCounts = textFile.flatMap(line => line.split("")).map(word => (word,1)).reduceByKey((a,b) => a+b)
    wordCounts.collect()
    wordCounts.foreach(println)
    

    在这里插入图片描述

  3. 用scale语言实现wordcount

  • WordCount程序参考代码1:

    import java.io.File
    import scala.io.Source
    
    object WordCountApp {
    
      def main(args: Array[String]): Unit = {
        //文件路径
        val filePath = "file:///usr/local/hadoop/README.txt"
        val codec = "utf-8"
        //打开文件
        val file = Source.fromFile(filePath, codec)  
        val wc = file.getLines().flatMap(_.split("\t")).toList.map((_, 1)).groupBy((_._1)).mapValues(_.size)
    println(wc)
        // 关闭文件
        file.close()
      }
    }
    
  • WordCount程序参考代码2:

    import java.io.File
    import scala.io.Source
    
    object WordCountApp {
    
      def main(args: Array[String]): Unit = {
        //文件路径
        val filePath = "file:///usr/local/hadoop/README.txt"
        val codec = "utf-8"
        //打开文件
        val file = Source.fromFile(filePath, codec)  
        val wc = file.getLines().flatMap(_.split("\t")).toList.map((_, 1)).groupBy((_._1)).mapValues(_.size)
    println(wc)
        // 关闭文件
        file.close()
      }
    }
    
  1. 试一试,是否还有其他的实现方式?
第四部分 PageRank实验

​ 留一个参考链接:PageRank 算法在Hadoop和Spark上的实现-CSDN博客

  采用的方案是在eclipse软件中编写Java工程文件实现PageRank。具体步骤如下。

  1. 安装eclipse

    首先从官网下载eclipse软件(官网下载地址:Eclipse Downloads | The Eclipse Foundation),注意需要Download Package,具体的版本是linux x86_64。

    安装eclipse

      接下来的操作在linux中完成。先放一份参考链接:使用Eclipse编译运行MapReduce程序)

      首先将刚刚下载的包解压缩,放置在希望的安装目录(事实上,正是因为在ubuntu直接下载的eclipse安装在了只读的系统位置,才需要自主安装到所期望的位置的):

    sudo tar -zxvf ~/下载/eclipse.tar.gz -C /usr/lib  
    
  2. 安装 Hadoop-Eclipse-Plugin

      要在 Eclipse 上编译和运行 MapReduce 程序,需要安装 hadoop-eclipse-plugin,可下载 Github 上的插件winghc/hadoop2x-eclipse-plugin,解压后将 release 中的 hadoop-eclipse-kepler-plugin-2.6.0.jar (还提供了 2.2.0 和 2.4.1 版本)复制到 Eclipse 安装目录的 plugins 文件夹中,运行 eclipse -clean 重启 Eclipse 即可(添加插件后只需要运行一次该命令,以后按照正常方式启动就行了)。

    unzip -qo ~/下载/hadoop2x-eclipse-plugin-master.zip -d ~/下载    # 解压到 ~/下载 中
    sudo cp ~/下载/hadoop2x-eclipse-plugin-master/release/hadoop-eclipse-plugin-2.6.0.jar /usr/lib/eclipse/plugins/    # 复制到 eclipse 安装目录的 plugins 目录下
    /usr/lib/eclipse/eclipse -clean    # 添加插件后需要用这种方式使插件生效
    
  3. 配置Hadoop-Eclipse-Plugin

    注意这部分的内容:

    其实不对的内容

      经实际操作,ubuntu实际上也需要切换才能看到,所以看不到没事,忽略这个问题。剩下的按照下述操作,也就是完成插件的进一步配置就可以了。完成之后应该能看到,还看不到就要重新配置了:(

    • 第一步:选择 Window 菜单下的 Preference。

      插件配置1

      此时会弹出一个窗体,窗体的左侧会多出 Hadoop Map/Reduce 选项,点击此选项,选择 Hadoop 的安装目录(如/usr/local/hadoop,Ubuntu不好选择目录,直接输入就行)。

      插件配置2

    • 第二步:切换 Map/Reduce 开发视图,选择 Window 菜单下选择 Open Perspective -> Other(CentOS 是 Window -> Perspective -> Open Perspective -> Other),弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换。

      插件配置3

    • 第三步:建立与 Hadoop 集群的连接,点击 Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location。

      插件配置4

      ​ 在弹出来的 General 选项面板中,General 的设置要与 Hadoop 的配置一致。一般两个 Host 值是一样的,如果是伪分布式,填写 localhost 即可,另外我使用的Hadoop伪分布式配置,设置 fs.defaultFS 为 hdfs://localhost:9000,则 DFS Master 的 Port 要改为 9000。Map/Reduce(V2) Master 的 Port 用默认的即可,Location Name 随意填写。

      ​ 最后的设置如下图所示:

      插件配置5

    • 点击 finish,Map/Reduce Location 就创建好了。

  4. 在 Eclipse 中操作 HDFS 中的文件

      直接看博客(其实不需要看也懂所以不说明了)

      Tips: HDFS 中的内容变动后,Eclipse 不会同步刷新,需要右键点击 Project Explorer中的 MapReduce Location,选择 Refresh,才能看到变动后的文件。

  5. 创建MapReduce项目

    ​ 基本的操作都是一样的,但有一点要注意:

    ​ 创建class的时候,Package 处需要填写 org.apache.hadoop.examples。

    ​ 剩下的就是枯燥的写代码时间了。忽略。

  6. 运行MapReduce项目

    • 在运行 MapReduce 程序前,还需要执行一项重要操作(也即配置文件解决参数设置问题):将 /usr/local/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 复制到 PageRank 项目下的 src 文件夹中:
    cp /usr/local/hadoop/etc/hadoop/core-site.xml ~/eclipse-workspace/PageRank/src
    cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml ~/eclipse-workspace/PageRank/src
    cp /usr/local/hadoop/etc/hadoop/log4j.properties ~/eclipse-workspace/PageRank/src
    
    • 之后刷新,要记得手动刷新项目,它不自动刷新:(

    • 点击工具栏中的 Run 图标,或者右键点击 Project Explorer 中的 PageRank.java,选择 Run As -> Run on Hadoop,就可以运行 MapReduce 程序了。不过由于没有指定参数,运行时会提示 "Usage: wordcount ",需要通过Eclipse设定一下运行参数。

    • 右键点击java文件,选择 Run As -> Run Configurations,在此处可以设置运行时的相关参数(如果 Java Application 下面没有 WordCount,那么需要先双击 Java Application)。切换到 “Arguments” 栏,在 Program arguments 处填写所需的输入输出文件。在这里就是"data.txt PageRank_out Sort_out"这三个。实际情况下,根据文件中所需的进行修改即可。

  7. 结果分析

    • 运行数据量很大,需要等大概半小时。完成后显示结果如下:

      结果1

    • 数据以PageRank_out文件夹中的信息保存了每一次迭代的日志信息,以Sort_out文件夹中的信息保存了最终按照权值排序的结果。Sort中结果如下:

    在这里插入图片描述

    • 可以观察到,大的值和小的值之间的差距是好几个数量级的。实验一第四部分完成:)
  • 29
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_34933795

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值