总目录
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中
具体流程:
格式化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>
重新格式化
![](https://i-blog.csdnimg.cn/blog_migrate/7e38b4f3078cf9a3f7f8918da5895bf2.png)
五、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执行流程
编程语言进行逻辑的书写: 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();
}
}