chain_xx_wdm

chain_xx_wdm 查看完整档案

深圳编辑  |  填写毕业院校  |  填写所在公司/组织 www.chain-xx-wdm.top 编辑
编辑

1.领养代替买卖
2.对技术有向往
3.微博@-納是大大大大大太阳啊-

个人动态

chain_xx_wdm 发布了文章 · 2020-11-20

[解决]ssh: connect to host xxx port 22: Network is unreachable

在虚拟机中启动spark或hdfs时都报错ssh: connect to host cda port 22: Network is unreachable
image.png

这里主要原因是: 机器名与IP地址的映射有问题

这个虚拟机是别人配置好的, 我直接打开来用
hosts文件中的IP地址与我给这台虚拟机配置的不一致
所以需要修改hosts文件

这里由于不是root用户, 所以需要使用命令sudo vi /etc/hosts
image.png
这两个IP地址应该设置为一致

设置好后再启动就一切正常
image.png

查看原文

赞 0 收藏 0 评论 0

chain_xx_wdm 发布了文章 · 2020-11-09

HDFS分布式文件系统

HDFS简介

HDFS是Hadoop核心组成, 是分布式存储服务

HDFS是分布式文件系统中的一种

HDFS的重要概念

HDFS通过统一的命名空间目录树来定位文件
另外, 它是分布式的, 由很多服务器联合起来实现其功能. 集群中的服务器有各自的角色(分布式本质是拆分, 各司其职)
  • 典型的Master/Slave架构
    HDFS的架构是典型的Master/Slave结构
    HDFS集群往往是一个NameNode+多个DataNode组成
    NameNode是集群的主节点, DataNode是集群的从节点
  • 分块存储(block机制)
    HDFS中的文件在物理是分块存储(block)的, 块的大小可以通过配置参数来指定
    Hadoop2.x版本中默认的block大小是128M
  • 命名空间(NameSpace)
    HDFS支持传统的层次型文件组织结构.
    用户或者应用程序可以创建目录, 然后将文件保存在这些目录里.
    文件系统命名空间的层次结构和大多数现有的文件系统类似: 用户可以创建, 删除, 移动或重命名文件

    NameNode负责维护文件系统的命名空间, 任何对文件系统命名空间或属性的修改都将被NameNode记录下来

  • NameNode元数据管理
    我们把目录结构文件分块位置叫做元数据
    NameNode的元数据记录每一个文件所对应的block信息(block的id, 以及所在的DataNode节点)
  • DataNode数据存储
    文件的各个block的具体存储管理由DataNode节点来承担
    一个block会有多个DataNode来存储, DataNode会定时向NameNode来汇报自己持有的block信息
  • 副本机制
    为了容错, 文件的所有block都会有副本
    每个文件的block大小和副本系数都是可配置的
    应用程序可以指定某个文件的副本数目
    副本系数可以在文件创建的时候指定, 也可以在之后改变
    副本数量默认是3个
  • 一次写入, 多次读出
    HDFS设计成适应一次写入, 多次读出的场景, 且不支持文件的随机修改 . (支持追加写入, 不支持随机更新)
    正因为如此, HDFS适合用来做大数据分析的底层存储, 并不适合用来做网盘等应用 (修改不方便, 延迟大, 网络开销大, 成本太高)

HDFS架构

image.png

  • NameNode: HDFS集群的管理者, Master

    • 维护管理HDFS的命名空间(NameSpace)
    • 维护副本策略
    • 记录文件块(Block)的映射信息
    • 负责处理客户端读写请求
  • DataNode: NameNode下达命令, DataNode执行实际操作, Slave

    • 保存实际的数据块
    • 负责数据块的读写
  • Client: 客户端

    • 上传文件到HDFS的时候, Client负责将文件切分成Block, 然后进行上传
    • 请求NameNode交互, 获取文件的位置信息
    • 读取或写入文件, 与DataNode交互
    • Client可以使用一些命令来管理HDFS或访问HDFS

image.png

HDFS读写解析

HDFS读数据流程

image.png

  • 客户端通过Distributed FileSystem向NameNode请求下载文件, NameNode通过查询元数据找到文件块所在的DataNode地址
  • 挑选一台DataNode(就近原则, 然后随机)服务器, 请求读取数据
  • DataNode开始传输数据给客户端 (从磁盘里面读取数据输入流, 以Packet为单位来做校验)
  • 客户端以Packet为单位接收, 先在本地缓存, 然后写入目标文件

HDFS写数据流程

image.png

  • 客户端通过Distributed FileSystem模块向NameNode请求上传文件, NameNode检查目标文件是否已存在, 父目录是否存在
  • NameNode返回是否可以上传
  • 客户端请求第一个Block上传到哪几个DataNode服务器上
  • NameNode返回3个DataNode节点, 分别是dn1, dn2, dn3
  • 客户端通过FSDataOutputStream模块请求dn1上传数据, dn1收到请求会继续调用dn2, 然后dn2调用dn3, 将这个通信管道建立完成
  • dn1, dn2, dn3逐级应答客户端
  • 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存), 以Packet为单位, dn1收到一个Packet就会传给dn2, dn2传给dn3; dn1每传一个packet会放入一个确认队列等待确认
  • 当一个Block传输完成之后, 客户端再次请求NameNode上传第二个Block的服务器 (重复执行3-7步)

NN与2NN

HDFS元数据管理机制

  • 问题1: NameNode如何管理和存储元数据?
    计算机中存储数据有两种方式: 内存或者磁盘
    元数据存储磁盘: 存储磁盘无法面对客户端对元数据信息的任意的快速低延迟的响应, 但是安全性高
    元数据存储内存: 元数据存放内存, 可以高效的查询以及快速响应客户端的查询请求, 数据保存在内存, 如果断点, 内存中的数据全部丢失
    解决方案: 内存+磁盘; NameNode存在内存, FsImage文件存在磁盘
  • 问题2: 磁盘和内存中元数据如何划分?
    两个数据一模一样? 还是两个数据合并到一起才是一份完整的数据呢?
    若一模一样: client如果对元数据进行增删改操作, 需要保证两个数据的一致性. FsImage文件操作起来效率也不高
    两个合并=完整数据: NameNode引入了一个edits文件(日志文件: 只能追加写入). edits文件记录的是client的增删改操作, 不再选择让NameNode把数据dump出来形成FsImage文件(这种操作是比较消耗资源)

元数据管理流程如下:
image.png

  • 第一阶段: NameNode启动

    • 第一次启动NameNode格式化后, 创建FsImage和Edits文件. 如果不是第一次启动, 直接加载编辑日志和镜像文件到内存
    • 客户端对元数据进行增删改的请求
    • NameNode记录操作日志, 更新滚动日志
    • NameNode在内存中对数据进行增删改
  • 第二阶段: SecondaryNameNode工作

    • SecondaryNameNode询问NameNode是否需要CheckPoint. 直接带回NameNode是否执行检查点操作结果
    • SecondaryNameNode请求执行CheckPoint
    • NameNode滚动正在写的Edits日志
    • 将滚动前的编辑日志和镜像文件拷贝到SecondaryNameNode
    • SecondaryNameNode加载编辑日志和镜像文件到内存, 并合并
    • 生成新的镜像文件fsimage.chkpoint
    • 拷贝fsimage.chkpoint到NameNode
    • NameNode将fsimage.chkpoint重新命名成fsimage

Fsimage与Edits文件解析

NameNode在执行格式化之后, 会在 /opt/lagou/servers/hadoop-2.9.2/data/tmp/dfs/name/current目录下产生如下文件
image.png

  • FsImage文件: 是NameNode中关于元数据的镜像, 一般称为检查点. 这里包含了HDFS文件系统所有目录以及文件相关信息(Block数量, 副本数量, 权限等信息)
  • Edits文件: 存储了客户端对HDFS文件系统所有的更新操作记录. Client对HDFS文件系统所有的更新操作都会被记录到Edits文件中(不包括查询操作)
  • seen_txid: 该文件是保存了一个数字, 数字对应着最后一个Edits文件名的数字
  • VERSION: 该文件记录namenode的一些版本号信息. 比如:CusterId, namespaceID等

NameNode启动时会将FsImage文件加载到内存中, 同时也把之前未合并元数据的Edits文件加载, 集合两个文件中的元数据这样保证了NameNode中的元数据是最新最全的

通俗点说, 就是NameNode启动时把FsImage和Edits文件进行了合并

checkpoint周期

修改的文件是 hdfs-default.xml
<!-- 定时一小时 -->
<property>
    <name>dfs.namenode.checkpoint.period</name>
    <value>3600</value>
</property>

<!-- 一分钟检查一次操作次数, 当操作次数达到1百万时, SecondaryNameNode执行一次 -->
<property>
    <name>dfs.namenode.checkpoint.txns</name>
    <value>1000000</value>
    <description>操作动作次数</description>
</property>

<property>
    <name>dfs.namenode.checkpoint.check.period</name>
    <value>60</value>
    <description>1分钟检查一次操作次数</description>
</property>

NN故障处理

NameNode故障后, HDFS集群就无法正常工作, 因为HDFS文件系统的元数据需要由NameNode来管理维护并与Client交互

如果元数据出现损坏和丢失, 同样会导致NameNode无法正常工作进而HDFS文件系统无法正常对外提供服务

如果元数据出现丢失损坏如何恢复?

  1. 将2NN的元数据拷贝到NN的节点下 ---> 该方式会存在元数据的丢失
  2. 搭建HDFS的HA(高可用)集群, 解决NN的单点故障问题 ---> 借助Zookeeper实现HA, 一个Active的NameNode, 一个Standby的NameNode)

Hadoop的限额与归档以及集群安全模式

HDFS文件限额配置

HDFS文件的限额配置允许我们以文件大小文件个数来限制我们在某个目录下上传的文件数量或者文件内容总量, 以便达到我们类似百度网盘等限制每个用户允许上传的最大的文件的量

HDFS的安全模式

安全模式是HDFS所处的一种特殊状态. 在这种状态下 , 文件系统只接受读数据请求, 而不接受删除/修改等变更请求

在NameNode主节点启动时, HDFS首先进入安全模式, DataNode在启动的时候会向NameNode汇报可用的block等状态. 当整个系统达到安全标准时, HDFS自动离开安全模式

如果HDFS处于安全模式下, 则文件block不能进行

Hadoop归档技术

查看原文

赞 0 收藏 0 评论 0

chain_xx_wdm 发布了文章 · 2020-11-09

Apache Hadoop的重要组成

Hadoop = HDFS(分布式文件系统) + MapReduce(分布式计算框架) + Yarn(资源协调框架) + Common模块

HDFS

Hadoop Distribute File System 一个高可靠, 高吞量的分布式文件系统
"分而治之"

image.png

  • NameNode(nn): 存储文件的元数据. 比如文件名, 文件目录结构, 文件属性(生成时间, 副本数, 文件权限), 以及每个文件的块列表和块所在的DataNode等
  • SecondaryNameNode(2nn): 辅助NameNode更好地工作, 用来监控HDFS状态的辅助后台程序, 每隔一段时间获取HDFS元数据快照
  • DataNode(dn): 在本地文件系统存储文件块数据, 以及块数据的校验

NN, 2NN, DN 这些既是角色名称, 也是进程名称, 更是代指电脑节点名称

MapReduce

MapReduce计算 = Map阶段 + Reduce阶段
Map阶段就是的阶段, 并行处理输入数据
Reduce阶段就是的阶段, 对Map阶段结果进行汇总

image.png

Yarn

作业调度与集群资源管理的框架

image.png

  • ResourceManager(rm): 处理客户端请求, 启动/监控ApplicationMaster, 监控NodeManager, 资源分配与调度
  • NodeManager(nm): 单个节点上的资源管理, 处理来自ResourceManager的命令, 处理来自ApplicationMaster的命令
  • ApplicationMaster(am): 数据切分, 为应用程序申请资源并分配给内部任务, 任务监控容错
  • Container: 对任务运行环境的抽象, 封装了CPU, 内存等多维资源以及环境变量, 启动命令等任务运行相关的信息

ResourceManager是老大, NodeManager是小弟, ApplicationMaster是计算任务专员

image.png

查看原文

赞 0 收藏 0 评论 0

chain_xx_wdm 发布了文章 · 2020-10-17

mysql-1045 - Access denied for user 'root'@'localhost'

https://www.jianshu.com/p/b7e...

在如题如示的1045解决后,可能还会报错2003, 所以需要重启mysql服务

image.png

查看原文

赞 0 收藏 0 评论 0

chain_xx_wdm 发布了文章 · 2020-10-13

使用git报错:RPC failed; HTTP 504 curl 22

使用git pull拉取远程仓库数据时, 完整报错如下

error: RPC failed; HTTP 504 curl 22 The requested URL returned error: 504
fatal: the remote end hung up unexpectedly

解决方法 : 添加参数--depth = 1
image.png

查看原文

赞 0 收藏 0 评论 1

chain_xx_wdm 发布了文章 · 2020-10-10

[转发]Mac VMware Fusion CentOS7配置静态IP

赞 0 收藏 0 评论 0

chain_xx_wdm 发布了文章 · 2020-10-09

springboot中properties配置文件读取中文乱码(mac)

mac与windows的差别只在于菜单位置有点不同, 处理方式是一致的

关于这里提到的中文乱码问题, 是在properties文件中添加中文, 然后使用单元测试将结果打印在控制台, 结果出现乱码

网上很多"解答"提到的要么是properties文件中添加参数, 要么是pom.xml文件中添加依赖, 要么是在FileEncoding中将编码设置成UTF-8

以上方法我都试过, 都没有效

其实这里的根本原因是: properties文件是使用ASCII编码, 而中文是UTF-8, 所以出现了乱码

处理方式是在FileEncoding菜单中勾选Transparent native-to-ascii conversion
image.png
image.png

查看原文

赞 0 收藏 0 评论 0

chain_xx_wdm 发布了文章 · 2020-09-28

Spring-体系结构

赞 0 收藏 0 评论 0

chain_xx_wdm 发布了文章 · 2020-09-27

java.sql.SQLException: Can''t call commit when autocommit=true

在使用java操作数据库,创建数据库连接对象,创建事务管理器(开启事务,提交事务,回滚事务),运行代码后,报错如下

java.sql.SQLException: Can't call commit when autocommit=true
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:65)
at com.mysql.cj.jdbc.ConnectionImpl.commit(ConnectionImpl.java:814)
at com.alibaba.druid.pool.DruidPooledConnection.commit(DruidPooledConnection.java:749)
at com.bigdata.utils.TransactionManager.commit(TransactionManager.java:29)
at com.bigdata.service.impl.AccountServiceImpl.transfer(AccountServiceImpl.java:29)
at com.bigdata.test.SpringTansferTest.test(SpringTansferTest.java:21)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

相关代码如下
image.png
image.png

错误提示重点在于第一句,意思是如果当前自动提交事务的功能是开启的,就不能调用commit方法.

但是就像我上面的代码,实际上在begin()方法中已经将自动提交事务的功能关闭了(setAutoCommit(false)),而在另外的代码中也可以保证在提交事务的方法commit()执行之前, 先执行begin()方法

最后发现原因是创建数据库连接对象那里,从连接池获取数据库连接对象是在成员方法getConnection()中实现的. 那么每次调用这个方法时, 不能保证两次获取的是同一连接. 所以在当前连接关闭了自动提交事务, 但是下一个连接不一定是这种情况.

所以处理方式就是将从连接池获取连接的操作移到成员方法外,确保使用的是同一连接
image.png

查看原文

赞 0 收藏 0 评论 0

chain_xx_wdm 发布了文章 · 2020-09-25

Junit4报错-No tests found matching Tests

Junit4-No tests found matching Tests from org.junit.runner.Request
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringConfig.class})
public class SpringTest {
//    ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//    AccountService accountService = (AccountService) classPathXmlApplicationContext.getBean("accountService");
//    AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
//    AccountService accountService = (AccountService) annotationConfigApplicationContext.getBean("accountService");
 @Autowired
 private AccountService accountService;
 @Test
 public void testSave(){
        Account account = new Account();
 account.setName("乌冬面");
 account.setMoney(7777);
 accountService.save(account);
 }
    @Test
 public void testUpdate(){
        Account account = new Account();
 account.setName("希宝");
 account.setId(7);
 accountService.update(account);
 }
    @Test
 public void testDelete(){
        Account account = new Account();
 account.setId(8);
 accountService.delete(account);
 }
    @Test
 public void testFindAll(){
        List<Account> all = accountService.findAll();
 for (Account account : all) {
            System.out.println(account);
 }
    }
    @Test
 public void testFindById(){
        Account account = accountService.findById(6);
 System.out.println(account);
 }
    public void test(){
    }
}

在上述代码编写完成后, 点击运行其中一个测试方法,就会报标题中的错误

解决方式是:
先运行整个测试类, 成功后, 再运行其中一个测试方法

另,
导包应该导的是import org.junit.Test,不能导import org.junit.jupiter.api.Test

查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 18 次点赞
  • 获得 1 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 1 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2020-08-27
个人主页被 1.3k 人浏览