Hadoop(东软_TJNU)

总目录
opt——soft——hadoop——etc——hadoop

一、windows系统传输文件到Linux系统======》xftp

1.在windows电脑上下载jdk

2.上传到linux系统中

3.解压压缩包输入指令【tar -xvf 压缩包名称(-zxvf里的z显示解压过程)】

4.改名【名称:jdk】

5.配置环境变量(java)

二、java环境配置

(1)进入etc【指令:cd /etc】(注:所有的环境变量都在etc下)

(2)进入etc下的profile.d——【cd profile.d/】

(3)创建文件【指令:vi java.sh】

配置java环境变量:

最后一行代码export(导出)上述三个变量

【指令::wq】保存设置

检查是否配置成功:同windows

【指令1:java】显示以下代码则成功

【指令2:javac】显示以下代码则成功

同时显示以上图片则成功

三、hadoop环境配置

——上传、解压,改名、配置环境变量

1.hadoop

——如果没有:在官网下载hadoop 3.2.1(Apache Hadoop)

——如果有:使用xftp进行传输

2.上传到linux系统中

3.解压压缩包输入指令【tar -xvf 压缩包名称(-zxvf里的z显示解压过程)】

4.改名【名称:hadoop】

进入指定目录

5.配置环境变量(hadoop)

让hadoop生效【指令:source hadoop.sh】

输入【指令:hadoop version】出现上述信息则安装成功

四、文件存储到hdfs中

进入Apache Hadoop

具体流程:

格式化namanode(任何路劲都可以)【指令:hdfs namenode -format】

启动hdfs

启动namenode

启动datanode

在虚拟机电脑上,通过浏览器访问虚拟机中的hdfs

1.修改主机名()

直接删除后于一句

修改成这个样子

2.重启虚拟机

reboot

3.关闭防火墙(只要开机或关机防火墙就会重启)

systemctl stop firewalld

再次启动namenode和datanamenode

———————————————————————————————————————————

——解决问题1:namenode和datanamenode启动失败

页面显示: Cannot execute /home/hadoop/hadoop/libexec/hadoop-config.sh.

1.检查hadoop和java的环境变量配置路径是否一致

2.在/etc/profile中找到了这个HADOOP_HOME全局变量,将其删除

运行source /etc/profile

在~/.bashrc最后一行输入unset HADOOP_HOME

source ~/.bashrc即可(这样就不用一开机就要输入unset HADOOP_HOME了)

——————————————————————————————————————————

打开 IP addr

打开namenode和datanode的全路径

在hadoop里会有一个指定的位置(临时)

/tmp/hadoop-root/dfs/name进行数据的存储,

默认的位置在/tmp临时文件夹

系统在指定的时间内进行文件删除

此时,hdfs相关的文件,不能存储到tmp文件夹下

namenode和datanode必须进行关闭,

./hadoop-daemon.sh stop datanode

./hadoop-daemon.sh stop namenode

需要把原来的文件删除,进行重新格式化

修改配置文件,文件存储的位置进行置

<property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/datas</value>
</property>

创建文件夹

修改配置文件,文件存储的位置进行配置

<configuration>
	<property>
		<name>dfs.namenode.name.dir</name>
		<value>/opt/datas/dfs/names</value>
	</property>
	<property>
		<name>dfs.datanode.data.dir</name>
		<value>/opt/datas/dfs/datas</value>
	</property>
	<property>
		<name>dfs.permissions.enabled</name>
		<value>false</value>
	</property>
</configuration>

重新格式化



五、hadoop进行文件操作

进行namenode和datanode的启动

在浏览器输入自己的ip即可

———————————————————————————————————————————

——解决问题2:Hadoop启动的时候,若Datanode启动不了

输入【jps】指令时,没有datanode

原因:多次 hadoop namenode -format  导致 datanode 的version 里的Cluster-Id 不一致

解决办法:打开hdfs-site.xml文件

<configuration>
    <property>
        <name>dfs.name.dir</name>
        <value>/opt/soft/hadoop/name</value>
    </property>
 
    <property>
        <name>dfs.data.dir</name>
        <value>/opt/soft/hadoop/data</value>
    </property> 
</configuration>

进入配置所在的目录

cd /opt/soft/hadoop/

查看文件【ls】里面有 name和data

先进入name下的current,查看VERSION

cat VERSION
clusterID=CID-0fe4b1CID-f9d1607a-8cbc-4e6f-b3e8-d7711954b19bbe-69ee-4894-b97a-7470fe3ff79d

复制clusterID的内容,再打开data,进入name下的current,编辑VERSION

vi VERSION

将data/current里面的clusterID的内容换成name/current的clusterID的内容

最后,重启Hadoop(【reboot】),执行【jps】,ok啦!

———————————————————————————————————————————

———————————————————————————————————————————

——解决问题3:打不开相关web页面

若集群部署完毕后,查看相关WEB界面,打不开的原因可能如下:

1、检查LINUX(CentOS7)机器的防火墙是否关闭
【systemctl status firewalld.service】(查看防火墙状态)
(如果显示为关闭状态,则进行下一步;如果显示尚未关闭,则进行关闭并设定开机如下所示)
systemctl stop firewalld.service (关闭防火墙)
systemctl disable firewalld.service (设置为开机关闭防火墙)
2、如果防火墙是关闭,检查自己相应的NAMENODE、DATANODE节点是否启动
jps(查询NAMENODE、DATANODE节点是否启动)
如果未打开,则分别输入:

/.hadoop-daemon.sh start namenode
/.hadoop-daemon.sh start datanode

———————————————————————————————————————————

内容较少,添加内容

1.文件放置到hdfs上存储

hdfs上的文件储存,默认三个备份

==========》如果进行单节点存储,一般备份数量改为1

-put 放置的目录

原文件目录  put  放置文件目录

hdfs上进行文件夹的创建

hdfs dfs -mkdir /文件名

多层级文件夹创建

hdfs dfs -mkdir -p /文件名/文件名/文件名/文件名

修改文件夹名字

文件夹位置的移动,后面文件夹路径和前面的没有关系,移动文件夹路径

实现文件夹的复制及改名

文件夹的删除

文件移动

指定路径下的文件进行移除

文件的下载

hdfs dfs get hdfs文件的路径

从hdfs上进行文件的下载

查看一个文件夹下的文件列表

文件创建

文件上传并改名,放到性的文件进行数据存储

六、hadoop的进行集群操作(密钥配对,免密登录)

生成密钥对(一次粘贴下述三句话见:Apache Hadoop 3.2.1 – Hadoop: Setting up a Single Node Cluster.

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys

查看公钥

连接

退出登录

出现错误

插入以下代码解决

HDFS_NAMENODE_USER=root
HDFS_DATANODE_UESER=root
HDFS_SECONDARYNAMENODE_USER=root

有启动就会有关闭

启动hadoop

七、hadoop核心——hdfs 文件存储

只要进行数据的运算,一定要进行资源的分配

mapreduce进行文件中数据的计算

yarn 进行资源分配

mapreduce在不同的服务器上运行,进行数据的运算,

每个map进行数据运算,在当前的虚拟机上,申请一些cpu, 内存资源

reduce进行数据合并,进行cpu 内存资源分配,

===========》进行数据运算结果的统计

进行mapreduce和yarn的配置

	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>

<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
</property>

完成进行yarn分配资源的相关进程的启动

启动hdfs相关的进程

检查是否启动

启动yarn,出现报错

YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root

修改后再次启动

进行yarn的启动文件的执行,

运行两个进程

1 resourcemanager

总体资源的管理,当运行一个mapreduce程序,总体资源的分配

类似于一个公司经理

2 nodemanager

nodemanager 当前的datanode运行具体分配了多少空间

类似与公司员工 ,进行具体每个员工资源分配

出现了某一个错

<configuration>
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
	<property>
	  <name>yarn.app.mapreduce.am.env</name>
	  <value>HADOOP_MAPRED_HOME=/opt/soft/hadoop</value>
	</property>
	<property>
	  <name>mapreduce.map.env</name>
	  <value>HADOOP_MAPRED_HOME=/opt/soft/hadoop</value>
	</property>
	<property>
	  <name>mapreduce.reduce.env</name>
	  <value>HADOOP_MAPRED_HOME=/opt/soft/hadoop</value>
	</property>

</configuration>

重新启动(先关闭后启动)

启动

将红色方框里的hadoop换为自己的ip即可,并在浏览器访问


八.集群引出

mapreduce,分成两个阶段:

        map 阶段:在自己当前的虚拟机上 进行单词 map 单词 数量

        reduce阶段:可以在一台虚拟机上 把不同虚拟机中文件的map之后的结果进行合并

以后进行数据存储,不能只进行一个datanode的数据存放,容易导致数据丢失

多个datanode,保证数据冗余,防止数据丢失

---------------》需要多个datanode进行数据的存储

进行一台虚拟机的搭建

        把datanode和namenode在一台机器上进行程序的启动

        ===========》单节点:伪分布式(一台机器上,是一个节点)

分布式集群:

        同样的功能,交给不同的虚拟机进行操作

        =====》hdfs进行文件存储,希望可以用多个服务器进行文件存储的功能

分布式不一定是集群,集群是分布式

分布式:

        分到不同的机器上进行程序的执行,相同的程序进行功能的实现

        一台机器出现问题,其他的机器可以进行功能的实现

多个datanode进行数据的存储,保证数据可以进行多台机器上数据的存储,防止数据丢失

搭建集群:(3台)

        需要进行多台虚拟机的搭建

        虚拟机是可以复制(克隆)

        在一台虚拟机上进行相关信息的配置,在进行复制

——解决问题4:xshell连接虚拟机失败

回到虚拟机,输入【ip addr】发现ip和上次的不一样,

重启网卡【systemctl restart network】

关闭之后systemctl stop network


不用动

也不用动

将里面的内容置为三台主机名(可使用【cat workers 】查看)

编辑yarn-site.xml

加上这一句

里面只有Hadoop1(本机),加上刚刚的主机,以及设置不同的ip

4 注意ssh

namenode和datanode启动,进行脚本启动,进行公钥和私钥的链接的文件的需求

=========》ssh登录到不同的虚拟机

登录,必须相同密钥对

5 进行克隆,进行虚拟机的启动

克隆前,如果担心弄乱了配置,进行快照,保存当前状态,如果乱了,话可以恢复

进行克隆

反复操作同样的步骤

启动三台虚拟机

原始的一台虚拟机不需要进行修改

其他的两台进行修改

        进行ip地址的修改

对应之前的ip

修改之后进行虚拟机的重启,进行自己主机名加载

启动好以后进行与xshell连接

6.当三台hadoop均建立连接好以后,开始进行格式化(更新消息,让namenode知道你管了三台机器)

全部启动起来,为了让不同机器分别进行文件的存放,在另外两台上启动并输入【jps】,没有namenode

如果要进行访问的话,需要关闭防火墙【systemctl stop firewalld】

在浏览器输入ip

点击live nodes(活着的结点)

 当文件上传,默认副本是三

搭建多个是为了如果有一台机器挂了,我们可以在剩余的机器上进行存储,防止数据丢失

mapreduce执行流程

0

编程语言进行逻辑的书写:                java

九、java操作hdfs基本流程

==========》文件操作,文件夹操作,进行逻辑判断

启动所有的hadoop(3台)

 

如果想用junit,那么需要删除一下test,否则找不到相应的注解

因为没有Java,所有new一个出来

demo1.java

package com.neuedu.test;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.hdfs.HdfsConfiguration;
import org.junit.Test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

public class Demo1 {
    @Test
    public void a() throws IOException {
//        java 和 mysql 如何通信?
//        mysql公司,进行jar包的书写,进行java和数据库之间底层通信
//        底层操作,硬盘空间 内存空间分配,=========》写好了底层逻辑,我们需要做的按照自己的逻辑进行相关信息的配置
//        操作数据库安装位置,表,写的sql语句


//        java操作hdfs,底层的逻辑写好了,
//        借助于别人写好的jar包,进行自己信息的配置,执行我们要操作的逻辑


        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.65.131:9000");
//        进行hdfs访问,配置hdfs相关信息
//        进行文件操作
        FileSystem fs = FileSystem.get(conf);
//        文件操作
//        create 在hdfs的指定路径下进行文件的创建
//        fs.create(new Path("/abcd"));
//          创建文件,文件的覆盖
//        fs.create(new Path("/abcd"),true);


//       文件夹入手进行文件夹  创建,删除 ,改名,         移动,复制
//        进行文件夹的创建  多层级的创建
        fs.mkdirs(new Path("/a/b"));
//      进行文件夹的名字的修改
        fs.rename(new Path("/a/b"),new Path("/a/abcd"));
//        删除文件夹
        fs.deleteOnExit(new Path("/a/abcd"));

//        进行指定路进下的文件列表操作
        /*FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
        for (FileStatus f:fileStatuses
             ) {
            System.out.println(f.getPath());
            System.out.println(f.isDirectory());
            System.out.println(new Date(f.getModificationTime()));
            System.out.println(f.getOwner());
            System.out.println(f.getPermission());
        }*/

        /*RemoteIterator<LocatedFileStatus> is = fs.listFiles(new Path("/"), true);
        while (is.hasNext()){
            System.out.println(is.next());
        }*/


//        文件操作
//        hdfs中的文件在java中进行获取, 写出到自己电脑的某个位置
       /* FSDataInputStream open = fs.open(new Path("/a1/part-r-00000"));
        File file = new File("C:\\Users\\Tian\\Desktop\\abc\\"+"r1.txt");
        FileOutputStream fout = new FileOutputStream(file);
//        在java中进行了一个输入流的获取 在java中通过输入流进行数据的获取
        byte[] bytes = new byte[1024];
        int read = open.read(bytes);
        System.out.println(new String(bytes,0,read));
        fout.write(bytes,0,read);
        open.close();
        fout.close();*/


//       创建文件时,进行文件内容的写入
       /* FSDataOutputStream out = fs.create(new Path("/a.txt"));
        out.writeBytes("jdgfdjgkfdjgeirjtoiewrjesdkfjkdsgj");
        out.close();

        FSDataOutputStreamBuilder out1 = fs.appendFile(new Path("/ab.txt"));
        out1.build();
*/
        FSDataOutputStream out = fs.create(new Path("/a.txt"));
        out.writeBytes("jdgfdjgkfdjgeirjtoiewrjesdkfjkdsgj");
        out.close();

        

//        fs.moveToLocalFile(new Path("/datas.txt"),new Path("/a"));

        fs.close();

    }
}

找jar包就需要去到官方(mvnrepository.com)

<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs-client -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs-client</artifactId>
    <version>3.2.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>3.2.1</version>
//    <scope>test</scope>    将这个删掉,不删除用不了
</dependency>
 <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs-client -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs-client</artifactId>
      <version>3.2.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>3.2.1</version>
    </dependency>
  </dependencies>

<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>3.2.1</version>
</dependency>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs-client -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs-client</artifactId>
      <version>3.2.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>3.2.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>3.2.1</version>
    </dependency>

  </dependencies>
// Demo1
package com.neuedu.test;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;
public class Demo1 {
    @Test
    public void a(){
//        java和mysql是如何操作的
//        mysqlL公司,进行jar包的书写,进行java和数据库之间底层通信
//        底层操作,硬盘空间 内存空间分配,==e=e====》写好了底层逻纸,我们需要做的按照自己的逻级进行相关信息的配置
//        操作数据库安装位置,表,写的sqL语句

//        java操作hdfs,底层的逻辑写好了
//        借助于别人写好的jar包,进行信息的配置,执行我们操作的逻辑
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.52.131:9000");
        System.out.println(conf);
    }
}

运行成功

进行文件的覆盖

// Demo1完整代码

package com.neuedu.test;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Test;

import javax.imageio.stream.FileImageOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo1 {
    @Test
    public void a() throws IOException {
//        java和mysql是如何操作的
//        mysqlL公司,进行jar包的书写,进行java和数据库之间底层通信
//        底层操作,硬盘空间 内存空间分配,==e=e====》写好了底层逻纸,我们需要做的按照自己的逻级进行相关信息的配置
//        操作数据库安装位置,表,写的sqL语句

//        java操作hdfs,底层的逻辑写好了
//        借助于别人写好的jar包,进行信息的配置,执行我们操作的逻辑
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.52.131:9000");
//        System.out.println(conf);
//        进行hdfs访问,配置hdfs相关配置
//        进行文件操作
        FileSystem fs = FileSystem.get(conf);
//        文件操作
//        creat在hdfs的指定路径下进行文件的创建
//        fs.create(new Path("/abcd"));

//        创建文件,文件的覆盖
//        fs.create(new Path("/aaaaa"),true);

//        在hdfs上存储的文件,不可以直接进行内容的拼接,因为文件比较大,不容易查找
//         fs.appendFile(new Path("/ab"));
//

//        文件夹入手进行文件夹的创建,删除,改名,移动,复制
//        进行多层级文件的创建,多层级创建
//        fs.mkdirs(new Path("/a/b"));
//        文件名修改的方式
//        fs.rename(new Path("/a/b"),new Path("/a/abcd"));
//        删除文件夹
//        fs.delete(new Path("/a/abcd"));           已经弃用
//        fs.deleteOnExit(new Path("/a/abcd"));
//        进行指定文件下文件列表操作
        /*
        FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
        for (FileStatus f:fileStatuses
            ){
            System.out.println(f.getPath());
            System.out.println(f.isDirectory());
            System.out.println(f.getModificationTime());
            System.out.println(f.getOwner());
            System.out.println(f.getPermission());
        }
         */
        /*
        RemoteIterator<LocatedFileStatus> is = fs.listFiles(new Path("/"),true);
        while (is.hasNext()){
            System.out.println(is.next());
        }
         */
        /*
//        文件操作
//        hdfs 中的文件立java中进行获取, 写出到自己电脑的某个位置
        FSDataInputStream open = fs.open(new Path("/a1/part-r-00000"));
        File file = new File("C:\\Users\\l\\Desktop\\abc" + "r1.txt");
//        输出流

        FileOutputStream fout = new FileOutputStream(file);
//      在java中进行了一个输入流的获取,在java中通过输入流进行数据的获取
        byte[] bytes = new byte[1042];
        int read = open.read(bytes);
        System.out.println(new String(bytes,0,read));
        fout.write(bytes,0,read);
        open.close();
        fout.close();
         */
//        fs.close();
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值