HDFS的架构优势与基本操作

目录

  • 写在前面
  • 一、 HDFS概述
    • 1.1 HDFS简介
    • 1.2 HDFS优缺点
      • 1.2.1 优点
      • 1.2.2 缺点
    • 1.3 HDFS组成架构
    • 1.4 HDFS文件块大小
  • 二、HDFS的Shell操作(开发重点)
    • 2.1 基本语法
    • 2.2 命令大全
    • 2.3 常用命令实操
      • 2.3.1 上传
      • 2.3.2 下载
      • 2.3.3 HDFS直接操作
  • 三、HDFS的API操作
    • 3.1 配置Windows
    • 3.2 HDFS的API案例实操
      • 3.2.1 HDFS文件上传
      • 3.2.2 HDFS文件下载
      • 3.2.3 HDFS文件更名和移动
      • 3.2.4 HDFS删除文件和目录
      • 3.2.5 HDFS文件详情查看
      • 3.2.6 HDFS文件和文件夹判断
  • 写在最后

写在前面

如今,数据正以指数级增长,各行各业都在追求更多的数据存储、高效的数据处理和可靠的数据基础来驱动业务的发展。Hadoop Distributed File System(HDFS)作为Hadoop生态系统的核心组件之一,成为构建可靠的大数据基础的不二选择之一。本文将深入剖析HDFS的架构与优势。

一、 HDFS概述

1.1 HDFS简介

HDFS(Hadoop分布式文件系统)是Apache Hadoop框架的一部分,设计用于存储和处理大规模数据集的分布式文件系统。HDFS产生的背景主要是为了满足处理大规模数据的需求。

在过去,传统的文件系统难以处理大规模数据集,因为它们通常只能在单个服务器上存储和操作数据。随着大数据时代的到来,企业和组织面临着巨大的数据规模和复杂性。为了应对这个挑战,HDFS被开发出来作为一个高度可靠和高容量的分布式文件系统。

HDFS的设计目标是能够在廉价的硬件上运行,并且能够容纳上千台机器的集群。它通过将数据切分成多个块并将其分散存储在不同的计算节点上,实现了高吞吐量的数据访问和处理能力。此外,HDFS还提供了故障容错功能,能够自动处理存储节点的故障。

简而言之,HDFS是为了解决大规模数据处理问题而设计的,它提供了高可靠性、高扩展性和高吞吐量的分布式文件系统解决方案。

1.2 HDFS优缺点

1.2.1 优点

  • 高容错、高可用、高扩展
    • 数据冗余多副本、副本丢失后自动恢复
    • NameNode HA、安全模式
    • 10K节点规模,通过横向扩展来增加存储容量和处理能力。
  • 海量数据存储(高容量)
    • 典型文件大小GB~TB,百万以上文件数量,PB甚至EB以上数据规模
  • 构建成本低、安全可靠
    • 构建在廉价的商用服务器上,降低了存储成本和维护成本。
    • 通过多副本机制,提高可靠性
    • 提供了容错和恢复机制
  • 适合大规模离线批处理
    • 流式数据访问
    • 数据位置暴露给计算框架

1.2.2 缺点

  • 不适合低延迟数据访问
    • 对于实时数据访问和低延迟要求较高的场景,HDFS的性能可能不够理想
  • 不适合大量小文件存储
    • 元数据会占用NameNode大量存储空间
    • 磁盘寻道时间超过读取时间
  • 不支持并发写入
    • 一个文件同时只能有一个写,不允许多个线程同时写
  • 不支持文件随机修改
    • 仅支持数据追加

1.3 HDFS组成架构

在这里插入图片描述

  1. NameNode(nn):
    NameNode是HDFS的主节点(Master),负责管理整个文件系统的命名空间数据块的元数据信息。它维护文件系统的目录结构、文件的安全权限信息和数据块的位置信息等。NameNode还处理客户端的文件系统操作请求,如文件的读写和块的创建、复制和删除等。

  2. DataNode(dn):
    DataNode是HDFS的工作节点(Slave),负责实际存储文件数据和执行文件系统操作的任务。每个DataNode负责管理一定数量的数据块,并定期向NameNode报告数据块的存储信息。DataNode还处理来自客户端和其他DataNode的读取和写入请求,以及数据块的复制和恢复等。

  3. 客户端(Client):
    客户端是使用HDFS的应用程序。它们通过与Namenode和DataNode进行通信来读取和写入文件。客户端向NameNode请求文件的元数据信息,根据元数据信息确定所需数据块的位置,并从DataNode获取数据。客户端还负责处理文件系统的操作,如创建、删除、重命名和移动文件等。

1.4 HDFS文件块大小

HDFS中的文件在物理上是分成一个个数据块(Block)存储的,块的大小可以通过配置参数(dfs.blocksize)来规定,文件块默认大小是128M。

HDFS文件块的大小选择是根据以下考虑因素:

  • 吞吐量:较大的文件块大小在处理大文件时可以提供更高的吞吐量。这是因为较大的文件块减少了磁盘寻道和网络传输的开销,使得数据读取和写入能够更加高效。

  • 空间利用:较大的文件块可以减少存储元数据的开销。在HDFS中,每个文件块都有一条元数据记录,较小的文件块可能会导致元数据记录数量增加,增加了存储的开销。

  • 并行性:较大的文件块可以提高数据的并行处理能力。在HDFS中,数据块是独立存储和处理的,较大的文件块能够在不同的计算节点上并行处理,从而减少整个作业的执行时间。

较大的文件块适合存储大型文件和批量处理任务,但对于小型文件和实时数据处理,较小的文件块可能更加适合。

Q:为什么HDFS文件块的大小不能太大,也不能设置太小呢?
A: 文件块设置太小,会增加寻址的时间;设置太大,会导致数据处理非常慢。

HDFS文件块的大小设置取决于磁盘的传输速率

二、HDFS的Shell操作(开发重点)

2.1 基本语法

hadoop fs 具体命令 或者 hdfs dfs 具体命令

2.2 命令大全

[amo@hadoop102 hadoop-3.2.4]$ bin/hadoop fs
Usage: hadoop fs [generic options][-appendToFile <localsrc> ... <dst>][-cat [-ignoreCrc] <src> ...][-checksum <src> ...][-chgrp [-R] GROUP PATH...][-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...][-chown [-R] [OWNER][:[GROUP]] PATH...][-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] [-q <thread pool queue size>] <localsrc> ... <dst>][-copyToLocal [-f] [-p] [-crc] [-ignoreCrc] [-t <thread count>] [-q <thread pool queue size>] <src> ... <localdst>][-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...][-cp [-f] [-p | -p[topax]] [-d] [-t <thread count>] [-q <thread pool queue size>] <src> ... <dst>][-createSnapshot <snapshotDir> [<snapshotName>]][-deleteSnapshot <snapshotDir> <snapshotName>][-df [-h] [<path> ...]][-du [-s] [-h] [-v] [-x] <path> ...][-expunge [-immediate]][-find <path> ... <expression> ...][-get [-f] [-p] [-crc] [-ignoreCrc] [-t <thread count>] [-q <thread pool queue size>] <src> ... <localdst>][-getfacl [-R] <path>][-getfattr [-R] {-n name | -d} [-e en] <path>][-getmerge [-nl] [-skip-empty-file] <src> <localdst>][-head <file>][-help [cmd ...]][-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]][-mkdir [-p] <path> ...][-moveFromLocal [-f] [-p] [-l] [-d] <localsrc> ... <dst>][-moveToLocal <src> <localdst>][-mv <src> ... <dst>][-put [-f] [-p] [-l] [-d] [-t <thread count>] [-q <thread pool queue size>] <localsrc> ... <dst>][-renameSnapshot <snapshotDir> <oldName> <newName>][-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...][-rmdir [--ignore-fail-on-non-empty] <dir> ...][-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]][-setfattr {-n name [-v value] | -x name} <path>][-setrep [-R] [-w] <rep> <path> ...][-stat [format] <path> ...][-tail [-f] [-s <sleep interval>] <file>][-test -[defswrz] <path>][-text [-ignoreCrc] <src> ...][-touch [-a] [-m] [-t TIMESTAMP (yyyyMMdd:HHmmss) ] [-c] <path> ...][-touchz <path> ...][-truncate [-w] <length> <path> ...][-usage [cmd ...]]Generic options supported are:
-conf <configuration file>        specify an application configuration file
-D <property=value>               define a value for a given property
-fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.
-jt <local|resourcemanager:port>  specify a ResourceManager
-files <file1,...>                specify a comma-separated list of files to be copied to the map reduce cluster
-libjars <jar1,...>               specify a comma-separated list of jar files to be included in the classpath
-archives <archive1,...>          specify a comma-separated list of archives to be unarchived on the compute machinesThe general command line syntax is:
command [genericOptions] [commandOptions]

2.3 常用命令实操

  • 创建一个文件夹,用来操作命令
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -mkdir /amoxilin
  • help:输出这个命令参数
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -help rm

2.3.1 上传

  • -moveFromLocal:从本地剪切粘贴到HDFS
# 创建一个测试文件 test.txt,并输入一些内容
[amo@hadoop102 hadoop-3.2.4]$ vim test.txt# 使用 moveFromLocal 命令将test.txt文件移动到 HDFS
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -moveFromLocal ./test.txt /amoxilin
  • -copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
[amo@hadoop102 hadoop-3.2.4]$ vim test1.txt
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -copyFromLocal test1.txt /amoxilin
  • -put:等同于copyFromLocal,生产环境更习惯用put
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -put test1.txt /amoxilin
  • -appendToFile:追加一个文件到已经存在的文件末尾
# 创建一个文件test2.txt 并输入内容: 123
[amo@hadoop102 hadoop-3.2.4]$ vim test2.txt# 将文件 test2.txt 追加到test.txt文件末尾
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -appendToFile test2.txt /amoxilin/test.txt

在这里插入图片描述

2.3.2 下载

  • -copyToLocal: 从HDFS拷贝到本地
# 将 HDFS 中的test.txt文件copy下来
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -copyToLocal /amoxilin/test.txt ./
[amo@hadoop102 hadoop-3.2.4]$ ls  # 查看文件是否拷贝成功  文件夹中有 test.txt,拷贝成功
bin   etc      lib      LICENSE.txt  NOTICE.txt  sbin   test1.txt  test.txt  wcoutput
data  include  libexec  logs         README.txt  share  test2.txt  wcinput
[amo@hadoop102 hadoop-3.2.4]$ 
  • -get: 等同于copyToLocal,生产环境更习惯用get
# 将 HDFS 中的test.txt文件copy下来,并起一个其他的名字比如123.txt
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -get /amoxilin/test.txt ./123.txt
[amo@hadoop102 hadoop-3.2.4]$ ls
123.txt  etc      libexec      NOTICE.txt  share      test.txt
bin      include  LICENSE.txt  README.txt  test1.txt  wcinput
data     lib      logs         sbin        test2.txt  wcoutput
[amo@hadoop102 hadoop-3.2.4]$ 

2.3.3 HDFS直接操作

  • -ls: 显示目录信息
# 查看 HDFS 里amoxilin文件夹的目录结构
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -ls /amoxilin
Found 2 items
-rw-r--r--   3 amo supergroup          9 2024-03-07 23:33 /amoxilin/test.txt
-rw-r--r--   3 amo supergroup         49 2024-03-07 23:29 /amoxilin/test1.txt
  • -cat: 显示文件内容
# 查看某个文件的详细信息
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -cat /amoxilin/test.txt
test
123
  • -chgrp、-chmod、-chown: Linux文件系统中的用法一样,修改文件所属权限
# 修改文件的权限
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -chmod 666 /amoxilin/test.txt
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -ls /amoxilin
Found 2 items
-rw-rw-rw-   3 amo supergroup          9 2024-03-07 23:33 /amoxilin/test.txt
-rw-r--r--   3 amo supergroup         49 2024-03-07 23:29 /amoxilin/test1.txt
# 修改文件的group
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -chown amo:amo/amoxilin/test.txt
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -ls /amoxilin
Found 2 items
-rw-rw-rw-   3 amo amo                 9 2024-03-07 23:33 /amoxilin/test.txt
-rw-r--r--   3 amo supergroup         49 2024-03-07 23:29 /amoxilin/test1.txt
  • -mkdir: 创建路径
# 创建文件夹
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -mkdir /csdn
  • -cp: 从HDFS的一个路径拷贝到HDFS的另一个路径
# 复制文件
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -cp /amoxilin/test1.txt /csdn
  • -mv: 在HDFS目录中移动文件
# 移动文件
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -mv /amoxilin/test.txt /csdn
  • -tail: 显示一个文件的末尾1kb的数据
# 查看文件末尾内容
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -tail /amoxilin/test1.txt
欲买桂花同载酒,终不似,少年游!
[amo@hadoop102 hadoop-3.2.4]$ 
  • -rm: 删除文件或文件夹
# 删除
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -rm /amoxilin/test1.txt
Deleted /amoxilin/test1.txt
  • -rm -r: 递归删除目录及目录里面内容
# 递归删除
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -rm -r /amoxilin
Deleted /amoxilin
  • -u: 统计文件夹的大小信息
# 统计文件夹的大小
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -du -s -h /csdn
58  174  /csdn                                  # 58 是文件大小 文件有三个副本就是58*3=174
# 统计文件夹内各文件的大小
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -du -h /csdn
9   27   /csdn/test.txt
49  147  /csdn/test1.txt
  • -setrep: 设置HDFS中文件的副本数量
# 设置hdfs副本数量
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -setrep 5 /csdn/test1.txt
Replication 5 set: /csdn/test1.txt

在这里插入图片描述

这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到5台时,副本数才能达到5。

三、HDFS的API操作

3.1 配置Windows

  1. 解压Hadoop安装包到Windows系统 D:\hadoop-3.2.4
  2. 设置$HADOOP_HOME环境变量指向D:\hadoop-3.2.4
  3. 配置Path环境变量 %HADOOP_HOME%\bin
  4. 下载
    • hadoop.dll 下载地址
    • winutils.exe 下载地址
  5. 将 hadoop.dll 和 winutils.exe 放入$HADOOP_HOME/bin 文件夹中

3.2 HDFS的API案例实操

  1. 在IDEA中创建一个Maven工程,并导入相应的依赖坐标以及日志
<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.2.4</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.30</version></dependency>
</dependencies>
  1. 创建HdfsClient类
public class HdfsClient {@Testpublic void test() throws IOException, URISyntaxException, InterruptedException {// 1 获取一个客户端实例// 参数1:hdfs文件系统地址// 参数2:配置文件// 参数3:用户FileSystem fs= FileSystem.get(new URI("hdfs://hadoop102:8020"),  new Configuration(), "amo");// 2 创建目录fs.mkdirs(new Path("/amxl"));// 3 关闭资源fs.close();}
}
  1. 执行程序
    在这里插入图片描述

3.2.1 HDFS文件上传

  1. 编写源代码
 // 文件上传
@Test
public void testCopyFromLocal() throws URISyntaxException, IOException, InterruptedException {// 1 获取一个客户端实例// 参数1:hdfs文件系统路径// 参数2:配置信息// 参数3:用户名FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"),  new Configuration(), "amo");// 2 使用客户端对象操作HDFS// copyFromLocalFile(是否删除源数据,是否覆盖目标数据,源数据路径,目标数据路径)fs.copyFromLocalFile(false, true, new Path("D:\\note.txt"),new Path("/amxl"));// 3 关闭资源fs.close();
}

在这里插入图片描述在这里插入图片描述
文件默认的副本为3

  1. 将hdfs-site.xml拷贝到项目的resources资源目录下,重新上传文件
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><property><name>dfs.replication</name><value>1</value></property>
</configuration>

在这里插入图片描述在resources目录下自定义配置文件并设置文件副本数为1,发现此处配置文件参数的优先级是高于默认配置的文件的

  1. 代码中修改配置
@Test
public void testCopyFromLocal() throws URISyntaxException, IOException, InterruptedException {Configuration configuration = new Configuration();// 设置文件副本数为 2configuration.set("dfs.replication","2");FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"),  configuration, "amo");fs.copyFromLocalFile(false, true, new Path("D:\\note.txt"),new Path("/amxl"));fs.close();
}

在这里插入图片描述
重新上传文件,发现文件的副本数为2

  1. 小结
    参数优先级排序:客户端代码中设置的值 > resources下的用户自定义配置文件 >然后是服务器的自定义配置 >服务器的默认配置

3.2.2 HDFS文件下载

// 文件下载
@Test
public void testCopyToLocal() throws URISyntaxException, IOException, InterruptedException {// 1 获取配置信息以及加载配置 并获取一个客户端实例FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"),  new Configuration(), "amo");// 2 使用客户端对象操作 HDFS 将 note.txt文件下载到本地 D 盘// copyToLocalFile(是否删除源文件,下载的文件路径,文件下载的目标路径,是否开启文件校验)fs.copyToLocalFile(false,new Path("/amxl/note.txt"),new Path("D:\\"),true);// 3 关闭资源fs.close();
}

3.2.3 HDFS文件更名和移动

 // 文件移动和重命名
@Test
public void testRename() throws IOException, URISyntaxException, InterruptedException {// 1 获取配置信息以及加载配置 并获取一个客户端实例FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "amo");// 2 文件重命名// rename(源文件名,目标文件名)fs.rename(new Path("/amxl/note.txt"), new Path("/amxl/note1.txt"));// 文件移动// rename(源文件路径,目标文件路径)fs.rename(new Path("/csdn/test1.txt"), new Path("/amxl/test.txt"));// 3 关闭资源fs.close();
}

移动前:
在这里插入图片描述

移动后:
在这里插入图片描述

3.2.4 HDFS删除文件和目录

// 删除文件和文件夹
@Test
public void testDelete() throws IOException, URISyntaxException, InterruptedException {// 1 获取配置信息以及加载配置 并获取一个客户端实例FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "amo");// 2 文件删除// delete(路径)// delete(路径,是否递归)fs.delete(new Path("/amxl/note1.txt"), false);fs.delete(new Path("/csdn"), true);// 3 关闭资源fs.close();
}

删除前:
在这里插入图片描述
删除后:
在这里插入图片描述

3.2.5 HDFS文件详情查看

查看文件名称、权限、长度、块信息

// 查看文件详细信息
@Test
public void testGetFileStatus() throws IOException, URISyntaxException, InterruptedException {// 1 获取配置信息以及加载配置 并获取一个客户端实例FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "amo");// 2 文件详细信息// listStatus(路径)// listStatus(路径,是否递归)RemoteIterator<LocatedFileStatus> listedFiles = fs.listFiles(new Path("/amxl"), true);while (listedFiles.hasNext()) {LocatedFileStatus next = listedFiles.next();System.out.println(next.getPath());System.out.println(next.getPermission());System.out.println(next.getOwner());System.out.println(next.getGroup());System.out.println(next.getLen());System.out.println(next.getModificationTime());System.out.println(next.getReplication());System.out.println(next.getBlockSize());// 获取块信息BlockLocation[] blockLocations = next.getBlockLocations();System.out.println(Arrays.toString(blockLocations));}// 3 关闭资源fs.close();
}// -----------------------------------------------------------------------------------------// 输出
hdfs://hadoop102:8020/amxl/test.txt
rw-r--r--
amo
supergroup
49
1709910523258
5
134217728
[0,49,hadoop104,hadoop103,hadoop102]

3.2.6 HDFS文件和文件夹判断

 // 判断文件夹和文件
@Test
public void testListFiles() throws IOException, URISyntaxException, InterruptedException {// 1 获取配置信息以及加载配置 并获取一个客户端实例FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "guo");// 2 判断文件夹和文件// listStatus(路径)FileStatus[] fileStatuses = fs.listStatus(new Path("/"));for (FileStatus fileStatus : fileStatuses) {// 判断是否是文件if(fileStatus.isFile()) {System.out.println("文件:" + fileStatus.getPath().getName());}else {System.out.println("文件夹:" + fileStatus.getPath().getName());}}
//        FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
//
//        for (FileStatus fileStatus : fileStatuses) {
//            // 判断是否是文件夹
//            if (fileStatus.isFile()) {
//                System.out.println("文件:" + fileStatus.getPath().getName());
//            }
//            if (fileStatus.isDirectory()) {
//                System.out.println("文件夹:" + fileStatus.getPath().getName());
//            }
//        }// 3 关闭资源fs.close();
}

在这里插入图片描述


写在最后

总的来说,HDFS架构的优势和基本操作使其成为构建可靠的大数据基础的理想选择。它的高可靠性、高扩展性和高效的数据访问方式,为处理大规模数据提供了强大的支持,并通过Shell操作和API操作,方便用户管理和操作存储在HDFS中的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/540139.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java基础】IO流(二)字符集知识

目录 字符集知识 1、GBK字符集 2、Unicode字符集&#xff08;万国码&#xff09; 3、乱码 4、Java中编码和解码的方法 字符集知识 字符&#xff08;Character&#xff09;&#xff1a;在计算机和电信技术中&#xff0c;一个字符是一个单位的字形、类字形单位或符号的基本信…

揭秘动态住宅代理:如何合法获取全球数据洞察

文章目录 写在前面代理网络的崛起什么是代理网络&#xff1f;动态住宅代理的革命为什么选择亮数据动态代理 如何利用采集工具获取全球亮数据写在最后 写在前面 随着互联网技术的发展&#xff0c;数据已经成为企业生存和发展的不可或缺的资源。尤其在商业世界里&#xff0c;如何…

IAB视频广告标准《数字视频和有线电视广告格式指南》之 简介、目录及视频配套广告 - 我为什么要翻译介绍美国人工智能科技公司IAB系列(2)

写在前面 谈及到中国企业走入国际市场&#xff0c;拓展海外营销渠道的时候&#xff0c;如果单纯依靠一个小公司去国外做广告&#xff0c;拉渠道&#xff0c;找代理公司&#xff0c;从售前到售后&#xff0c;都是非常不现实的。我们可以回想一下40年前&#xff0c;30年前&#x…

什么是VPS?如何使用VPS?

什么是VPS&#xff1f;VPS有什么用&#xff1f; VPS是Virtual Private Server的缩写&#xff0c;中文则为虚拟专用服务器&#xff0c;VPS是利用虚拟服务器软件在一台物理服务器上创建多个相互隔离的小服务器&#xff0c;是托管在机房物理服务器上的虚拟机。每个VPS服务器都可分…

海格里斯HEGERLS智能托盘四向车系统为物流仓储自动化升级提供新答案

随着实体企业面临需求多样化、订单履行实时化、商业模式加速迭代等挑战&#xff0c;客户对物流仓储解决方案的需求也逐渐趋向于柔性化、智能化。作为近十年来发展起来的新型智能仓储设备&#xff0c;四向车系统正是弥补了先前托盘搬运领域柔性解决方案的空白。随着小车本体设计…

【C语言_C语言语句_复习篇】

目录 一、C语言的语句有哪些 1.1 空语句 1.2 表达式语句 1.3 函数调用语句 1.4 复合语句 1.5 控制语句 二、分支语句&#xff08;两种&#xff09; 1.1 if语句 1.1.1 普通分支语句(if、if_else) 1.1.2 嵌套if语句 1.1.3 else嵌套if两种写法的比较 1.1.4 else悬空问题 1.1.…

嵌入式毕业设计-基于智能家居灯光控制系统的设计与实现

项目介绍 技术&#xff1a;C语言、单片机等 在科技进步与社会发展的今天&#xff0c;智能家居这一概念慢慢走进人们的生活。照明控制作为智能家居的重要组成部分&#xff0c;它与人们日常生活的联系最为紧密&#xff0c;本文研究了利用ZigBee网络进行室内通信&#xff0c;克服…

美团大规模KV存储挑战与架构实践

KV 存储作为美团一项重要的在线存储服务&#xff0c;承载了在线服务每天万亿级的请求量&#xff0c;并且保持着 99.995% 的服务可用性。在 DataFunSummit 2023 数据基础架构峰会上&#xff0c;我们分享了《美团大规模 KV 存储挑战与架构实践》&#xff0c;本文为演讲内容的整理…

做外贸如何打动老是邮件不回复的客户

有人说&#xff1a;进入公司半年&#xff0c;都没有碰到什么大客户&#xff0c;小客户接了没利润&#xff0c;不想接&#xff0c;很难找到自己的定位&#xff0c;不知道如何去开发客户。 这是一个范围很大的问题&#xff0c;每个行业不一样&#xff0c;做外贸很多时候都是相通…

(Linux学习 十)磁盘管理(上)基本分区介绍

一、磁盘管理 添加磁盘&#xff1a;傻瓜式操作下一步下一步&#xff0c;只需设置磁盘内存大小 管理磁盘流程 新硬盘–>分区&#xff08;MBR或者GPT&#xff09;–>格式化/文件系统Filesystem–>挂载mount 1.查看磁盘信息 ll /dev/sd* //方法一 lsblk //方…

【Axure教程】能增删改的树形表格

多层级表格又成为树形表格&#xff0c;是在后台常用的一种表格形式&#xff0c;当表格数据存在多层级关系是&#xff0c;可以通过多层级表格&#xff0c;从而更加清晰的呈现数据内容&#xff0c;帮助人们更好地理解和分析数据之间的关系&#xff0c;从而更加有效地传递信息。 …

学习Android的第二十八天

目录 Android Service (服务) 线程 Service (服务) Service 相关方法 Android 非绑定 Service startService() 启动 Service 验证 startService() 启动 Service 的调用顺序 Android 绑定 Service bindService() 启动 Service 验证 BindService 启动 Service 的顺序 …