云盘算与海量数据管理实行

打印 上一主题 下一主题

主题 663|帖子 663|积分 1989

撰文目的:记载 NUAA 2022-2023 学年第一学期选修实行课的过程,也希望对背面学这门课程的同学有所资助。
主要参考链接:https://blog.csdn.net/catharryy/article/details/9186757
Hadoop实行教程部分由老师给出,这部分内容非常详细,我在自己实践的底子上稍加改动了一些。
Hadoop实行教程

一、安装虚拟机软件VirtualBox (Vmware Workstation也可)
这里我选择的是Vmware Workstation。

二、使用VirtualBox新建虚拟机并安装Ubuntu系统
提示:硬盘不要分太小,后续盘算有出问题的可能性
Ubuntu镜像下载地点  https://ubuntu.com/download/desktop
若碰到关于虚拟机的安装问题,请自行解决,此处不做过多阐述。
唯一要提醒各人的是:虚拟机用户名尽量能体现自己的身份(比如名字拼写之类的),如许就可以跳过第三个步调了。

三、创建一个新账户(教程中红色hadoop为用户名,黑色hadoop为文件夹)
  1、使用CTRL+ALT+T打开命令行终端,输入命令创建新用户
    sudo useradd -m hadoop -s /bin/bash  
    说明:-m表示自动创建用户目录(/home/hadoop),hadoop是用户名,-s表示使用/bin/bash作为shell  (注意用户名能体现是自己做的)
  2、给新用户设置密码
    sudo passwd hadoop
    说明:输入两次新密码
  3、给新用户增长管理员权限
    sudo adduser hadoop sudo
  4、注销当前用户,并以新用户登录(登录新建的hadoop账户)

四、在Ubuntu中挂载共享文件夹
VirtualBox
  1、“设备”->“共享文件夹”,记住共享文件夹的共享名
  2、“设备”->“安装加强功能“
    说明:安装好了,桌面上会出现光盘图标VBox_GAs_5.2.18和一个虚拟盘sf_VirtualBoxShare
3、进入目录/media/hadoop/VBox_GAs_5.2.18,执行命令./VBoxLinuxAddtion.run
  4、将共享文件夹挂载到Ubuntu的一个文件夹
    (1)创建挂载的目标文件夹
      mkdir ~/share
    (2)挂载
      格式:mount -t vboxsf 共享名 本地目录
      mount -t vboxsf VirtualBoxShare ~/share
      说明:VirtualBox是共享文件夹的共享名,share目录需要事先在家目录(~,即/home/hadoop) 下创建
  5、设置vbox共享粘贴板
    “设备”->“共享粘贴板”->“双向“
    说明:如许在真机和虚拟机之间可以任意的复制和粘贴。
Vmware Workstation
1.依次点击VMWare窗口左上方的“虚拟机”、“设置”
2.弹出的对话框中依次点击“选项”、“共享文件夹”、“下一步”
3.选择要共享的文件夹路径,并填写名称。



4.进入虚拟机,安装VMware Tools:依次点击“虚拟机”、“重新安装VMware Tools”(1. 详细安装方法自行查找2. 如果该选项是灰色,说明已经安装好,无需再次安装)
5.至此,在/mnt/hgfs/下应该就能看到刚才在虚拟机中设置的windows下的共享文件夹vmshare了

6.如果到上面一步时/mnt/hgfs/下没有共享文件夹,再加一条命令即可:
vmhgfs-fuse .host:/  /mnt/hgfs/
这时把你在windows下的文件放入共享文件夹vmshare中,再回到Ubuntu中,cd 到/mnt/hgfs/vmshare,就可以看到这些共享的文件了。


五、安装一些必要的工具
  1、更新apt-get
    sudo apt-get update (执行这一步之前可将用户模式切换到根模式——输入sudo -s)
    说明:apt-get是用来安装软件的工具
  2、安装ssh服务
    apt-get install openssh-server
    说明:ssh是机器之间远程登录的服务
  3、安装vim (如果不风俗使用vim编辑器可不安装)
    apt-get install vim 

六、配置免密登录
  1、禁用防火墙  
    ufw disable
    ufw status //查看防火墙状态
2、生成密钥对
      ssh localhost(测试一下 SSH 是否可用,要在用户模式下登录——在此之前输入su hadoop)
      exit
   

    cd ~/.ssh
    ssh-keygen -t rsa
    说明:一路回车,在~/.ssh目录会生成一个两个文件,id_rsa和id_rsa.pub
  3、将公钥复制到localhost
    ssh-copy-id localhost
    说明:也可cat  ./id_rsa.pub >> ./authorized_keys,如许~/.ssh目录又会多一个文件authorized_keys
  4、登录测试  
    ssh localhost (看是否需要输入密码
  5、退出与localhost的连接
    exit

七、安装并配置jdk
  1、在家目录(~)下新建/app 文件夹
    mkdir ~/app
     说明:背面的jdk、hadoop等都安装在此
2、在真机中将jdk、hadoop的安装包复制到真机的共享文件夹中
jdk、hadoop安装包下载地点(hadoop尽量下载最新的实用版本,jdk下载jdk8的版本)
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
https://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.10.1/
  3、安装jdk
tar -zxvf /mnt/hgfs/vmshare/jdk-8u311-linux-x64.tar.gz -C ~/app
    mv ~/app/jdk1.8.0_311 ~/app/jdk   (注意文件名匹配)
  4、配置jdk
  (1)编辑配置文件.bashrc
    vim ~/.bashrc (不风俗用vim编辑器可改用 gedit ~/.bashrc,下同)(稍微提一下vim,可能常常用到的:i -> 插入模式,此时可以在文件任意位置编辑内容;编辑完成后,按下Esc键,依次输入 :wq 即可完成保存)
     export JAVA_HOME=/home/hadoop/app/jdk
     export JRE_HOME=$JAVA_HOME/jre
     export CLASSPATH=.CLASSPATHJAVA_HOME/libJRE_HOME/lib
     export PATH=$PATHJAVA_HOME/binJRE_HOME/bin
                这段内容可以复制到文件末尾,注意修改红字部分
  (2)编译配置文件
    source ~/.bashrc
  (3)测试jdk
    java -version


八、安装hadoop
  1、安装hadoop
   tar -zxvf /mnt/hgfs/vmshare/hadoop-2.10.1.tar.gz -C ~/app //解压
   mv ~/app/hadoop-2.10.1 ~/app/hadoop //改名 (注意文件名匹配)
        sudo chown -R hadoop ./hadoop //修改hadoop权限
  2、配置hadoop
    (1)配置环境变量
      vim ~/.bashrc,添加或修改以下语句:
export HADOOP_HOME=/app/hadoop

export PATH=$PATHJAVA_HOME/binJRE_HOME/binHADOOP_HOME/binHADOOP_HOME/sbin

      source ~/.bashrc //编译收效
    (2)配置hadoop-env.sh
      vim ~/app/hadoop/etc/hadoop/hadoop-env.sh
      找到export JAVA_HOME=${JAVA_HOME}这一行,将其修改为:
      export JAVA_HOME=/home/hadoop/app/jdk
    (3)配置core-site.xml (均位于~/app/hadoop/etc/hadoop/,下同)  
      <configuration>
        <property>
          <name>fs.defaultFS</name>
          <value>hdfs://localhost:9000</value>
        </property>
        <property>
          <name>hadoop.tmp.dir</name>
          <value>/home/hadoop/app/hadoop/tmp</value>
        </property>
      </configuration>
    (4)配置hdfs-site.xml    
      <configuration>
        <property>
          <!--配置块的副本数 -->
          <name>dfs.replication</name>
          <value>1</value>
        </property>
      </configuration>
    (5)配置mapred-site.xml
      说明:需将mapred-site.xml.template复制成mapred-site.xml
      <configuration>
        <property>
          <name>mapreduce.framework.name</name>
          <value>yarn</value>
        </property>
      </configuration>
    (6)配置yarn-site.xml
      <configuration>
        <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
        </property>
      </configuration>

九、运行hadoop
  1、格式化namenode
    cd ~/app/hadoop/bin
./hadoop namenode -format
    说明:首次运行须格式化,以后运行就不需要这一步。格式化后会在core-site.xml中hadoop.tmp.dir所指定的目录中生成name文件夹。
  2、运行hadoop (要在用户模式下)
    cd ~/app/hadoop/sbin
    ./start-all.sh
  3、查看进程:
    jps     
      14262 NameNode
      15976 NodeManager
      14385 DataNode
      15884 ResourceManager
      14601 SecondaryNameNode
      16120 Jps
    如果出现以上进程(前面的数字不愿定一致),说明hadoop环境搭建成功,分布式系统启动完成。  
  4、webUI查看(在虚拟机中的网络浏览器查看)
    http://localhost:50070 //查看hdfs
    http://localhost:8088 //查看mapreduce作业环境
十、测试wordcount步调
  1、生成单词文件
    mkdir ~/tmp
    echo 'hello world hello hadoop' > ~/tmp/word1.txt
    echo 'hive run on hadoop' > ~/tmp/word2.txt  
  2、上传至hdfs
    (1)在hdfs上新建输入数据的目录(在~/app/hadoop/bin目录下)
      ./hdfs dfs -mkdir /input
    (2)上传文件
      ./hdfs dfs -put ~/tmp/word*.txt /input
  3、运行hadoop自带的单词计数步调  
    ./hadoop jar ~/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /input output
注:这里的红字部分可能需要修改,这时你需要去对应的路径下查看文件名,按实际环境进行修改,比如我在做这一步调的时候,就将2.7.3修改成了2.10.1

4、查看结果
./hdfs dfs -cat /user/hadoop/output/part-r-00000
    可以看到每个单词出现的次数

十一、实现并测试矩阵相乘步调(必做)
由于伪分布式环境下,节点性能有限,尤其是跑在虚拟机环境下,试了一下跑500*500的矩阵,Map到66%左右就发现虚拟机硬盘爆了,所以,为了测试算法的正确性,下面使用50*50的矩阵来运行。只要算法是恰当的,数据规模可以随硬件支持程度而改变。

参考博客 https://blog.csdn.net/catharryy/article/details/9186757
若对详细实现思绪有爱好,可以看看上面这篇文章,这里只说要实际操纵的部分。
1、在~/app/hadoop目录下新建一个名为 local_matrix 的文件夹
2、在 local_matrix 文件夹下新建一个名为 MartrixMultiplication 的java文件,
参考 https://github.com/intergret/snippet/blob/master/MartrixMultiplication.java
文件内容如下(在链接所示的代码底子上略微改动):
  1. import java.io.IOException;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.Path;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapreduce.Job;
  6. import org.apache.hadoop.mapreduce.Mapper;
  7. import org.apache.hadoop.mapreduce.Reducer;
  8. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  9. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  10. import org.apache.hadoop.util.GenericOptionsParser;
  11. public class MartrixMultiplication{
  12.   public static class MartrixMapper extends Mapper<Object, Text, Text, Text>{
  13.    
  14.     private Text map_key = new Text();
  15.     private Text map_value = new Text();
  16.    
  17.     int rNumber = 50;
  18.     int cNumber = 50;
  19.     String fileTarget;
  20.     String i, j, k, ij, jk;
  21.    
  22.       
  23.     public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
  24.       
  25.         String eachterm[] = value.toString().split("#");
  26.         fileTarget = eachterm[0];
  27.         
  28.         if(fileTarget.equals("M")){
  29.           i = eachterm[1];
  30.           j = eachterm[2];
  31.           ij = eachterm[3];
  32.             
  33.           for(int c = 1; c<=cNumber; c++){
  34.               map_key.set(i + "#" + String.valueOf(c));
  35.               map_value.set("M" + "#" + j + "#" + ij);
  36.               context.write(map_key, map_value);
  37.           }
  38.             
  39.         }else if(fileTarget.equals("N")){
  40.           j = eachterm[1];
  41.           k = eachterm[2];
  42.           jk = eachterm[3];
  43.           for(int r = 1; r<=rNumber; r++){
  44.               map_key.set(String.valueOf(r) + "#" +k);
  45.               map_value.set("N" + "#" + j + "#" + jk);
  46.               context.write(map_key, map_value);
  47.           }
  48.         }
  49.     }
  50.   }
  51.   
  52.   
  53.   public static class MartrixReducer extends Reducer<Text,Text,Text,Text> {
  54.    
  55.     private Text reduce_value = new Text();
  56.    
  57.     int jNumber = 50;
  58.     int M_ij[] = new int[jNumber+1];
  59.     int N_jk[] = new int[jNumber+1];
  60.     int j, ij, jk;
  61.     String fileTarget;
  62.     int jsum = 0;
  63.    
  64.     public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
  65.       
  66.       jsum = 0;
  67.       for (Text val : values) {
  68.         String eachterm[] = val.toString().split("#");
  69.         
  70.         fileTarget = eachterm[0];
  71.         j = Integer.parseInt(eachterm[1]);
  72.         
  73.         if(fileTarget.equals("M")){
  74.                 ij = Integer.parseInt(eachterm[2]);
  75.                 M_ij[j] = ij;
  76.         }else if(fileTarget.equals("N")){
  77.                 jk = Integer.parseInt(eachterm[2]);
  78.                 N_jk[j] = jk;
  79.         }
  80.         
  81.       }
  82.       
  83.       for(int d = 1; d<=jNumber; d++){
  84.              jsum +=  M_ij[d] * N_jk[d];
  85.       }
  86.       
  87.       reduce_value.set(String.valueOf(jsum));
  88.       context.write(key, reduce_value);
  89.     }
  90.   }
  91.   
  92.   public static void main(String[] args) throws Exception {
  93.       Configuration conf = new Configuration();
  94.       String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
  95.       if (otherArgs.length != 2) {
  96.           System.err.println("Usage: MartrixMultiplication <in> <out>");
  97.           System.exit(2);
  98.       }
  99.             
  100.       Job job = new Job(conf, "martrixmultiplication");
  101.       job.setJarByClass(MartrixMultiplication.class);
  102.       job.setMapperClass(MartrixMapper.class);
  103.       job.setReducerClass(MartrixReducer.class);
  104.             
  105.       job.setOutputKeyClass(Text.class);
  106.       job.setOutputValueClass(Text.class);
  107.             
  108.       FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
  109.       FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
  110.             
  111.       System.exit(job.waitForCompletion(true) ? 0 : 1);
  112.                                 
  113.   }
  114.   
  115. }
复制代码
3、进入 local_matrix 文件目录下,在终端输入
javac MartrixMultiplication.java -cp $(~/app/hadoop/bin/hadoop classpath) ,
此时目录下多出了一个MartrixMultiplication.class文件
4、接着在终端依次输入:
cd ..
jar -cvf local_matrix/MartrixMultiplication.jar -C local_matrix/ .
此时 local_matrix文件夹下又多出两个class文件和一个jar文件
5、回到根目录,创建一个名为 input2 的文件夹,在内里新建两个文件 M.data 和 N.data
M.data中的数据情势为:(一行一个数据)
M#a#b#c    表示M矩阵第a行第b列的值是c;
N.data中的数据情势为:(一行一个数据)
N#a#b#c    表示M矩阵第a行第b列的值是c;
注:1  <= a,b <= 50,c = 1
6、在hdfs上新建输入数据的目录(在~/app/hadoop/bin目录下)
      ./hdfs dfs -mkdir /input2
7、上传文件
      ./hdfs dfs -put ~/input2/*.data /input2
8、运行
./hadoop jar ~/app/hadoop/local_matrix/MartrixMultiplication.jar MartrixMultiplication /input2 output2
9、查看结果
./hdfs dfs -cat /user/hadoop/output2/part-r-00000
正确的结果图(部分)

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

悠扬随风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表