分布式系统HDFS

发布时间 2023-11-29 18:44:19作者: 韩世康

1、完全分布式搭建

  1. hadoop102[namenode,datanode],hadoop103[datanode],
    hadoop104[secondarynamenode,datanode]
  2. 缺少104,配置104
    1. 选择完全克隆103
    2. 机器的名称 hadoop104
    3. 配置机器的IP 192.168.18.104修改 vim /etc/sysconfig/network-scripts/ifcfg-ens33
    4. 重启⽹络服务 systemctl restart network
    5. 重新连接ip为192.168.18.104的服务器
    6. 查看是否更改成功 ip addr
    7. 更改机器名称 hostnamectl set-hostname hadoop104
    8. 查看是否更改成功 hostname
    9. 重启 reboot 后重新连接104
    10. 配置xshell 访问hadoop104
    11. 查看是否映射成功
      1. ping -c 4 hadoop102
      2. ping -c 4 hadoop103
    12. 每台机器免密登录,⽣成密钥
      1. ssh-keygen -t rsa ,执⾏后三次回车即可
      2. 把密钥分发给每台机器(102,103开机)
        1. ssh-copy-id hadoop102
        2.  ssh-copy-id hadoop103
    13. 在每台机器上分别访问每台机器
      1. ssh hadoop102
      2. ssh hadoop103
  3. hadoop102-104分别打开窗⼝,查看时间是否⼀致
  4. 在hadoop102-104上测试是否能相互ping通
  5. 在hadoop102-104上测试是否能相互免密登录[ssh]
  6. 安装包上传到hadoop102的/opt/software后解压到/opt/installtar -zxvf hadoop-2.6.0.tar.gz -C /opt/install
  7. 创建软链接 ln -s hadoop-2.6.0/ hadoop
  8. 在hadoop102上修改/opt/install/hadoop/etc/hadoop/core-site.xml
    <!-- 指定 HDFS 中 NameNode 的地址 -->
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop102:9000</value>
    </property>
    <!-- 指定 hadoop 运行时产生文件的存储目录 -->
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/install/hadoop/data/tmp</value>
    </property>

     

  9. 在hado1o0p102上修改hdfs-site.xml
    <!--设置数据块 Block 的副本数-->
    <property>
    <name>dfs.replication</name>
    <value>3</value>
    </property>
    <!--设置SecondaryNamenode主机和端口号-->
    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoop104:50090</value>
    </property>

     

  10. 修改hadoop-env.sh:第25⾏export JAVA_HOME=/opt/install/jdk
  11. 修改hadoop102的/opt/install/hadoop/etc/hadoop/slaves⽂件,重写以下内容:
     hadoop102
     hadoop103
     hadoop104
  12. 复制102的安装包到103和104上,然后分别在每台机器上创建软链接hadoop:
    scp -r hadoop-2.6.0 hadoop103:/opt/install
    scp -r hadoop-2.6.0 hadoop104:/opt/install
  13. 修改hadoop102上的/etc/profile⽂件,在最后添加以下两⾏
    export HADOOP_HOME=/opt/install/hadoop
    export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

     

  14. 复制hadoop102上的/etc/profile⽂件到hadoop103-104上,并在hadoop102-104上使⽂件⽣效:
    scp /etc/profile root@hadoop103:/etc/
    scp /etc/profile root@hadoop104:/etc/
    source /etc/profile
  15. 在hadoop102上格式化:hdfs namenode -format
  16. 在hadoop102上启动集群:start-dfs.sh
  17. 分别在hadoop102-104上通过jps查看服务启动情况
  18. 在浏览器中查看:http://hadoop102:50070
  19. 停⽌集群:stop-dfs.sh
  20. 通过jps查看服务停⽌情况
  21. 停机做快照

2、问题

格式化有问题datanode只有⼀个的,把三个主机的这三都删了,再重新格式化
/usr/local/src/hadoop/tmp
/opt/install/hadoop-2.6.0/data
/opt/install/hadoop-2.6.0/logs
3、使⽤HDFS shell处理移动通讯数据
1. 查看hdfs命令列表: hdfs 回车
2. 查看hdfs的⽂件操作命令列表 hdfs dfs 回车
3. 创建⽬录 hdfs dfs -mkdir -p /hdfs/shell
4. 查看⽬录 hdfs dfs -ls /hdfs/shell
5. 上传⽂件 hdfs dfs -put ./a.txt /hdfs/shell
6. 查看⽂件 hdfs dfs -cat /hdfs/shell/a.txt
7. 下载⽂件 hdfs dfs -get /hdfs/shell/a.txt ./d01
8. 查看指定⽂件或⽬录⼤⼩ hdfs dfs -du /hdfs/shell/a.txt
9. 删除指定⽂件 hdfs dfs -rm /hdfs/shell/a.txt
10. 删除指定⽬录 hdfs dfs -rm -r /hdfs 
4、通过Java客户端操作hdfs
1. 创建任意⽬录 : 如 D:\myhadoop\bin 中放⼊winutils.exe
2. 配置环境变量 HADOOP_HOME:D:\myhadoop PATH中添加%HADOOP_HOME%\bin
3. 把hadoop.dll⽂件复制到c:\windows\system32中
4. 启动idea 搭建maven项⽬
5. 添加pom.xml内容
<dependencies>
        <dependency>
               <groupId>org.apache.hadoop</groupId>
               <artifactId>hadoop-client</artifactId>
               <version>2.6.0</version>
          </dependency>
</dependencies>
6. 在src/main/resource下创建log4j.properties⽂件,添加如下内容
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
7. 编写 java代码,实现 创建⽬录,上传⽂件,下载⽂件,删除⽂件和目
package com.kgc;

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

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

public class HdfsTest {
    public static void main(String[] args) throws IOException, InterruptedException {
        //mkdirs();
        //put();
        //download();
        //rm();
        rmr();
    }
    //创建目录
    private static void mkdirs() throws IOException, InterruptedException {
        URI uri = URI.create("hdfs://hadoop102:9000");
        Configuration conf=new Configuration();
        String user="root";
        //创建目录
        FileSystem fileSystem = FileSystem.get(uri,conf,user);
        Path path=new Path("/day1128");
        boolean mkdirs = fileSystem.mkdirs(path);
        fileSystem.close();
        System.out.println(mkdirs ? "创建成功" : "创建失败");
    }

    //上传文件
    private static void put() throws IOException, InterruptedException {
        URI uri = URI.create("hdfs://hadoop102:9000");
        Configuration conf=new Configuration();
        String user="root";
        //上传文件
        FileSystem fileSystem = FileSystem.get(uri,conf,user);
        Path path = new Path("/day1128/a.txt");
        Path src = new Path("day1128_hadoop/file/a.txt");
        fileSystem.copyFromLocalFile(src,path);
        fileSystem.close();
    }

    //下载文件
    private static void download() throws IOException, InterruptedException {
        URI uri = URI.create("hdfs://hadoop102:9000");
        Configuration conf=new Configuration();
        String user="root";
        //上传文件
        FileSystem fileSystem = FileSystem.get(uri,conf,user);
        Path src = new Path("/day1128/a.txt");
        Path path = new Path("day1128_hadoop/file/b.txt");
        fileSystem.copyToLocalFile(src,path);
        fileSystem.close();
    }

    //删除文件
    private static void rm() throws IOException, InterruptedException {
        URI uri = URI.create("hdfs://hadoop102:9000");
        Configuration conf=new Configuration();
        String user="root";
        //上传文件
        FileSystem fileSystem = FileSystem.get(uri,conf,user);
        Path path = new Path("/day1128/a.txt");
        fileSystem.delete(path,true);
        fileSystem.close();
    }

    //删除文件
    private static void rmr() throws IOException, InterruptedException {
        URI uri = URI.create("hdfs://hadoop102:9000");
        Configuration conf=new Configuration();
        String user="root";
        //上传文件
        FileSystem fileSystem = FileSystem.get(uri,conf,user);
        Path path = new Path("/day1128");
        fileSystem.delete(path,true);
        fileSystem.close();
    }
}