Hadoop资源全解压缩包

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

本文还有配套的精品资源,点击获取  

  简介:Hadoop是一个开源的分布式盘算框架,专为处理和存储大数据计划。本资源包“hadoop.zip”提供了一系列Hadoop焦点组件和相关资源,包括HDFS和MapReduce,以及源代码、构建脚本、配置文件、文档和测试用例等。通过把握这些内容,用户可以深入相识Hadoop的工作原理并进行当地开发和测试。别的,还包括Hadoop生态系统中的其他工具和服务,以及安装、配置、优化和故障排查的实用技能。

1. Hadoop开源分布式盘算框架介绍

  在当今的数据处理范畴,Hadoop已成为处理大数据的焦点技术之一。本章将带你入门Hadoop这一强大的开源框架,探究它如何通太过布式盘算办理大规模数据集的存储和分析问题。
1.1 Hadoop概述

  Hadoop是由Apache基金会开发的一个开源项目,它允许使用简单的编程模子来执行分布式处理,从而对大数据集进行可靠性存储和分析处理。其焦点是一个分布式文件系统HDFS(Hadoop Distributed File System)和一个分布式数据处理模子MapReduce,两者共同构成了大数据处理的根本架构。
1.2 Hadoop的组件和生态系统

  Hadoop生态系统非常丰富,除了焦点的HDFS和MapReduce,还包括HBase、ZooKeeper、Hive等众多组件。这些组件和工具一起为处理差别类型的数据集提供了多样化的办理方案。


  • HBase是一个开源的非关系型分布式数据库(NoSQL),它是建立在Hadoop文件系统之上的,用于支持大规模的结构化数据存储。
  • ZooKeeper是一个开源的分布式应用步伐协调服务,提供高性能、同等性等服务,被广泛用于分布式系统中的配置维护、命名服务、分布式同步等场景。
  • Hive是建立在Hadoop之上的数据堆栈工具,它提供了SQL查询语言(HiveQL)来查询存储在Hadoop文件系统中的数据,使得对大数据集的分析工作变得简单方便。
  通过把握Hadoop及其生态系统,开发者和数据工程师可以构建灵活高效的数据处理管道,以应对不停增长的数据处理需求。
1.3 Hadoop的现实应用

  Hadoop已被环球众多企业应用于差别的场景,包括但不限于:


  • 社交网络分析 :用于分析用户行为,预测趋势,并优化用户体验。
  • 金融服务 :用于风险分析、买卖业务记载和欺诈检测。
  • 零售业 :用于客户行为分析、供应链优化和市场趋势分析。
  • 医疗保健 :用于疾病模式识别、患者数据管理和临床试验分析。
  通过Hadoop强大的存储与分析能力,企业能够从海量数据中提取有代价的信息,从而作出更明智的决策。
  本文第一章主要介绍了Hadoop的根本知识,下一章节我们将深入探究Hadoop Distributed File System (HDFS) 的原理与实践,揭示其如何存储和管理大数据的机密面纱。
2. Hadoop Distributed File System (HDFS) 原理与实践

2.1 HDFS的根本架构和组件

2.1.1 HDFS的命名空间与文件系统树

  Hadoop Distributed File System (HDFS) 是一个高度容错性的系统,计划用来部署在廉价硬件上。它提供了高吞吐量的数据访问,非常得当大规模数据集的应用。在HDFS中,命名空间是以传统的文件系统树的情势来构造的,其中每个文件和目录被视作一个节点。
  命名空间的操纵,好比创建、删除和重命名文件和目录,都是由NameNode管理的。NameNode维护了文件系统的元数据,包括文件系统树、文件和目录的属性,以及每个文件对应的块列表。DataNode负责管理存储在节点上的数据。
  一个范例的HDFS文件系统树如下所示:
  1. /
  2. ├── hdfs-site.xml
  3. ├── yarn-site.xml
  4. └── mapred-site.xml
复制代码
在这个结构中,根目录包含一些配置文件,这些配置文件是Hadoop集群运行所必须的。HDFS中的每个文件大概目录都可以通过一个路径名来识别,路径名从根目录开始。
2.1.2 块存储机制与数据冗余战略

  HDFS计划之初就思量到了数据的可靠性与可恢复性,为此采取了数据块(block)的存储机制。HDFS将每个文件切分为一系列的块,每个块被单独存储在DataNode节点上。默认环境下,一个块的大小为128MB,当然这个大小是可以配置的。
  对于每个块,HDFS都会维护多个副本(默以为3个),这些副本被放置在差别的DataNode上。这样即使部分硬件出现故障,数据也不会丢失,因为副本包管了数据的冗余。副本战略可以在HDFS中通过配置项进行调整,以顺应差别的需求和存储环境。
  下面是一个HDFS中文件块存储与冗余的示例:
  1. 文件:/user/hadoop/input.txt
  2. 块大小:128MB
  3. 副本数量:3
  4. DataNode1: 块1
  5. DataNode2: 块1, 块2
  6. DataNode3: 块2, 块3
复制代码
2.2 HDFS的读写操纵原理

2.2.1 客户端对HDFS的读写流程

  HDFS的读写操纵由客户端发起,通过与NameNode和DataNode的交互来完成。在读取文件时,客户端首先从NameNode获取文件的元数据信息,包括文件的块列表以及每个块所在的DataNode位置。然后,客户端直接与DataNode通讯,以流的情势读取所需块的数据。
  对于写入操纵,客户端首先向NameNode请求写入文件,NameNode会返回一个可以写入的DataNode列表。然后客户端将数据流式传输到这些DataNode上。一旦数据写入成功,DataNode会向NameNode确认,并且只有当所有副本都成功写入之后,写入操纵才算完成。
2.2.2 块缓存与读写性能优化

  为了提高HDFS的读写性能,引入了块缓存机制。块缓存可以将经常访问的数据块缓存到内存中,这样可以减少访问数据的耽误。NameNode和DataNode都支持块缓存。
  块缓存的配置可以通过  hdfs-site.xml  文件中的  dfs.datanode.data.dir  配置项来指定哪些目录下的数据块可以被缓存。例如,我们可以在配置文件中设置:
  1. <property>
  2.   <name>dfs.datanode.data.dir</name>
  3.   <value>***</value>
  4.   <description>指定DataNode缓存数据块的目录</description>
  5. </property>
复制代码
当配置块缓存时,需要思量节点的内存容量和现实的读写工作负载,因为缓存会占用宝贵的内存资源。通过HDFS的Admin命令也可以动态地管理块缓存:
  1. hdfs cacheadmin -add /path/to/block
复制代码
2.3 HDFS的高可用性实践

2.3.1 NameNode的高可用配置

  为了实现HDFS的高可用性,可以通过配置多个NameNode节点来实现。在Hadoop 2.x之后的版本中,引入了Quorum Journal Manager(QJM)来支持Active-Standby NameNode的架构。在这种配置下,有一个活动的NameNode负责处理所有的客户端请求,同时有一个或多个备用的NameNode(Standby)与之同步状态,以便在活动节点失败时可以立即接管。
  高可用配置的具体步骤包括配置ZooKeeper、设置Quorum Journal Manager,并且还需要配置  hdfs-site.xml  文件来指定多个NameNode的地址,如下:
  1. <property>
  2.   <name>dfs.nameservices</name>
  3.   <value>mycluster</value>
  4.   <description>集群名称</description>
  5. </property>
  6. <property>
  7.   <name>dfs.ha.namenodes.mycluster</name>
  8.   <value>nn1,nn2</value>
  9.   <description>活动和备用的NameNode名称</description>
  10. </property>
复制代码
2.3.2 故障转移与系统稳定性保障

  故障转移(failover)是实现高可用性(HA)的关键部分。当活动NameNode不可用时,集群会执行故障转移,将备用NameNode提升为新的活动节点。这一过程是由ZooKeeper集群协调的,并且应该在几秒钟内完成,以最小化对客户端的影响。
  HDFS的故障转移可以通过HA命令工具手动触发:
  1. hdfs haadmin -failover [-forcestart] [-forcestop] [- здоровая ] [-手动 ] [[- 正常 ] | [- 运行 ]] [-非 ] [- 启用 ] [[- 跳过 ] | [-重试 <次数>]] [-手动 ] [-完成 ]
复制代码
这里是一个简化的故障转移流程图:
  1. graph LR
  2. A[检测到NameNode故障] --> B[启动故障转移]
  3. B --> C[检查集群状态]
  4. C --> D[确定新的活动NameNode]
  5. D --> E[更新集群配置]
  6. E --> F[通知ZooKeeper]
  7. F --> G[切换客户端连接]
  8. G --> H[故障转移完成]
复制代码
通过这种机制,即使在部分节点失效的环境下,HDFS也能够保持数据的可用性和访问性,确保了整个集群的稳定性。
3. MapReduce数据处理模子及并行盘算

3.1 MapReduce步伐计划根本

3.1.1 Map和Reduce函数的编写

  MapReduce是一个编程模子,用于处理大规模数据集的并行运算。它由两部分构成:Map和Reduce。Map阶段处理输入数据,产生中间键值对集合;Reduce阶段则对中间数据进行合并处理。
  Map函数的编写需要用户定义一个实现特定接口的方法,该方法会担当一系列的键值对作为输入,并输出中间键值对集合。Map函数的输出会颠末排序后传递给Reduce函数。
  Reduce函数同样需要用户定义一个实现特定接口的方法,其担当的输入是中间键值对集合,通常会进行进一步的数据聚合处理,好比求和、计数、均匀值盘算等,并最终输出结果。
  下面是一个简单的MapReduce示例,展示了如何编写Map和Reduce函数:
  1. public class WordCount {
  2.     public static class TokenizerMapper
  3.        extends Mapper<Object, Text, Text, IntWritable>{
  4.        private final static IntWritable one = new IntWritable(1);
  5.        private Text word = new Text();
  6.        public void map(Object key, Text value, Context context
  7.                        ) throws IOException, InterruptedException {
  8.          StringTokenizer itr = new StringTokenizer(value.toString());
  9.          while (itr.hasMoreTokens()) {
  10.            word.set(itr.nextToken());
  11.            context.write(word, one);
  12.          }
  13.        }
  14.      }
  15.      public static class IntSumReducer
  16.        extends Reducer<Text,IntWritable,Text,IntWritable> {
  17.        private IntWritable result = new IntWritable();
  18.        public void reduce(Text key, Iterable<IntWritable> values,
  19.                           Context context
  20.                           ) throws IOException, InterruptedException {
  21.          int sum = 0;
  22.          for (IntWritable val : values) {
  23.            sum += val.get();
  24.          }
  25.          result.set(sum);
  26.          context.write(key, result);
  27.        }
  28.      }
  29. }
复制代码
在上述代码中,  TokenizerMapper  类实现了Map函数,将文本行拆分为单词,每个单词计为1。  IntSumReducer  类实现了Reduce函数,将雷同单词的计数合并并输出最闭幕果。
3.1.2 分区与排序过程分析

  在MapReduce模子中,分区(Partitioning)是将Map任务输出的中间键值对匀称分配给各个Reduce任务的过程。这通常是为了确保每个Reduce任务都有等量的工作量,提高整体的并行处理效率。
  分区的主要作用包括: - 数据匀称分配:确保每个Reducer处理的记载大致雷同,防止负载不均衡导致的性能瓶颈。 - 数据局部性:对于Hadoop集群,将数据分配到相近的节点可以减少网络传输,提高处理效率。
  MapReduce框架默认使用哈希分区,它将所有中间键值对按键的哈希值与Reducer数目取模运算后进行分配。用户也可以自定义分区战略以满足特定的需求。
  排序(Sorting)过程发生在Map输出和Reduce输入之间,即在数据传递给Reduce函数之前,MapReduce会按照键(key)对中间数据进行排序。排序是必须的,因为它能包管具有雷同键的所有值都会被传递给同一个Reducer。
  排序过程通常分为两步: 1. 首先对Map输出的键值对进行局部排序,这是在Map节点上完成的。 2. 然后,Map任务会将排序后的数据发送到Reduce任务,Reduce任务吸收数据后,还会进行全局排序。
  排序过程对提高处理效率非常关键,尤其是在需要对大量键值对进行聚合操纵的场景中。
  分区和排序是MapReduce计划的关键部分,明白它们的工作原理对于编写高效的数据处理任务至关重要。
4. NameNode和DataNode的角色与功能

4.1 NameNode的管理与监控

4.1.1 元数据管理与内存使用

  Hadoop集群的HDFS由一个NameNode负责管理文件系统的命名空间,以及客户端对文件的访问。NameNode是HDFS的焦点组件,其元数据的管理直接关系到整个集群的性能和稳定性。NameNode需要维护的元数据包括文件系统的目录树、文件和目录的属性,以及文件与数据块(block)的映射关系。
  由于所有元数据都保存在NameNode的内存中,这使得NameNode的内存使用成为性能的瓶颈。一旦内存耗尽,NameNode无法容纳更多的元数据,将导致系统无法写入新的文件大概无法扩展文件系统。因此,合理配置和管理内存,是包管NameNode正常工作的关键。
  在Hadoop 2.x版本中,引入了HDFS联邦(Federation)的概念,允许多个NameNode共享一个物理集群,使得可以水平扩展命名空间的容量,也减轻了单个NameNode的压力。
代码示例:

  1. <!-- Hadoop配置文件中的NameNode内存设置 -->
  2. <property>
  3.     <name>dfs.namenode.handler.count</name>
  4.     <value>20</value>
  5. </property>
复制代码
参数说明:  dfs.namenode.handler.count  控制了NameNode上处理客户端请求的线程数。增加这个值可以提高NameNode处理请求的能力,但是也要思量到服务器的现实内存容量。
  逻辑分析:这个配置项直接影响到NameNode能同时处理多少客户端请求。默认值通常较低,但根据集群的使用环境,这个值可能需要调整以提高性能,尤其是在集群中的客户端数目较多时。
4.1.2 命令行工具与状态检查

  Hadoop提供了多种命令行工具,例如  hdfs dfsadmin  和  hdfs fsck  ,用于对HDFS的NameNode进行状态检查和维护。这些工具可以用来检察文件系统的健康状态、检查磁盘空间使用环境、启动和停止NameNode以及执行文件系统的完备性检查。
  例如,使用  hdfs fsck  工具可以检查文件系统的完备性,该命令能够陈诉文件系统中所有的错误,并实行修复一些问题。其根本用法如下:
  1. hdfs fsck / -files -blocks -locations
复制代码
参数说明:命令中的  /  代表HDFS的根目录,  -files  表示显示检查的文件列表,  -blocks  显示文件的块列表,  -locations  显示块所在的DataNode。
  逻辑分析:当对HDFS的健康状态产生疑问时,  hdfs fsck  是一个非常有效的诊断工具。它能够具体地陈诉文件系统中每个文件的状态,帮助管理员发现和处理潜在的问题。
4.2 DataNode的数据存储与管理

4.2.1 数据块的复制与恢复机制

  DataNode是HDFS中存储数据块的节点,负责管理节点上的数据块存储和读写。HDFS将大文件切分成固定大小的数据块,默认环境下是128MB,然后分别存储在多个DataNode上。DataNode之间相互独立,并且定期向NameNode发送心跳信号和块陈诉,表明自己是活跃状态。
  HDFS的数据复制机制保障了数据的可靠性。当一个数据块被创建时,它默认会被复制3份,分别保存在集群中的差别DataNode上。如果某个DataNode失效,NameNode会自动将该数据块的副本来重新复制到其他健康节点上,以包管数据的副本数符合要求。
代码示例:

  1. // DataNode中处理数据块复制的部分伪代码
  2. void replicateBlocks(Block block, int replicationFactor) {
  3.     List<DatanodeDescriptor> availableNodes = getAvailableNodes();
  4.     for (int i = 0; i < replicationFactor; ++i) {
  5.         DatanodeDescriptor node = selectNode(availableNodes);
  6.         if (node != null) {
  7.             sendBlock(block, node);
  8.             availableNodes.remove(node);
  9.         }
  10.     }
  11. }
复制代码
参数说明:  replicationFactor  表示需要复制的数据块的数目,默以为3。
  逻辑分析:上述代码是一个简单的数据块复制过程的伪代码。它展示了DataNode在吸收到数据块复制请求时,如何从可用的DataNode列表中选择节点,然后发送数据块。这个过程由DataNode自动完成,而NameNode负责监控和调度。
4.2.2 磁盘故障的处理与数据平衡

  磁盘故障是分布式存储系统中的常见问题,HDFS通过定期的自我检查和故障数据块的自动复制,来应对可能出现的磁盘故障。当DataNode检测到自身磁盘故障时,它会自动将数据块复制到其他健康的DataNode上。
  数据平衡是HDFS中一个重要的概念,它确保了集群中的数据分布均衡。由于硬件故障或其他因素导致数据在集群中分布不均,可能会出现某些节点负载过重,而另一些节点负载过轻的环境。NameNode通过周期性的数据平衡操纵,重新分配数据块,以避免数据倾斜和热点问题。
代码示例:

  1. hdfs diskbalancer -plan <datanode_host>
复制代码
逻辑分析:  diskbalancer  是Hadoop 2.7及以上版本引入的用于集群数据平衡的工具。它通过生成一个平衡计划,指示DataNode如何移动数据块来到达平衡状态。上例中的命令用于为指定的DataNode生成平衡计划。
4.3 NameNode与DataNode的交互

4.3.1 通讯协议与数据流

  NameNode与DataNode之间通过长途过程调用(RPC)通讯协议进行交互。这种交互主要涉及数据块的读写请求、心跳信号和数据块陈诉等。NameNode需要处理来自DataNode的心跳和块陈诉消息,这些信息包含了DataNode的健康状态和存储能力。
  由于HDFS是面向高吞吐量计划的,因此NameNode与DataNode之间的数据流需要高效。HDFS通过流式读写操纵优化了数据传输效率。例如,客户端直接从DataNode读取数据,而不是通过NameNode中转,从而减少了NameNode的负载。
mermaid流程图示例:

  1. graph LR
  2. A[客户端] -->|写请求| B[NameNode]
  3. B -->|数据块位置| C[DataNode1]
  4. B -->|数据块位置| D[DataNode2]
  5. C -->|传输数据| A
  6. D -->|传输数据| A
复制代码
逻辑分析:上述流程图展示了客户端向HDFS写入数据时,NameNode与DataNode之间的交互过程。客户端首先发送写请求到NameNode,NameNode返回数据块的位置给客户端,然后客户端直接将数据传输给指定的DataNode,实现并行写操纵。
4.3.2 心跳检测与资源陈诉

  心跳检测是Hadoop集群保持健康运行的关键机制之一。DataNode定期向NameNode发送心跳信号,以表明自身处于正常工作状态。如果NameNode在一定时间内没有收到某个DataNode的心跳,它将以为该节点失效,并触发数据副本的复制过程。
  资源陈诉是心跳信号的一部分,DataNode通过心跳向NameNode陈诉当前节点的资源使用环境,如存储空间和数据块信息。NameNode使用这些信息来决定是否需要调整数据块的副本分布。
代码示例:

  1. // DataNode心跳信号的发送伪代码
  2. void sendHeartbeat() {
  3.     NodeReport report = createNodeReport();
  4.     NamenodeProtocol protocol = getNamenodeProtocol();
  5.     protocol.sendHeartbeat(report);
  6. }
复制代码
参数说明:  NodeReport  包含了DataNode当前的资源使用环境,  NamenodeProtocol  是DataNode与NameNode通讯的协议接口。
  逻辑分析:上述代码展示了DataNode发送心跳信号的简化过程。DataNode定期创建资源陈诉,并通过  NamenodeProtocol  发送心跳信号到NameNode。这些信息帮助NameNode监控DataNode的健康状态和集群的资源使用环境。
  通过上述章节内容的介绍,我们已经对Hadoop中NameNode和DataNode的根本功能、交互方式以及如何监控和管理有了深入的明白。这些知识点对于包管Hadoop集群的稳定运行和优化存储性能至关重要。在接下来的内容中,我们将进一步探究Hadoop集群的安装、配置、优化和故障排查本领,从而为读者提供一套完备的Hadoop运维知识体系。
5. Hadoop集群安装、配置、优化和故障排查本领

5.1 Hadoop集群的安装步骤

  Hadoop集群的安装通常包括环境预备、软件安装、配置集群以及验证安装等步骤。在此过程中,每个步骤都需要仔细思量,以确保集群的稳定性与高效性。
5.1.1 环境预备与软件安装

  在安装Hadoop集群之前,需要预备一个合适的操纵系统环境。通常推荐使用Linux系统,尤其是基于RPM的发行版如CentOS或基于Debian的系统如Ubuntu。安装前需要安装Java运行环境,并验证Java版本和路径设置。Hadoop对Java版本有特定要求,所以发起安装与Hadoop版本兼容的JDK版本。
  接下来,需要下载Hadoop的安装包,并解压到指定目录。可以通过以下命令来下载和解压Hadoop:
  1. wget ***<version>/hadoop-<version>.tar.gz
  2. tar -xzvf hadoop-<version>.tar.gz
  3. mv hadoop-<version> /usr/local/hadoop
复制代码
更换  <version>  为现实的Hadoop版本号。
5.1.2 集群配置文件详解

  安装完成后,配置文件是集群运行的关键。Hadoop有多个重要的配置文件,通常位于Hadoop安装目录下的  etc/hadoop  文件夹中。这些文件包括  core-site.xml  、  hdfs-site.xml  、  mapred-site.xml  、  yarn-site.xml  等。以下是一些关键配置的简要说明:


  •   core-site.xml  : 定义了Hadoop的fs.defaultFS(默认文件系统),以及其他的Hadoop焦点属性。
  •   hdfs-site.xml  : 配置了HDFS的副本数、路径、权限等。
  •   mapred-site.xml  : 定义了MapReduce作业的提交环境、执行环境等。
  •   yarn-site.xml  : 配置了YARN资源管理器和节点管理器的相关参数。
  配置文件中每个参数的设置需要根据现实集群规模和业务需求来定制。
5.2 Hadoop集群性能优化

  优化Hadoop集群的性能是提升大数据处理能力的重要步骤。优化通常涉及调整JVM参数、系统参数、网络和I/O子系统等多个方面。
5.2.1 调整JVM参数与系统参数

  JVM参数直接影响Hadoop进程的内存使用和垃圾采取,对于性能调优至关重要。通过调整  HADOOP_OPTS  环境变量,可以设置合适的堆大小  -Xmx  和  -Xms  ,以及其他相关参数以优化内存使用。例如:
  1. export HADOOP_OPTS="-Xmx4g -Xms4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
复制代码
系统参数优化涉及修改Linux内核参数,好比文件形貌符限制  ulimit -n  ,网络栈参数如  net.core.rmem_max  和  net.core.wmem_max  等。
5.2.2 网络与I/O优化

  网络I/O是集群性能瓶颈的常见因素。优化网络主要关注减少网络拥塞、提高数据传输效率等。可以调整心跳间隔和数据传输超时设置,以优化HDFS和YARN的通讯效率。I/O性能优化可能需要思量磁盘类型、RAID配置和文件系统类型等因素,以提升数据读写效率。
5.3 Hadoop集群的故障排查

  故障排查是Hadoop集群管理中的一项重要工作。通过日志分析和系统监控,可以快速定位问题,并采取相应的办理措施。
5.3.1 常见问题与办理方案

  在现实操纵中,可能会碰到各种问题,好比节点宕机、作业失败等。针对这些问题,需要相识常规的排查方法和办理方案,如检查硬件故障、网络问题、配置错误等。
5.3.2 日志分析与系统监控本领

  日志分析是故障排查中的焦点步骤。Hadoop的日志文件包括各种组件的运行日志,如HDFS、YARN、MapReduce等。可以通过命令行工具检察日志内容,大概使用第三方工具如Kafka、Flume等进行实时日志收集和分析。
  系统监控则需要依靠各种监控工具,如Ganglia、Nagios、Prometheus等,实时监控集群的健康状态、资源使用率等关键指标。通过图表和报警机制,可以实现对集群的全天候监控。
  以上就是Hadoop集群安装、配置、优化和故障排查的相关内容。后续章节将会更加深入地探究如何进行大数据分析和呆板学习的实践。
   本文还有配套的精品资源,点击获取  

  简介:Hadoop是一个开源的分布式盘算框架,专为处理和存储大数据计划。本资源包“hadoop.zip”提供了一系列Hadoop焦点组件和相关资源,包括HDFS和MapReduce,以及源代码、构建脚本、配置文件、文档和测试用例等。通过把握这些内容,用户可以深入相识Hadoop的工作原理并进行当地开发和测试。别的,还包括Hadoop生态系统中的其他工具和服务,以及安装、配置、优化和故障排查的实用技能。
   本文还有配套的精品资源,点击获取  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表