You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dianshang-qianduan/src/views/digitalMarketTech/bigData/components/HadoopHDFS.vue

2197 lines
68 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container">
<div class="HadoophDFS">
<div class="left">
<el-scrollbar height="660px" style="height:96%">
<p>
本案例通过搭建服务器集群安装Hadoop组件实训演练Hadoop的核心组件HDFS分布式文件系统的读写流程和原理
</p>
<span style="color:#FFFFFF">1搭建服务器集群为每个机架配置三台服务器建立通信联系</span>
<div class="Server">
<div class="Server-item">
<div class="item-img" style="cursor: pointer;" @click="clientSelect(2)">
<span v-if="content[2]===1">A1 Server</span>
<span v-if="content[2]===1">A2 Server</span>
<span v-if="content[2]===1">A3 Server</span>
</div>
<div class="item-name">机架rackA</div>
</div>
<div class="contact">
<img src="@/assets/images/szjj/箭.png" alt="" />
</div>
<div class="Server-item">
<div class="item-img" style="cursor: pointer;" @click="clientSelect(2)">
<span v-if="content[2]===1">B1 Server</span>
<span v-if="content[2]===1">B2 Server</span>
<span v-if="content[2]===1">B3 Server</span>
</div>
<div class="item-name">机架rackB</div>
</div>
<div class="contact">
<img src="@/assets/images/szjj/箭.png" alt="" />
</div>
<div class="Server-item">
<div class="item-img" style="cursor: pointer;" @click="clientSelect(2)">
<span v-if="content[2]===1">C1 Server</span>
<span v-if="content[2]===1">C2 Server</span>
<span v-if="content[2]===1">C3 Server</span>
</div>
<div class="item-name">机架rackB</div>
</div>
<div @click="clientSelect(0)" class="clientSelect">
<img
src="@/assets/images/szjj/客户端.png"
alt=""
class="server_img"
/>
</div>
<img
src="@/assets/images/szjj/箭头_c.png"
alt=""
class="server_img2"
/>
<img
src="@/assets/images/szjj/主服务器Server.png"
alt=""
class="server_img3"
/>
<img
src="@/assets/images/szjj/result.png"
alt=""
class="server_img4"
/>
<div class="clientAbs" @click="clientSelect(0)"><span v-if="content[0]===1" style="font-size:14px;">客户端Client</span></div>
<div class="correspondence" @click="clientSelect(1)">
<span style="cursor: pointer;" v-if="content[1]===1">通信联系</span>
</div>
<div class="correspondence txPotion" @click="clientSelect(1)">
<span style="cursor: pointer;" v-if="content[1]===1">通信联系</span>
</div>
</div>
<el-divider />
<span style="color:#FFFFFF"
>2、搭建Hadoop设置名字节点NameNode、数据节点DataNode</span
>
<div class="Server ts">
<div class="Server-item">
<div class="item-img">
<span>A1 Server</span>
<span>A2 Server</span>
<span>A3 Server</span>
</div>
<div class="item-name">机架rackA</div>
</div>
<div class="contact">
<span>通信联系</span>
<img src="@/assets/images/szjj/箭.png" alt="" />
</div>
<div class="Server-item">
<div class="item-img">
<span>B1 Server</span>
<span>B2 Server</span>
<span>B3 Server</span>
</div>
<div class="item-name">机架rackB</div>
</div>
<div class="contact">
<span>通信联系</span>
<img src="@/assets/images/szjj/箭.png" alt="" />
</div>
<div class="Server-item">
<div class="item-img">
<span>C1 Server</span>
<span>C2 Server</span>
<span>C3 Server</span>
</div>
<div class="item-name">机架rackC</div>
</div>
<img
src="@/assets/images/szjj/客户端.png"
alt=""
class="server_imgt"
/>
<img
src="@/assets/images/szjj/箭头_c.png"
alt=""
class="server_img2"
/>
<img
src="@/assets/images/szjj/主服务器Server.png"
alt=""
class="server_img3"
/>
<img
src="@/assets/images/szjj/result.png"
alt=""
class="server_img4"
/>
<el-select
v-model="value1"
class="m-2"
placeholder="请选择"
size="default"
style="
width: 232px;
position: absolute;
top: 25px;
right: 25px;
height: 25px;
"
:disabled="isValue[0]===1"
>
<el-option
v-for="item in options1"
:key="item.value"
:label="item.label"
:value="item.value"
@click.prevent="selectingNodes(item.value,0)"
/>
</el-select>
<div class="server_item">
<span>心跳机制和数据报告机制</span>
</div>
<div class="server_item tsPosition">
<span>心跳机制和数据报告机制</span>
</div>
<div class="server_item tsPosition2">
<span>心跳机制和数据报告机制</span>
</div>
<el-select
v-model="value2"
class="m-2"
placeholder="请选择"
size="default"
style="
width: 135px;
position: absolute;
bottom: 25px;
left: 57px;
height: 25px;
"
:disabled="isValue[1]===1"
>
<el-option
v-for="item in options1"
:key="item.value"
:label="item.label"
:value="item.value"
@click.prevent="selectingNodes(item.value,1)"
/>
</el-select>
<el-select
v-model="value3"
class="m-2"
placeholder="请选择"
size="default"
style="
width: 135px;
position: absolute;
bottom: 25px;
left: 257px;
height: 25px;
"
:disabled="isValue[2]===1"
>
<el-option
v-for="item in options1"
:key="item.value"
:label="item.label"
:value="item.value"
@click.prevent="selectingNodes(item.value,2)"
/>
</el-select>
<el-select
v-model="value4"
class="m-2"
placeholder="请选择"
size="default"
style="
width: 135px;
position: absolute;
bottom: 25px;
left: 457px;
height: 25px;
"
:disabled="isValue[3]===1"
>
<el-option
v-for="item in options1"
:key="item.value"
:label="item.label"
:value="item.value"
@click.prevent="selectingNodes(item.value,3)"
/>
</el-select>
</div>
<el-divider />
<span style="color:#FFFFFF"
>3、目前需要上传一个500M的文件FileHDFS系统中的客户端Client需要将其拆分为128M的文件块。</span
>
<p style="font-weight: 500 !important;color:#FFFFFF">
每个块的大小可以通过配置参数dfs.blocksize来规定默认的大小在hadoop2.x版本中是128M在之前的版本中是64M。
</p>
<div class="Server">
<div class="server_left">
<img src="@/assets/images/szjj/文件.png" alt="" />
</div>
<div class="server_right">
<img src="@/assets/images/szjj/线.png" alt="" />
</div>
<div class="server_button">
<el-button @click="moveBoxes">拆分</el-button>
</div>
<div class="server_file" :style="{ transform: box1Transform }" v-show="showBlock[0]">
<span style="margin-left: 25px">Block1</span>
<span style="color: #5620f9; margin-left: 10px">128M</span>
</div>
<div class="server_file tsFile1" :style="{ transform: box2Transform }" v-show="showBlock[1]">
<span style="margin-left: 25px">Block2</span>
<span style="color: #5620f9; margin-left: 10px">128M</span>
</div>
<div class="server_file tsFile2" :style="{ transform: box3Transform }" v-show="showBlock[2]">
<span style="margin-left: 25px">Block3</span>
<span style="color: #5620f9; margin-left: 10px">128M</span>
</div>
<div class="server_file tsFile3" :style="{ transform: box4Transform }" v-show="showBlock[3]">
<span style="margin-left: 25px">Block4</span>
<span style="color: #5620f9; margin-left: 10px">116M</span>
</div>
</div>
<el-divider />
<span style="color:#FFFFFF"
>4、客户端Client通过Distributed
FileSystem模块向与名字节点NameNode建立通信联系包括是否可以上传文件存放的文件目录。</span
>
<div class="serverFour">
<div class="Four_left">
<img src="@/assets/images/szjj/客户端.png" alt="" />
<div class="left_main">
<div class="main_input">
<span>选择角色:</span>
<el-select
v-model="value5"
class="m-2"
placeholder="请选择"
size="default"
style="width: 125px; height: 25px"
:disabled="value5!==''"
>
<el-option
v-for="item in options2"
:key="item.value"
:label="item.label"
:value="item.value"
@click.prevent="selectingNodes2(item.value,1)"
/>
</el-select>
</div>
<div class="left_item" v-show="setupFour[0]">
<img
src="@/assets/images/szjj/序号1.png"
alt=""
style="margin-top: 2px"
/>
<span>请求上传文件</span>
</div>
<div class="left_item2" v-show="setupFour[4]">
<img
src="@/assets/images/szjj/序号5.png"
alt=""
style="margin-top: 2px"
/>
<span>可以上传</span>
</div>
<div class="left_item2" v-show="setupFour[5]">
<img
src="@/assets/images/szjj/序号6.png"
alt=""
style="margin-top: 2px"
/>
<span>请求第一个块文件上传</span>
</div>
<div class="left_item2" v-show="setupFour[9]">
<img
src="@/assets/images/szjj/序号10.png"
alt=""
style="margin-top: 2px"
/>
<span>接收信息</span>
</div>
</div>
</div>
<div class="Four_middle">
<div class="middle_item" :style="{ background: isGreen ? 'green' : '' }" style="cursor: pointer;" v-show="setupFour[1]" @click="requestFileUpload">
<img src="@/assets/images/szjj/序号2.png" alt="" />
<span>请求上传文件</span>
</div>
<div class="middle_item" :style="{ background: isGreen2 ? 'green' : '' }" style="cursor: pointer;" v-show="setupFour[3]" @click="requestFileUpload2">
<img src="@/assets/images/szjj/序号4.png" alt="" />
<span>返回是否可以上传</span>
</div>
<div class="middle_item ts_item" :style="{ background: isGreen3 ? 'green' : '' }" style="cursor: pointer;" v-show="setupFour[6]" @click="requestFileUpload3">
<img src="@/assets/images/szjj/序号7.png" alt="" />
<span>请求Block1上传到哪几个</span>
<span>DataNode服务器上</span>
</div>
<div class="middle_item" :style="{ background: isGreen4 ? 'green' : '' }" style="cursor: pointer;" v-show="setupFour[8]" @click="requestFileUpload4">
<img src="@/assets/images/szjj/序号9.png" alt="" />
<span>返还可以上传的数据节点</span>
</div>
<img
src="@/assets/images/szjj/箭头_right.png"
alt=""
class="middle_arrow"
v-show="setupFour[1]"
/>
<img
src="@/assets/images/szjj/箭头_left.png"
alt=""
class="middle_arrow tsArrow"
v-show="setupFour[3]"
/>
<img
src="@/assets/images/szjj/箭头_right.png"
alt=""
class="middle_arrow tsArrow2"
v-show="setupFour[6]"
/>
<img
src="@/assets/images/szjj/箭头_left.png"
alt=""
class="middle_arrow tsArrow3"
v-show="setupFour[8]"
/>
</div>
<div class="Four_right">
<img
src="@/assets/images/szjj/主服务器Server_none.png"
alt=""
/>
<div class="right_main">
<div class="main_input">
<span>选择角色:</span>
<el-select
v-model="value6"
class="m-2"
placeholder="请选择"
size="default"
style="width: 125px; height: 25px"
:disabled="value6!==''"
>
<el-option
v-for="item in options2"
:key="item.value"
:label="item.label"
:value="item.value"
@click.prevent="selectingNodes2(item.value,2)"
/>
</el-select>
</div>
<div class="left_item" v-show="setupFour[2]">
<img
src="@/assets/images/szjj/序号3.png"
alt=""
style="margin-top: 2px"
/>
<span>检查目标文件是否已存在</span>
<span>父目录是否存在</span>
</div>
<div class="left_item2" v-show="setupFour[7]">
<img
src="@/assets/images/szjj/序号8.png"
alt=""
style="margin-top: 2px"
/>
<span>查询可用的数据节点返回3个</span>
<span>DataNode节点分别为DataN</span>
<span>ode1、DataNode2、DataN</span>
<span>ode3</span>
</div>
</div>
</div>
<div class="left_top">
<span>客户端</span>
</div>
<div class="left_top2">
<span>名字节点</span>
</div>
</div>
<el-divider />
<span style="color:#FFFFFF"
>5、客户端通过FSDataOutputStream模块请求DataNode1上传数据DataNode1收到请求会继续调用DataNode2然后DataNode2调用DataNode3<br />将这个通信管道建立完成。DataNode1、DataNode2、DataNode3逐级应答客户端。</span
>
<div class="Server_five ts">
<div class="Server-item">
<div class="item-img">
<span>A1 Server</span>
<span>A2 Server</span>
<span>A3 Server</span>
</div>
<div class="item-name">机架rackA</div>
</div>
<div class="contact">
<img src="@/assets/images/szjj/箭.png" alt="" />
</div>
<div class="Server-item">
<div class="item-img">
<span>A1 Server</span>
<span>A2 Server</span>
<span>A3 Server</span>
</div>
<div class="item-name">机架rackB</div>
</div>
<div class="contact">
<img src="@/assets/images/szjj/箭.png" alt="" />
</div>
<div class="Server-item">
<div class="item-img">
<span>A1 Server</span>
<span>A2 Server</span>
<span>A3 Server</span>
</div>
<div class="item-name">机架rackC</div>
</div>
<img
src="@/assets/images/szjj/客户端.png"
alt=""
class="server_imgt"
/>
<el-select
v-model="value7"
class="m-2"
placeholder="请选择"
size="default"
style="
width: 135px;
position: absolute;
bottom: 25px;
left: 57px;
height: 25px;
"
:disabled="value7!==''"
>
<el-option
v-for="item in options3"
:key="item.value"
:label="item.label"
:value="item.value"
@click.prevent="selectingNodes3(item.value,1)"
/>
</el-select>
<el-select
v-model="value8"
class="m-2"
placeholder="请选择"
size="default"
style="
width: 135px;
position: absolute;
bottom: 25px;
left: 257px;
height: 25px;
"
:disabled="value8!==''"
>
<el-option
v-for="item in options3"
:key="item.value"
:label="item.label"
:value="item.value"
@click.prevent="selectingNodes3(item.value,2)"
/>
</el-select>
<el-select
v-model="value9"
class="m-2"
placeholder="请选择"
size="default"
style="
width: 135px;
position: absolute;
bottom: 25px;
left: 457px;
height: 25px;
"
:disabled="value9!==''"
>
<el-option
v-for="item in options3"
:key="item.value"
:label="item.label"
:value="item.value"
@click.prevent="selectingNodes3(item.value,3)"
/>
</el-select>
<div class="one_item" v-show="setupFive[0]" >
<img src="@/assets/images/szjj/序号1.png" alt="" />
<span>请求建立block1<br />传输通道</span>
</div>
<div class="one_item tsItem" v-show="setupFive[1]">
<img src="@/assets/images/szjj/序号2.png" alt="" />
<span>请求建立</span>
<span>block1</span>
<span>传输通道</span>
</div>
<div class="one_item tsItem movie_right" v-show="setupFive[2]">
<img src="@/assets/images/szjj/序号3.png" alt="" />
<span>请求建立</span>
<span>block1</span>
<span>传输通道</span>
</div>
<div class="one_item tsItem tsColor" v-show="setupFive[3]">
<img src="@/assets/images/szjj/序号4.png" alt="" />
<span>应答成功</span>
</div>
<div class="one_item tsItem tsColor2" v-show="setupFive[4]">
<img src="@/assets/images/szjj/序号5.png" alt="" />
<span>IO存储备份</span>
<span>成功</span>
</div>
<div class="one_item movie_left" v-show="setupFive[5]">
<img src="@/assets/images/szjj/序号6.png" alt="" />
<span>IO存储成功</span>
</div>
</div>
<el-divider />
<span style="color:#FFFFFF"
>6、客户端开始往DataNode1上传第一个Block1先从磁盘读取数据放到一个本地内存缓存以Packet为单,DataNode1收到一个Packet就会<br />传给DataNode2DataNode2传给DataNode3DataNode1每传一个packet会放入一个应答队列等待应答。</span
>
<div class="Server_five ts">
<div class="Server-item">
<div class="item-img">
<span>A1 Server</span>
<span>A2 Server</span>
<span>A3 Server</span>
</div>
<div class="item-name">机架rackA</div>
</div>
<div class="contact">
<img src="@/assets/images/szjj/箭.png" alt="" />
</div>
<div class="Server-item">
<div class="item-img">
<span>A1 Server</span>
<span>A2 Server</span>
<span>A3 Server</span>
</div>
<div class="item-name">机架rackB</div>
</div>
<div class="contact">
<img src="@/assets/images/szjj/箭.png" alt="" />
</div>
<div class="Server-item">
<div class="item-img">
<span>A1 Server</span>
<span>A2 Server</span>
<span>A3 Server</span>
</div>
<div class="item-name">机架rackC</div>
</div>
<img
src="@/assets/images/szjj/客户端.png"
alt=""
class="server_imgt"
/>
<div class="input_seven">
<span style="font-size:14px;">{{value7}}</span>
</div>
<div class="input_seven tsInput">
<span style="font-size:14px;">{{value8}}</span>
</div>
<div class="input_seven tsInput2">
<span style="font-size:14px;">{{value9}}</span>
</div>
<div class="one_item" style="cursor: pointer;" @click="uploadBlock(1)">
<img src="@/assets/images/szjj/序号1.png" alt="" />
<span>传输第一个<br />block1块的数据</span>
</div>
<div class="one_item tsItem" style="cursor: pointer;" v-show="setupSix[0]" @click="uploadBlock(2)">
<img src="@/assets/images/szjj/序号2.png" alt="" />
<span>网络传输备份</span>
</div>
<div class="one_item tsItem movie_right" style="cursor: pointer;" v-show="setupSix[1]" @click="uploadBlock(3)">
<img src="@/assets/images/szjj/序号3.png" alt="" />
<span>网络传输备份</span>
</div>
<div class="one_item tsItem tsColor" v-show="setupSix[2]">
<img src="@/assets/images/szjj/序号4.png" alt="" />
<span>IO存储备份成功</span>
</div>
<div class="one_item tsItem tsColor2" v-show="setupSix[3]">
<img src="@/assets/images/szjj/序号5.png" alt="" />
<span>IO存储备份成功</span>
</div>
<div class="one_item movie_left" v-show="setupSix[4]">
<img src="@/assets/images/szjj/序号6.png" alt="" />
<span>IO存储成功</span>
</div>
</div>
<el-divider />
<span style="color:#FFFFFF"
>7、当第一个Block1传输完成之后客户端再次请求NameNode上传第二个Block2、Block3、Block4到相应的服务器。<br />重复执行4--6步。数据读写完毕告知NameNode记录元数据</span
>
<div style="display: flex">
<div class="Server ts">
<div class="Server-item">
<div class="item-img">
<span>A1 Server</span>
<span>A2 Server</span>
<span>A3 Server</span>
</div>
<div class="item-name">机架rackA</div>
</div>
<div class="contact">
<span>通信联系</span>
<img src="@/assets/images/szjj/箭.png" alt="" />
</div>
<div class="Server-item">
<div class="item-img">
<span>A1 Server</span>
<span>A2 Server</span>
<span>A3 Server</span>
</div>
<div class="item-name">机架rackB</div>
</div>
<div class="contact">
<span>通信联系</span>
<img src="@/assets/images/szjj/箭.png" alt="" />
</div>
<div class="Server-item">
<div class="item-img">
<span>A1 Server</span>
<span>A2 Server</span>
<span>A3 Server</span>
</div>
<div class="item-name">机架rackC</div>
</div>
<img
src="@/assets/images/szjj/客户端.png"
alt=""
class="server_imgt"
/>
<img
src="@/assets/images/szjj/箭头_c.png"
alt=""
class="server_img2"
/>
<img
src="@/assets/images/szjj/主服务器Server.png"
alt=""
class="server_img3"
/>
<img
src="@/assets/images/szjj/result.png"
alt=""
class="server_img4"
/>
<div class="input_seven">
<span style="font-size:14px;">{{value7}}</span>
</div>
<div class="input_seven tsInput">
<span style="font-size:14px;">{{value8}}</span>
</div>
<div class="input_seven tsInput2">
<span style="font-size:14px;">{{value9}}</span>
</div>
<div class="input_seven tsInput3">
<span style="font-size:14px;">NameNode</span>
</div>
</div>
<div class="server_right_main">
<span>元数据记录: </span>
<p>Block1{{value7}}{{value8}}{{value9}}</p>
<p>Block2{{value7}}{{value8}}{{value9}}</p>
<p>Block3{{value7}}{{value8}}{{value9}}</p>
<p>Block4{{value7}}{{value8}}{{value9}}</p>
</div>
</div>
<el-divider />
<span style="color:#FFFFFF">8、当从HDFS读出数据时候遵循以下步骤</span>
<p style="color:#FFFFFF">步骤①: Client向NameNode发送信息告知NameNode自己想读取哪一份文件<br />
步骤②: NameNode查找自身存下来的元数据meta data。为Client生成一张清单消息这个消息包括<br/>
待读取的文件在集群上所有的block信息。<br />
每一个block信息的副本所存放的DataNode的ip地址有3个副本就有3个DataNode。同时对这3个地址按照其和Client的距离排好序。<br />
步骤③: 客户端拿到清单联系相关的DataNode请求文件块。DataNode返回文件块给客户端。客户端会选取排序靠前的DataNode来依次读<br />
取Block块每一个Block都会进行CheckSum若文件不完整则客户端会继续向NameNode获取下一批的Block列表直到验证读取出来文件是<br />
完整的则Block读取完毕。<br />
步骤④客户端会把最终读取出来所有的Block块合并成一个完整的最终文件。</p>
<div style="display:flex;">
<div class="Server ts2">
<div class="Server-item ts_item_top">
<div class="item-img">
<span>A1 Server</span>
<span>A2 Server</span>
<span>A3 Server</span>
</div>
<div class="item-name">机架rackA</div>
</div>
<div class="contact">
<span>通信联系</span>
<img src="@/assets/images/szjj/箭.png" alt="" />
</div>
<div class="Server-item ts_item_top">
<div class="item-img">
<span>A1 Server</span>
<span>A2 Server</span>
<span>A3 Server</span>
</div>
<div class="item-name">机架rackB</div>
</div>
<div class="contact">
<span>通信联系</span>
<img src="@/assets/images/szjj/箭.png" alt="" />
</div>
<div class="Server-item ts_item_top">
<div class="item-img">
<span>A1 Server</span>
<span>A2 Server</span>
<span>A3 Server</span>
</div>
<div class="item-name">机架rackC</div>
</div>
<img
src="@/assets/images/szjj/客户端.png"
alt=""
class="server_imgt"
/>
<img
src="@/assets/images/szjj/箭头_c.png"
alt=""
class="server_img2"
/>
<img
src="@/assets/images/szjj/主服务器Server.png"
alt=""
class="server_img3"
/>
<img
src="@/assets/images/szjj/箭头3_long.png"
alt=""
class="server_img5"
/>
<div class="input_seven">
<span style="font-size:14px;">{{value7}}</span>
</div>
<div class="input_seven tsInput">
<span style="font-size:14px;">{{value8}}</span>
</div>
<div class="input_seven tsInput2">
<span style="font-size:14px;">{{value9}}</span>
</div>
<div class="input_seven tsInput3">
<span style="font-size:14px;">NameNode</span>
</div>
<div class="input_eight">
<span>请求读取文件File</span>
</div>
<div class="input_eight purple">
<span>请求读取Block1</span>
</div>
<div class="input_eight purple2">
<span>请求读取Block2</span>
</div>
<div class="input_eight orange">
<span>请求读取Block1</span>
</div>
<div class="input_eight orange2">
<span>请求读取Block2</span>
</div>
</div>
<div class="server_right_main">
<span>元数据记录: </span>
<p>Block1{{value7}}{{value8}}{{value9}}</p>
<p>Block2{{value7}}{{value8}}{{value9}}</p>
<p>Block3{{value7}}{{value8}}{{value9}}</p>
<p>Block4{{value7}}{{value8}}{{value9}}</p>
</div>
</div>
</el-scrollbar>
<div class="dialog-footer">
<el-button @click="sendTitle()" class="tj">提交任务</el-button>
<el-button type="primary" @click="resultShow" class="cxks">
重新开始
</el-button>
</div>
</div>
<div class="right">
<span @click="hadoophdfsDialogVisible = true"></span>
</div>
<el-dialog
custom-class="gdialog"
v-model="hadoophdfsDialogVisible"
title="Hadoop HDFS"
width="66%"
:before-close="commitEcho"
>
<el-scrollbar height="660px">
<p style="font-weight:600;">一、 分布式文件系统</p><p>
分布式文件系统是横跨在多台计算机上的存储系统,是分布式系统的一个应用子集。这些互相联网的计算机,也被称为集群。<br />
Hadoop Distributed File System简称 HDFS是一个分布式文件系统
Hadoop
的核心组件之一。它能够将大规模数据存储到多个服务器集群上,并提供数据访问服务。它的主要优势是:<br />
高容错性(受益于它的“副本拷贝”机制和“机架感知”机制),适合部署在廉价的机器上。<br />
• 高吞吐量的数据写入和访问
</p>
<p style="font-weight:600;">二、HDFS的架构</p><p>HDFS中有三个重要的模块NameNode名称节点、DataNode数据节点和Client客户节点。这三个模块用典型的master/slave主从模式进行搭建。
</p>
<p><img src="@/assets/images/szjj/u2016.png" alt="" /></p>
<p>
1、NameNode即master节点。是分布式文件系统中的管理者。<br />
NameNode的主要职责有<br />
• 管理文件系统的命名空间<br />
• 管理集群的配置信息<br />
管理文件块block的复制文件块是HDFS中的基本读写单元在下面会细说<br />
• 监测DataNode及其所存储的数据的情况心跳机制和数据报告机制<br />
为了履行好这些职责NameNode将文件系统的元数据meta
data存放在自己的内存中元数据里主要包括<br />
• 文件信息<br />
• 每一个文件对应的文件块的信息block_id<br />
• 每一个文件块所存放的DataNode的信息<br />
NameNode是整个HDFS中唯一的单点因此它一旦故障就会引起整个集群的故障。针对此做了一个防护措施即构建一个节点Secondary
NameNode该节点定期与NameNode进行通信获取元数据的快照存储下来。<br />
2、DataNode即slave节点是真正存放文件数据的地方。更严谨地说它存放的是文件块。<br />
通过心跳机制heartbeat它每隔3s就会向NameNode发送一次心跳告诉NameNode自己没宕机。如果NameNode连续10min都没有收到心跳它会认为这个DataNode已经死掉所以将这个DataNode移出集群并启动一个进程恢复数据同时做好相应记录。<br />
通过数据报告机制它在固定的周期内会向NameNode发送自己存储的所有文件块的信息验证和校验。这个机制让NameNode知道哪些数据副本已经损坏及时创建副本只要DataNode没死掉并做好记录。<br />
3、Client客户端它的主要职责如下<br />
• 切分文件。把一份文件切分成若干个文件块。<br />
• 与NameNode进行交互获得文件信息和相关的DataNode的信息。<br />
• 与DataNode进行直接交互进行相关的数据流操作。<br />
以上三种类型的节点承担起了HDFS运作的主要工作在Hadoop中还有另外两个主要节点JobTracker作业跟踪节点和TaskTracker任务跟踪节点。这两个节点在MapReduce的运作中起到重要作用。由于这里只关注HDFS数据的写和读因此先略过这两个节点。在数据计算即MapReduce中再来看这两个节点。
</p>
<p style="font-weight:600;">三、HDFS写入数据</p>
<p><img src="@/assets/images/szjj/u2022.png" alt="" /></p>
<p>
步骤1Client想写入一份文件它首先将文件切分成若干个块block每个块64MB或128MB。例如原始文件200MB则它被切分成四块分别是64+64+64+8。<br />
然后它开始逐个处理文件块针对第一个文件块以下简称block1它向NameNode发生请求<br />
• 每一个文件块我都想在集群上存3个副本<br />
• 因此请帮我在集群上找到3个可以存副本的DataNode<br />
“3”只是个默认值Client可以自定义想要存放的副本个数
</p>
<p>
步骤2NameNode接收到Client的信息做了如下处理<br />
• 把这个文件块复制3份<br />
• 为这个文件块找到可用的三个数据节点DateNode ADataNode E和DataNode
F。在找可用数据节点的过程中NameNode启用了机架感知机制rack-awareness):<br />
若Client在集群中则将Client所在的节点选为第一个数据节点。<br />
若Client不在集群中则随机选择一个节点。<br />
• 就这样NameNode选中了DataNode A<br />
第二个数据节点需要满足和第一个数据节点在不同的机架rack上。就这样。NameNode选择了DataNode
E。<br />
第三个数据节点需要满足和第二个数据节点在同一个机架上。就这样NameNode选择了DataNode
F<br />
采用机架感知机制的原因是在存放运行Hadoop和HDFS机器的数据中心中一个机架共享同一个电源网线和交换机。因此如果有意外通常是一整个机架上所有的机器一起宕机。所以把副本存放在不同的机架上也是为了有效应对这个情况。<br />
将选好的三个数据节点的相关信息告诉Client让Client自己和数据节点进行交流
</p>
<p>
• 步骤3Client接收到数据节点信息接下来发生了几件事<br />
Client直接联系DataNode A告诉它存放一个block1的副本<br />
DataNode A联系DataNode E告诉它存放一个block1的副本<br />
DataNode E联系DataNodeF告诉它存放一个block1的副本。<br />
步骤4三个副本都存放在各自的DataNode上后三个DataNode给NameNode发送消息告知NameNode存放已经完成。<br />
• 步骤5:
第一个block的存储结束后其余block按照相同的流程进行存储。所有block存完之后Client将会通知NameNode终止写入流程。
</p>
<P style="font-weight:600;">四、HDFS读出数据</P>
<p><img src="@/assets/images/szjj/u2031.png" alt="" /></p>
<P>
• 步骤1: Client向NameNode发送信息告知NameNode自己想读取哪一份文件<br />
• 步骤2: NameNode查找自身存下来的元数据meta
data。为Client生成一张清单消息这个消息包括<br />
待读取的文件在集群上所有的block信息。<br />
每一个block信息的副本所存放的DataNode的ip地址有3个副本就有3个DataNode。同时对这3个地址按照其和Client的距离排好序。<br />
• 步骤3:
客户端拿到清单联系相关的DataNode请求文件块。DataNode返回文件块给客户端。返回完毕后关闭连接
</P>
</el-scrollbar>
<template #footer>
</template>
</el-dialog>
</div>
</div>
<el-dialog
v-model="dialogVisible"
title="比较剪枝"
width="15%"
:before-close="handleClose"
custom-class="dialog"
>
<div class="left_two">
<el-radio label="1" @click.prevent="clickRadio(1)">交换机</el-radio>
<el-radio label="1" @click.prevent="clickRadio(0)">华为MateStation S</el-radio>
<el-radio label="1" @click.prevent="clickRadio(2)">TaiShan服务器</el-radio>
</div>
</el-dialog>
</template>
<script setup>
// import {getUserId} from '@/utils/auth.js'
import { getUserInfo } from '@/utils/auth'
import {submitTrainingTask,trainingOperationRecords,HDFSViewOperationRecords} from '@/api/hash/digitalEconomy.js'
import { onMounted } from 'vue';
const { proxy } = getCurrentInstance();
const dialogVisible=ref(false)
const hadoophdfsDialogVisible = ref(false);
let errorNumber=0
const value1=ref('')
const value2=ref('')
const value3=ref('')
const value4=ref('')
const value5=ref('')
const value6=ref('')
const value7=ref('')
const value8=ref('')
const value9=ref('')
const options1 = ref([
{
value: "NameNode",
label: "NameNode",
},
{
value: "DataNode1",
label: "DataNode1",
},
{
value: "DataNode2",
label: "DataNode2",
},
{
value: "DataNode3",
label: "DataNode3",
},
]);
const options2 = [
{
value: "NameNode",
label: "NameNode",
},
{
value: "DataNode1",
label: "DataNode1",
},
{
value: "DataNode2",
label: "DataNode2",
},
{
value: "DataNode3",
label: "DataNode3",
},
];
const options3 = ref([
{
value: "NameNode",
label: "NameNode",
},
{
value: "DataNode1",
label: "DataNode1",
},
{
value: "DataNode2",
label: "DataNode2",
},
{
value: "DataNode3",
label: "DataNode3",
},
]);
const clientIndex=ref(0)
const setupNumber=ref(0)
const clientSelect=(index)=>{
if(content.value[index]===1){
proxy.$modal.msgWarning("已选择!")
return
}
dialogVisible.value=true
clientIndex.value=index
}
const content=ref([0,0,0])
const clickRadio=(index)=>{
if(clientIndex.value!==index){
proxy.$modal.msgWarning("选择错误!")
errorNumber++
return
}
content.value[clientIndex.value]=1
const allOnes = content.value.every(item => item === 1);
console.log(content.value);
if (allOnes) {
setupNumber.value=1
}
proxy.$modal.msgSuccess("选择正确!")
dialogVisible.value=false
}
const isValue=ref([0,0,0,0])
const selectingNodes=(value,index)=>{
if(setupNumber.value!==1){
proxy.$modal.msgWarning("请完成上一步!")
value1.value=''
value2.value=''
value3.value=''
value4.value=''
return
}
if(value1.value!=="NameNode"&&index===0){
proxy.$modal.msgWarning("选择错误!")
setupNumber++
value1.value=''
return
}
if(value2.value==="NameNode"||value3.value==="NameNode"||value4.value==="NameNode"){
proxy.$modal.msgWarning("选择错误!")
if(index===1){
value2.value=''
}
if(index===2){
value3.value=''
}
if(index===3){
value4.value=''
}
setupNumber++
return
}
if(isValue.value[index]===0){
removeOption(value)
}
isValue.value[index]=1
const allOnes = isValue.value.every(item => item === 1);
if (allOnes) {
setupNumber.value=2
}
}
// 在选中某个值后调用该方法来移除对应的选项
const removeOption=(valueToRemove)=>{
options1.value = options1.value.filter(item => item.value !== valueToRemove);
}
//步骤三
const showBlock=ref([false,false,false,false])
const box1Transform = ref('');
const box2Transform = ref('');
const box3Transform = ref('');
const box4Transform = ref('');
const moveBoxes=()=>{
if(setupNumber.value<2){
proxy.$modal.msgWarning("请完成上一步!")
return
}
showBlock.value=[true,true,true,true]
setTimeout(() => {
box1Transform.value = 'translateX(375px) translateY(-80px)'
}, 400);
setTimeout(() => {
box2Transform.value = 'translateX(375px) translateY(-26px)'
}, 600);
setTimeout(() => {
box3Transform.value = 'translateX(375px) translateY(27px)'
}, 800);
setTimeout(() => {
box4Transform.value = 'translateX(375px) translateY(79px)'
}, 1000);
setupNumber.value=3
}
const isGreen=ref(false)
const isGreen2=ref(false)
const isGreen3=ref(false)
const isGreen4=ref(false)
const setupFour=ref([false,false,false,false,false,false,false,false,false,false])
const selectingNodes2=(item,index)=>{
if(setupNumber.value!==3){
proxy.$modal.msgWarning("请完成上一步!")
value5.value=''
value6.value=''
return
}
if(item!=='NameNode'&&index===1){
proxy.$modal.msgWarning("请选择正确的角色!")
value5.value=''
errorNumber++
return
}
if(item==='NameNode'&&index===2){
proxy.$modal.msgWarning("请选择正确的角色!")
value6.value=''
errorNumber++
return
}
if(value5.value!==''&&value6.value!==''){
setupFour.value[0]=true
setTimeout(() => {
setupFour.value[1]=true
}, 1000);
}
}
const requestFileUpload=()=>{
isGreen.value=true
proxy.$modal.msgSuccess("上传成功!")
setupFour.value[2]=true
setTimeout(() => {
setupFour.value[3]=true
}, 1000);
}
const requestFileUpload2=()=>{
isGreen2.value=true
proxy.$modal.msgSuccess("返回成功!")
setupFour.value[4]=true
setTimeout(() => {
setupFour.value[5]=true
}, 1000);
setTimeout(() => {
setupFour.value[6]=true
}, 2000);
}
const requestFileUpload3=()=>{
isGreen3.value=true
proxy.$modal.msgSuccess("请求成功!")
setTimeout(() => {
setupFour.value[7]=true
}, 1000);
setTimeout(() => {
setupFour.value[8]=true
}, 2000);
}
const requestFileUpload4=()=>{
isGreen4.value=true
proxy.$modal.msgSuccess("返还成功!")
setTimeout(() => {
setupFour.value[9]=true
}, 1000);
setupNumber.value=4
}
//步骤五
const setupFive=ref([false,false,false,false,false,false])
const selectIndex=ref(0)
const selectingNodes3=(item,index)=>{
if(setupNumber.value!==4){
proxy.$modal.msgWarning("请完成上一步!")
value7.value=''
value8.value=''
value9.value=''
return
}
if(item==='NameNode'){
errorNumber++
proxy.$modal.msgWarning("请选择数据节点!")
if(index===1){
value7.value=''
}
if(index===2){
value8.value=''
}
if(index===3){
value9.value=''
}
return
}
if(selectIndex.value===0&&index!==1){
errorNumber++
proxy.$modal.msgWarning("请先选择机架rackA")
value7.value=''
value8.value=''
value9.value=''
return
}
if(selectIndex.value===1&&index!==2){
errorNumber++
proxy.$modal.msgWarning("请先选择机架rackB")
value7.value=''
value8.value=''
value9.value=''
return
}
if(selectIndex.value===2&&index!==3){
errorNumber++
proxy.$modal.msgWarning("请先选择机架rackB")
value7.value=''
value8.value=''
value9.value=''
return
}
if(index===1){
setupFive.value[0]=true
setTimeout(() => {
setupFive.value[1]=true
}, 1000);
}
if(index===2){
setupFive.value[2]=true
}
if(index===3){
setupFive.value[3]=true
setTimeout(() => {
setupFive.value[4]=true
}, 1000);
setTimeout(() => {
setupFive.value[5]=true
}, 2000);
setupNumber.value=5
}
selectIndex.value=selectIndex.value+1
removeOption2(item)
}
const removeOption2=(valueToRemove)=>{
options3.value = options3.value.filter(item => item.value !== valueToRemove);
}
//步骤六
const setupSix=ref([false,false,false,false,false])
const uploadBlock=(index)=>{
if(setupNumber.value!==5){
proxy.$modal.msgWarning("请完成上一步!")
return
}
if(index===1){
setTimeout(() => {
setupSix.value[0]=true
proxy.$modal.msgSuccess("传输成功!")
}, 1000);
}
if(index===2){
setTimeout(() => {
setupSix.value[1]=true
proxy.$modal.msgSuccess("备份成功!")
}, 1000);
}
if(index===3){
setTimeout(() => {
setupSix.value[2]=true
}, 1000);
setTimeout(() => {
setupSix.value[3]=true
}, 2000);
setTimeout(() => {
setupSix.value[4]=true
proxy.$modal.msgSuccess("IO存储成功")
setupNumber.value=6
}, 3000);
}
}
const sendTitle=async()=>{
if(setupNumber.value!==6){
proxy.$modal.msgWarning("请完成任务后提交!")
return
}
try{
const sendData={
module:'大数据',
numberOfErrors:errorNumber > 10 ? 10 : errorNumber,
taskName:'hadoop HDFS',
userId:JSON.parse(getUserInfo()).userId
}
const res=await submitTrainingTask(sendData)
proxy.$modal.msgSuccess("提交成功!")
hadoophdfsDialogVisible.value=false
}catch{}
}
const getListEcho=async()=>{
try{
const sendData={
module:'大数据',
userId:JSON.parse(getUserInfo()).userId
}
const res=await HDFSViewOperationRecords(sendData)
echoShow(res.data[0])
}catch{}
}
const echoShow=(data)=>{
setupNumber.value=parseFloat(data.fieldEight)
errorNumber=parseFloat(data.fieldFourteen)
if(setupNumber.value>=1){
content.value[0]=1
content.value[1]=1
content.value[2]=1
}
if(setupNumber.value>=2){
value1.value='NameNode'
value2.value='DataNode1'
value3.value='DataNode2'
value4.value='DataNode3'
isValue.value[0]=1
isValue.value[1]=1
isValue.value[2]=1
isValue.value[3]=1
}
if(setupNumber.value>=3){
moveBoxes()
setupNumber.value=parseFloat(data.fieldEight)
}
if(setupNumber.value>=4){
setupFour.value[0]=true
setupFour.value[1]=true
setupFour.value[2]=true
setupFour.value[3]=true
setupFour.value[4]=true
setupFour.value[5]=true
setupFour.value[6]=true
setupFour.value[7]=true
setupFour.value[8]=true
setupFour.value[9]=true
isGreen.value=true
isGreen2.value=true
isGreen3.value=true
isGreen4.value=true
value5.value=data.fieldEighteen
value6.value=data.fieldEleven
}
if(setupNumber.value>=5){
setupFive.value[0]=true
setupFive.value[1]=true
setupFive.value[2]=true
setupFive.value[3]=true
setupFive.value[4]=true
setupFive.value[5]=true
value7.value=data.fieldFifteen
value8.value=data.fieldFive
value9.value=data.fieldFour
}
if(setupNumber.value>=6){
setupSix.value[0]=true
setupSix.value[1]=true
setupSix.value[2]=true
setupSix.value[3]=true
setupSix.value[4]=true
}
}
onMounted(()=>{
getListEcho()
})
const commitEcho=async()=>{
hadoophdfsDialogVisible.value=false
}
const resultShow=()=>{
setupNumber.value=0
content.value[0]=0
content.value[1]=0
content.value[2]=0
value1.value=''
value2.value=''
value3.value=''
value4.value=''
isValue.value[0]=0
isValue.value[1]=0
isValue.value[2]=0
isValue.value[3]=0
showBlock.value=[false,false,false,false]
setupFour.value[0]=false
setupFour.value[1]=false
setupFour.value[2]=false
setupFour.value[3]=false
setupFour.value[4]=false
setupFour.value[5]=false
setupFour.value[6]=false
setupFour.value[7]=false
setupFour.value[8]=false
setupFour.value[9]=false
isGreen.value=false
isGreen2.value=false
isGreen3.value=false
isGreen4.value=false
value5.value=''
value6.value=''
setupFive.value[0]=false
setupFive.value[1]=false
setupFive.value[2]=false
setupFive.value[3]=false
setupFive.value[4]=false
setupFive.value[5]=false
value7.value=''
value8.value=''
value9.value=''
setupSix.value[0]=false
setupSix.value[1]=false
setupSix.value[2]=false
setupSix.value[3]=false
setupSix.value[4]=false
}
</script>
<style lang="scss" scoped>
p {
font-size: 15px;
line-height: 20px;
color: #FFFFFF;
// font-weight: 600;
}
.HadoophDFS {
display: flex;
.left {
width: calc(100% - 216px);
// height: 100%;
}
.right {
width: 216px;
padding-left: 60px;
span {
display: inline-block;
width: 110px;
height: 143px;
background: url("@/assets/images/szjj/案例任务.png") no-repeat;
background-size: 100% 100%;
}
}
span {
font-size: 15px;
font-family: Source Han Sans CN;
font-weight: bold;
color: #333333;
}
.ts {
height: 420px !important;
}
.ts2 {
margin: 10px 0px !important;
height: 482px !important;
}
.Server_five {
position: relative;
display: grid;
grid-template-columns: repeat(3, 1fr);
justify-content: center;
grid-gap: 91px;
width: calc(100% - 47%);
height: 368px;
margin: 10px 0px 40px 0px;
padding: 0px 73px;
background: url("@/assets/images/szjj/圆角矩形 10.png") no-repeat;
background-size: 100% 100%;
.Server-item {
margin-top: 153px;
.item-img {
height: 182px;
padding: 80px 7px 19px 7px;
background: url("@/assets/images/szjj/机箱.png") no-repeat;
background-size: 100% 100%;
span {
display: inline-block;
min-width: 100%;
height: 23px;
line-height: 30px;
background: url("@/assets/images/szjj/按钮.png") no-repeat;
background-size: 100% 100%;
margin-bottom: 7px;
padding: 0px 7px;
font-size: 12px;
font-family: Source Han Sans CN;
font-weight: bold;
color: #fbfcff;
}
}
.item-name {
text-align: center;
margin-top: 6px;
}
}
.Server-item:nth-child(1) {
&::before {
content: "";
display: block;
width: 14px;
height: 59px;
position: absolute;
background: url("@/assets/images/szjj/箭头@2x(2).png")
no-repeat;
background-size: 100% 100%;
top: 95px;
left: 18.4%;
}
}
.contact {
position: absolute;
display: flex;
flex-direction: column;
align-items: center;
top: 54%;
left: 29%;
}
.contact:nth-child(2) {
position: absolute;
display: flex;
flex-direction: column;
align-items: center;
top: 54%;
left: 60%;
}
.server_imgt {
// cursor: pointer;
position: absolute;
top: 15px;
left: 78px;
z-index: 1;
}
.server_img2 {
position: absolute;
top: 32px;
left: 165px;
}
.server_img3 {
position: absolute;
top: 15px;
left: 273px;
}
.server_img4 {
position: absolute;
top: 75px;
left: 147px;
}
.server_item {
position: absolute;
top: 99px;
left: 139px;
width: 146px;
height: 19px;
background: #5621f8;
border-radius: 4px;
span {
display: flex;
justify-content: center;
align-items: center;
font-size: 12px;
font-weight: 400;
color: #ffffff;
}
}
.one_item {
position: absolute;
top: 98px;
left: 152px;
width: 95px;
height: 54px;
background: #5621f8;
border-radius: 5px;
text-align: center;
padding: 2px;
span {
text-align: left;
font-size: 12px;
font-weight: 400;
color: #f8fbff;
display: block;
text-align: center
}
}
.tsItem {
width: 76px !important;
height: 70px !important;
top: 156px !important;
left: 208px !important;
text-align: center !important;
span {
text-align: center !important;
}
}
.movie_right {
left: 428px !important;
}
.tsColor {
background: #ff9936;
top: 243px !important;
left: 427px !important;
}
.tsColor2 {
background: #ff9936;
top: 243px !important;
left: 208px !important;
}
.movie_left {
background: #ff9936;
left: 22px !important;
span {
text-align: center;
}
}
.input_seven {
width: 135px;
height: 28px;
background: #ffffff;
border: 1px solid #e5e5e5;
border-radius: 2px;
position: absolute;
bottom: 20px;
left: 57px;
padding: 4px 25px;
}
.tsInput {
left: 257px !important;
}
.tsInput2 {
left: 457px !important;
}
}
.Server {
position: relative;
display: grid;
grid-template-columns: repeat(3, 1fr);
justify-content: center;
grid-gap: 91px;
width: calc(100% - 47%);
height: 368px;
margin: 10px 0px 40px 0px;
padding: 0px 73px;
background: url("@/assets/images/szjj/圆角矩形 10.png") no-repeat;
background-size: 100% 100%;
.ts_item_top{
margin-top: 218px !important;
}
.ts_item_top:nth-child(1) {
&::before {
background: url("@/assets/images/szjj/箭头2_long.png")
no-repeat !important;
height: 119px !important;
}
}
.ts_item_top:nth-child(3) {
&::after {
background: url("@/assets/images/szjj/箭头2_long.png")
no-repeat !important;
height: 119px !important;
}
}
.ts_item_top:nth-child(3) {
&::before {
background: url("@/assets/images/szjj/箭头5_long.png")
no-repeat !important;
height: 130px !important;
top:83px !important;
}
}
.Server-item {
margin-top: 153px;
.item-img {
height: 182px;
padding: 80px 7px 19px 7px;
background: url("@/assets/images/szjj/机箱.png") no-repeat;
background-size: 100% 100%;
span {
display: inline-block;
min-width: 100%;
height: 23px;
line-height: 30px;
background: url("@/assets/images/szjj/按钮.png") no-repeat;
background-size: 100% 100%;
margin-bottom: 7px;
padding: 0px 7px;
font-size: 12px;
font-family: Source Han Sans CN;
font-weight: bold;
color: #fbfcff;
}
}
.item-name {
text-align: center;
margin-top: 6px;
}
}
.Server-item:nth-child(1) {
&::before {
content: "";
display: block;
width: 14px;
height: 59px;
position: absolute;
background: url("@/assets/images/szjj/箭头@2x(2).png")
no-repeat;
background-size: 100% 100%;
top: 95px;
left: 18.4%;
}
}
.Server-item:nth-child(3) {
&::after {
content: "";
display: block;
width: 14px;
height: 59px;
position: absolute;
background: url("@/assets/images/szjj/箭头@2x(2).png")
no-repeat;
background-size: 100% 100%;
top: 95px;
left: 49.4%;
}
}
.Server-item:nth-child(3) {
&::before {
content: "";
display: block;
width: 122px;
height: 58px;
position: absolute;
background: url("@/assets/images/szjj/箭头 拷贝.png") no-repeat;
background-size: 100% 100%;
top: 76px;
left: 60%;
}
}
.contact {
position: absolute;
display: flex;
flex-direction: column;
align-items: center;
top: 64%;
left: 29%;
}
.contact:nth-child(2) {
position: absolute;
display: flex;
flex-direction: column;
align-items: center;
top: 64%;
left: 60%;
}
.server_imgt {
// cursor: pointer;
position: absolute;
top: 15px;
left: 78px;
// z-index: 1;
}
.server_img2 {
position: absolute;
top: 32px;
left: 165px;
}
.server_img3 {
position: absolute;
top: 15px;
left: 273px;
}
.server_img4 {
position: absolute;
top: 75px;
left: 147px;
}
.server_img5 {
position: absolute;
top: 82px;
left: 141px;
}
.server_item {
position: absolute;
top: 99px;
left: 149px;
width: 146px;
height: 19px;
background: #5621f8;
border-radius: 4px;
span {
display: flex;
justify-content: center;
align-items: center;
font-size: 12px;
font-weight: 400;
color: #ffffff;
}
}
.tsPosition {
top: 122px !important;
left: 288px !important;
}
.tsPosition2 {
top: 99px !important;
left: 428px !important;
}
.server_left {
padding: 100px 0;
}
.server_right {
margin: 100px 0 0 -82px;
}
.server_button {
position: absolute;
top: 160px;
left: 230px;
:deep(.el-button) {
width: 136px;
height: 40px;
background: url("@/assets/images/szjj/icon-分类器训练.png");
color: #ffffff;
--el-button-border-color: #ffffff00;
--el-button-hover-border-color: #ffffff00;
--el-button-active-border-color: #ffffff00;
}
}
.server_file {
display: flex;
justify-content: center;
align-items: center;
position: absolute;
top: 158px;
left: 67px;
width: 149px;
height: 42px;
background: url("@/assets/images/szjj/文件夹1.png");
transition: transform 3s ease;
}
// .tsFile1 {
// top: 132px !important;
// }
// .tsFile2 {
// top: 186px !important;
// }
// .tsFile3 {
// top: 236px !important;
// }
.input_seven {
width: 135px;
height: 28px;
background: #ffffff;
border: 1px solid #e5e5e5;
border-radius: 2px;
position: absolute;
bottom: 20px;
left: 57px;
padding: 4px 25px;
}
.tsInput {
left: 257px !important;
}
.tsInput2 {
left: 457px !important;
}
.tsInput3 {
top: 24px !important;
left: 371px !important;
}
.input_eight{
position: absolute;
top: 6px;
left: 177px;
width: 96px;
height: 29px;
background: #5621F8;
border-radius: 4px;
padding: 6px 2px;
span{
font-weight: 400;
color: #F8FBFF;
font-size: 12px;
}
}
.purple{
top: 116px !important;
left: 139px !important;
}
.purple2{
top: 161px !important;
left: 139px !important;
}
.orange{
background: #FF9936;
top: 116px !important;
left: 17px !important;
}
.orange2{
background: #FF9936;
top: 161px !important;
left: 17px !important;
}
}
.serverFour {
position: relative;
display: grid;
grid-template-columns: repeat(3, 1fr);
justify-content: center;
grid-gap: 0px;
width: calc(100% - 50%);
height: 445px;
margin: 10px 0px 50px 0px;
padding: 0px 10px;
background: url("@/assets/images/szjj/圆角矩形 10.png") no-repeat;
background-size: 100% 100%;
.Four_left {
margin: 10px 0;
.left_main {
margin-top: 24px;
background: url("@/assets/images/szjj/蓝色虚线.png");
width: 237px;
height: 318px;
position: relative;
padding: 25px 10px;
.main_input {
padding: 0 11px;
display: flex;
align-items: center;
}
.left_item {
width: 188px;
height: 43px;
background: #a6cdff;
border: 1px solid #7fb2f4;
border-radius: 4px;
margin: 18px 5px 5px 13px;
text-align: center;
span {
display: block;
}
}
.left_item2 {
width: 188px;
height: 43px;
background: #a6cdff;
border: 1px solid #7fb2f4;
border-radius: 4px;
margin: 15px 5px 5px 13px;
text-align: center;
span {
display: block;
}
}
}
img {
margin: 0 68px;
}
}
.Four_middle {
margin-left: 3px;
margin-top: 189px;
.middle_item {
background: url("@/assets/images/szjj/按钮_pick.png") no-repeat;
width: 148px;
border-radius: 5px;
height: 48px;
text-align: center;
padding: 5px;
margin-bottom: 10px;
z-index: 2;
position: relative;
span {
display: block;
color: #ffffff;
font-size: 12px;
}
}
.ts_item {
width: 147px;
height: 59px;
background-size: 100% 100%;
}
.middle_arrow {
position: absolute;
z-index: 1;
top: 202px;
left: 222px;
}
.tsArrow {
top: 266px !important;
}
.tsArrow2 {
top: 326px !important;
}
.tsArrow3 {
top: 387px !important;
}
}
.Four_right {
text-align: center;
margin-top: 10px;
.right_main {
margin-top: 48px;
background: url("@/assets/images/szjj/绿色虚线.png");
width: 237px;
height: 318px;
position: relative;
padding: 25px 10px;
.main_input {
padding: 0 11px;
display: flex;
align-items: center;
}
.left_item {
width: 188px;
height: 64px;
background: #a9ffe9;
border: 1px solid #18cfa3;
border-radius: 4px;
margin: 15px 5px 5px 13px;
text-align: center;
span {
display: block;
}
}
.left_item2 {
width: 188px;
height: 91px;
background: #a9ffe9;
border: 1px solid #18cfa3;
border-radius: 4px;
margin: 43px 5px 5px 13px;
text-align: center;
span {
display: block;
font-size: 12px;
}
}
}
}
.left_top {
position: absolute;
width: 187px;
height: 27px;
background: url("@/assets/images/szjj/客户端_top.png");
top: 100px;
left: 40px;
padding: 5px 31px;
span {
font-size: 12px;
font-weight: 500;
color: #ffffff;
}
}
.left_top2 {
position: absolute;
width: 187px;
height: 27px;
background: url("@/assets/images/szjj/名字节点.png");
top: 100px;
left: 432px;
padding: 5px 31px;
span {
font-size: 12px;
font-weight: 500;
color: #ffffff;
}
}
}
}
.server_right_main{
width: 372px;
height: 220px;
border: 1px solid #71AAFF;
background: linear-gradient(0deg, #E2EDFF 0%, #FFFFFF 100%);
border-radius: 4px;
margin: 10px;
padding: 15px;
span{
font-size: 14px;
font-weight: bold;
color: #333333;
margin: 15px 0;
display: block;
}
p{
color: #333333;
}
}
.clientSelect{
width: 99px;
height: 80px;
cursor: pointer;
position: absolute;
top: 15px;
left: 78px;
}
.left_two{
.el-radio{
display: block;
margin-left: 50px;
}
}
</style>
<style lang="scss">
.dialog {
border-radius: 12px;
.el-dialog__header {
background: url("@/assets/images/szjj/.png") !important;
background-size: 100% 100% !important;
margin-right: 0 !important;
span {
font-size: 14px;
font-weight: 400;
color: #ffffff;
}
}
.el-dialog__headerbtn {
top: 8px !important;
background: url("@/assets/images/szjj/2.png") no-repeat;
background-size: 100% 100% !important;
width: 16px;
height: 16px;
margin-right: 15px;
margin-top: 7px;
}
.el-dialog__headerbtn i {
content: "1";
font-size: 13px;
visibility: hidden;
}
.el-dialog__footer {
text-align: center;
}
.tj{
color: #FFFFFF;
}
.cxks{
background: url('@/assets/images/szjj/.png') no-repeat;
}
.el-dialog__body {
padding: 20px 20px;
}
}
.el-dialog:not(.is-fullscreen) {
// margin-top: 3vh !important;
margin-left: auto !important;
}
.dialog-footer{
.el-button{
background: url('@/assets/images/szjj/.png') no-repeat;
background-size: 100% 100%;
width: 136px;
height: 40px;
border:none;
border-color:none;
}
.tj{
color: #FFFFFF;
}
.cxks{
background: url('@/assets/images/szjj/.png') no-repeat;
}
}
.clientAbs{
position: absolute;
width: 84px;
height: 20px;
background: #FFFFFF;
font-weight: 600;
top: 73px;
left: 86px;
cursor: pointer;
}
.correspondence{
position: absolute;
width: 84px;
height: 25px;
top: 208px;
left: 204px;
background: #FFFFFF;
cursor: pointer;
border-radius: 5px;
border: 1px solid #000000;
text-align: center;
padding: 2px;
}
.txPotion{
left: 424px;
}
</style>