Hadoop HA高可用集群3.3.6搭建(详细教程)

打印 上一主题 下一主题

主题 863|帖子 863|积分 2589

前置环境
(1)下载:https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
(2)安装ZK Linux环境Zookeeper集群安装(详细教程)-CSDN博客
(3)确保SSH互通Centos集群一键免密登陆xssh脚本
  
部署规划





1.第一台呆板上传解压hadoop安装包


  1. # 1.解压到指定路径
  2. wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
  3. tar -zxvf /opt/apk/hadoop-3.3.6.tar.gz -C /opt/
  4. # 创建软链接
  5. ln -s /opt/hadoop-3.3.6 /opt/apps/hadoop
  6. # 2.配置环境变量
  7. vi /etc/profile.d/my_env.sh
  8. # 在末尾添加
  9. # HADOOP_HOME
  10. export HADOOP_HOME=/opt/apps/hadoop
  11. export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  12. # 3.使修改后的文件生效
  13. source /etc/profile
  14. # 4.测试Hadoop是否安装成功
  15. hadoop version
复制代码
2.目次准备

   在bigdata01创建好,后面会分发给各个节点
像data1、data2...,本地目次可以配置多个,且每个目次存放内容雷同,增长了可靠性,并没有真正提高高可用性
 
  1. # 创建目录结构
  2. mkdir -p /opt/apps/hadoop/data1/tmp
  3. mkdir -p /opt/apps/hadoop/data2/tmp
  4. mkdir -p /opt/apps/hadoop/data1/data/journalnode
  5. mkdir -p /opt/apps/hadoop/data1/data/namenode
  6. mkdir -p /opt/apps/hadoop/data2/data/namenode
  7. mkdir -p /opt/apps/hadoop/data1/data/datanode
  8. mkdir -p /opt/apps/hadoop/data2/data/datanode
  9. # 创建目录的所属用户组和用户
  10. groupadd hadoop
  11. useradd -m -g hadoop hadoop
  12. # 更改hadoop目录的所有权
  13. chown -R hadoop:hadoop /opt/hadoop-3.3.6
  14. chmod -R 755 /opt/apps/hadoop/data1/
  15. chmod -R 755 /opt/apps/hadoop/data2/
复制代码

3.集群配置


cd /opt/apps/hadoop/etc/hadoop
vi hadoop-env.sh
  1. # 追加内容,日志路径配置修改该文件
  2. export JAVA_HOME=/opt/apps/java
  3. export HDFS_NAMENODE_USER=root
  4. export HDFS_DATANODE_USER=root
  5. export HDFS_SECONDARYNAMENODE_USER=root
  6. export HDFS_ZKFC_USER=root
  7. export HDFS_JOURNALNODE_USER=root
  8. export YARN_RESOURCEMANAGER_USER=root
  9. export YARN_NODEMANAGER_USER=root
复制代码
下列配置,在<configuration>与</configuration>之间添加内容:
vi core-site.xml
  1.     <!-- 指定HDFS的通信地址 -->
  2.     <property>
  3.         <name>fs.defaultFS</name>
  4.         <value>hdfs://ns1</value>
  5.     </property>
  6.     <!-- 指定Hadoop临时数据的存储目录 -->
  7.     <property>
  8.         <name>hadoop.tmp.dir</name>
  9.         <value>/opt/apps/hadoop/data1/tmp,/opt/apps/hadoop/data2/tmp</value>
  10.     </property>
  11.     <!-- 指定Hadoop日志的存储目录 -->
  12.     <property>
  13.         <name>hadoop.log.dir</name>
  14.         <value>/opt/apps/hadoop/data2/log/hadoop</value>
  15.     </property>
  16.     <!-- 配置ZooKeeper集群的地址列表,用于Hadoop高可用性(HA) -->
  17.     <property>
  18.         <name>ha.zookeeper.quorum</name>
  19.         <value>bigdata01:2181,bigdata02:2181,bigdata03:2181</value>
  20.     </property>
  21.     <!-- 设置访问Hadoop Web界面时使用的静态用户名 -->
  22.     <property>
  23.         <name>hadoop.http.staticuser.user</name>
  24.         <value>root</value>
  25.     </property>
  26.     <!-- 允许root用户代理任何主机上的请求,指定了哪些主机可以作为代理用户来提交作业 -->
  27.     <property>
  28.         <name>hadoop.proxyuser.root.hosts</name>
  29.         <value>*</value>
  30.     </property>
  31.     <!-- 允许root用户代理任何组的用户 -->
  32.     <property>
  33.         <name>hadoop.proxyuser.root.groups</name>
  34.         <value>*</value>
  35.     </property>
复制代码
vi hdfs-site.xml
  1.     <!-- 设置HDFS的副本数 -->
  2.     <property>
  3.         <name>dfs.replication</name>
  4.         <value>3</value>
  5.     </property>
  6.     <!-- NameNode的元数据存储目录 -->
  7.     <property>
  8.         <name>dfs.namenode.name.dir</name>
  9.         <value>/opt/apps/hadoop/data1/data/namenode,/opt/apps/hadoop/data2/data/namenode</value>
  10.     </property>
  11.     <!-- DataNode的数据存储目录 -->
  12.     <property>
  13.         <name>dfs.datanode.data.dir</name>
  14.         <value>/opt/apps/hadoop/data1/data/datanode,/opt/apps/hadoop/data2/data/datanode</value>
  15.     </property>
  16.     <!-- 设置命名服务的名称,在 HDFS 中,nameservices 是一个逻辑名称,用于标识一组 NameNode 实例。它允许客户端和其他 HDFS 组件通过一个统一的名称来访问多个 NameNode,从而实现高可用性。 -->
  17.     <property>
  18.         <name>dfs.nameservices</name>
  19.         <value>ns1</value>
  20.     </property>
  21.     <!-- 配置高可用性NameNode -->
  22.     <property>
  23.         <name>dfs.ha.namenodes.ns1</name>
  24.         <value>nn1,nn2</value>
  25.     </property>
  26.     <!-- NameNode nn1 的 RPC 地址,默认值9000 -->
  27.     <property>
  28.         <name>dfs.namenode.rpc-address.ns1.nn1</name>
  29.         <value>bigdata01:8020</value>
  30.     </property>
  31.     <!-- NameNode nn1 的 HTTP 地址 -->
  32.     <property>
  33.         <name>dfs.namenode.http-address.ns1.nn1</name>
  34.         <value>bigdata01:9870</value>
  35.     </property>
  36.     <!-- NameNode nn2 的 RPC 地址 -->
  37.     <property>
  38.         <name>dfs.namenode.rpc-address.ns1.nn2</name>
  39.         <value>bigdata02:8020</value>
  40.     </property>
  41.     <!-- NameNode nn2 的 HTTP 地址 -->
  42.     <property>
  43.         <name>dfs.namenode.http-address.ns1.nn2</name>
  44.         <value>bigdata02:9870</value>
  45.     </property>
  46.     <!-- 共享edits日志的目录,在 HA 配置中,多个 NameNode 需要访问同一组edits日志,以确保它们之间的数据一致性。 -->
  47.     <!-- qjournal 是一种用于存储edits日志的机制。它允许多个 NameNode 通过一个共享的、可靠的日志系统来记录对文件系统的修改。qjournal 由多个 JournalNode 组成,这些 JournalNode 负责接收和存储来自 NameNode 的编辑日志。 -->
  48.     <property>
  49.         <name>dfs.namenode.shared.edits.dir</name>
  50.         <value>qjournal://bigdata01:8485;bigdata02:8485;bigdata03:8485/ns1</value>
  51.     </property>
  52.     <!-- JournalNode的edits日志存储目录,不支持多目录 -->
  53.     <property>
  54.         <name>dfs.journalnode.edits.dir</name>
  55.         <value>/opt/apps/hadoop/data1/data/journalnode</value>
  56.     </property>
  57.     <!-- 启用自动故障转移 -->
  58.     <property>
  59.         <name>dfs.ha.automatic-failover.enabled</name>
  60.         <value>true</value>
  61.     </property>
  62.     <!-- 配置客户端故障转移代理提供者 -->
  63.     <property>
  64.         <name>dfs.client.failover.proxy.provider.ns1</name>
  65.         <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  66.     </property>
  67.     <!-- 禁用权限检查 -->
  68.     <property>
  69.         <name>dfs.permissions.enable</name>
  70.         <value>false</value>
  71.     </property>
  72.     <!-- 配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可,否则sshfence(host:port)  -->
  73.     <property>
  74.         <name>dfs.ha.fencing.methods</name>
  75.         <value>sshfence</value>
  76.         <value>shell(/bin/true)</value>
  77.     </property>
  78.     <!-- SSH围栏使用的私钥文件 -->
  79.     <property>
  80.         <name>dfs.ha.fencing.ssh.private-key-files</name>
  81.         <value>/root/.ssh/id_rsa</value>
  82.     </property>
  83.     <property>
  84.         <name>dfs.ha.nn.not-become-active-in-safemode</name>
  85.         <value>true</value>
  86.     </property>
  87.     <!-- SSH连接超时时间 -->
  88.     <property>
  89.         <name>dfs.ha.fencing.ssh.connect-timeout</name>
  90.         <value>30000</value>
  91.     </property>
复制代码
vi yarn-site.xml
  1.     <!-- 启用YARN ResourceManager的高可用性(HA) -->
  2.     <property>
  3.         <name>yarn.resourcemanager.ha.enabled</name>
  4.         <value>true</value>
  5.     </property>
  6.     <!-- 设置YARN集群的唯一标识符,自定义YARN高可用集群的标识符 -->
  7.     <property>
  8.         <name>yarn.resourcemanager.cluster-id</name>
  9.         <value>yarn-ha</value>
  10.     </property>
  11.     <!-- 列出所有ResourceManager实例的ID,指定YARN高可用集群中每个ResourceManager的唯一标识符 -->
  12.     <property>
  13.         <name>yarn.resourcemanager.ha.rm-ids</name>
  14.         <value>rm1,rm2</value>
  15.     </property>
  16.     <!-- 指定第一个ResourceManager实例(rm1)的主机名 -->
  17.     <property>
  18.         <name>yarn.resourcemanager.hostname.rm1</name>
  19.         <value>bigdata01</value>
  20.     </property>
  21.     <!-- 指定第二个ResourceManager实例(rm2)的主机名 -->
  22.     <property>
  23.         <name>yarn.resourcemanager.hostname.rm2</name>
  24.         <value>bigdata02</value>
  25.     </property>
  26.     <!-- 指定ZooKeeper服务器地址,用于存储ResourceManager的状态信息 -->
  27.     <property>
  28.         <name>yarn.resourcemanager.zk-address</name>
  29.         <value>bigdata01:2181,bigdata02:2181,bigdata03:2181</value>
  30.     </property>
  31.     <!-- 配置NodeManager上的辅助服务,这里设置为MapReduce shuffle服务 -->
  32.     <property>
  33.         <name>yarn.nodemanager.aux-services</name>
  34.         <value>mapreduce_shuffle</value>
  35.     </property>
  36.     <!-- 启用日志聚合功能,将容器日志收集到HDFS中 -->
  37.     <property>
  38.         <name>yarn.log-aggregation-enable</name>
  39.         <value>true</value>
  40.     </property>
  41.     <!-- 设置日志聚集服务器地址 -->
  42.     <property>  
  43.         <name>yarn.log.server.url</name>  
  44.         <value>http://bigdata01:19888/jobhistory/logs</value>
  45.     </property>
  46.     <!-- 设置日志保留时间(秒),这里是1天 -->
  47.     <property>
  48.         <name>yarn.log-aggregation.retain-seconds</name>
  49.         <value>86400</value>
  50.     </property>
  51.     <!-- 启用ResourceManager的恢复功能 -->
  52.     <property>
  53.         <name>yarn.resourcemanager.recovery.enabled</name>
  54.         <value>true</value>
  55.     </property>
  56.     <!-- 指定ResourceManager状态存储的实现类,这里使用ZooKeeper作为存储 -->
  57.     <property>
  58.         <name>yarn.resourcemanager.store.class</name>
  59.         <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  60.     </property>
  61.     <!-- 指定第一个ResourceManager实例(rm1)Web应用程序的地址 -->
  62.     <property>
  63.         <name>yarn.resourcemanager.webapp.address.rm1</name>
  64.         <value>bigdata01:8088</value>
  65.     </property>
  66.     <!-- 指定第一个ResourceManager实例(rm1)调度器的地址 -->
  67.     <property>
  68.         <name>yarn.resourcemanager.scheduler.address.rm1</name>
  69.         <value>bigdata01:8030</value>
  70.     </property>
  71.     <!-- 指定第一个ResourceManager 对NodeManager暴露的地址。NodeManager通过该地址向RM汇报心跳,领取任务等。 -->
  72.     <property>
  73.         <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
  74.         <value>bigdata01:8031</value>
  75.     </property>
  76.     <property>
  77.          <name>yarn.resourcemanager.address.rm1</name>
  78.          <value>bigdata01:8032</value>
  79.     </property>
  80.     <property>
  81.          <name>yarn.resourcemanager.admin.address.rm1</name>
  82.          <value>bigdata01:8033</value>
  83.     </property>
  84.     <!-- 指定第二个ResourceManager实例(rm2)Web应用程序的地址 -->
  85.     <property>
  86.         <name>yarn.resourcemanager.webapp.address.rm2</name>
  87.         <value>bigdata02:8088</value>
  88.     </property>
  89.     <!-- 指定第二个ResourceManager实例(rm2)调度器的地址 -->
  90.     <property>
  91.         <name>yarn.resourcemanager.scheduler.address.rm2</name>
  92.         <value>bigdata02:8030</value>
  93.     </property>
  94.     <!-- 指定第二个ResourceManager 对NodeManager暴露的地址。NodeManager通过该地址向RM汇报心跳,领取任务等。 -->
  95.     <property>
  96.         <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
  97.         <value>bigdata02:8031</value>
  98.     </property>
  99.     <property>
  100.          <name>yarn.resourcemanager.address.rm2</name>
  101.          <value>bigdata02:8032</value>
  102.     </property>
  103.     <property>
  104.          <name>yarn.resourcemanager.admin.address.rm2</name>
  105.          <value>bigdata02:8033</value>
  106.     </property>
  107.     <!--环境变量通过从NodeManagers的容器继承的环境属性,对于MapReduce应用程序,除了 默认值 hadoop op_mapred_home 应被加入 外,还有如下属性值:-->
  108.      <property>
  109.          <name>yarn.nodemanager.env-whitelist</name>
  110.          <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
  111.      </property>
复制代码
vi mapred-site.xml
  1.     <!-- 指定MapReduce框架使用的资源管理器名称,这里设置为YARN -->
  2.     <property>
  3.         <name>mapreduce.framework.name</name>
  4.         <value>yarn</value>
  5.     </property>
  6.     <!-- 设置MapReduce JobHistory服务的地址,用于存储已完成作业的历史信息 -->
  7.     <property>
  8.         <name>mapreduce.jobhistory.address</name>
  9.         <value>bigdata01:10020</value>
  10.     </property>
  11.     <!-- 设置MapReduce JobHistory Web应用程序的地址,可以通过浏览器访问来查看作业历史记录 -->
  12.     <property>
  13.         <name>mapreduce.jobhistory.webapp.address</name>
  14.         <value>bigdata01:19888</value>
  15.     </property>
  16.     <!-- 为MapReduce Application Master设置环境变量,指定HADOOP_MAPRED_HOME路径 -->
  17.     <property>
  18.         <name>yarn.app.mapreduce.am.env</name>
  19.         <value>HADOOP_MAPRED_HOME=\${HADOOP_HOME}</value>
  20.     </property>
  21.     <!-- 为Map任务设置环境变量,指定HADOOP_MAPRED_HOME路径 -->
  22.     <property>
  23.         <name>mapreduce.map.env</name>
  24.         <value>HADOOP_MAPRED_HOME=\${HADOOP_HOME}</value>
  25.     </property>
  26.     <!-- 为Reduce任务设置环境变量,指定HADOOP_MAPRED_HOME路径 -->
  27.     <property>
  28.         <name>mapreduce.reduce.env</name>
  29.         <value>HADOOP_MAPRED_HOME=\${HADOOP_HOME}</value>
  30.     </property>
复制代码
vi workers
  1. bigdata01
  2. bigdata02
  3. bigdata03
复制代码

4.分发文件到其他集群


  1. [root@bigdata01 opt]# xsync -i "bigdata02 bigdata03" /opt/hadoop-3.3.6/
  2. [root@bigdata01 opt]# xsync -i "bigdata02 bigdata03" /opt/apps/hadoop
  3. [root@bigdata01 opt]# xsync -i "bigdata02 bigdata03" /etc/profile
  4. [root@bigdata01 opt]# xcall -i "bigdata02 bigdata03" source /etc/profile
复制代码

5.启动Hadoop集群



5.1启动Zookeeper集群


  1. [root@bigdata01 hadoop]# zkCluster start
复制代码

5.2启动JournalNode


   
在格式化 Hadoop 高可用集群的 HDFS 文件系统时,系统会向 Quorum Journal Manager 写入 EditLog。在首次启动之前,需要在虚拟机 bigdata01、bigdata02 和 bigdata03 上分别执行以下下令以启动 JournalNode
  1. [root@bigdata01 hadoop]# xcall -i "bigdata01 bigdata02 bigdata03" hdfs --daemon start journalnode
复制代码
 

5.3格式化HDFS(Hadoop分布式文件系统)

   
在虚拟机bigdata01执行如下下令格式化Hadoop分布式文件系统HDFS
  1. [root@bigdata01 hadoop]# hdfs namenode -format
复制代码
 重新格式化NameNode步调


  1. # 1.先停止集群的进程
  2. stop-all.sh
  3. # 1.删除所有的数据目录
  4. xcall "rm -rf /opt/apps/hadoop/data1"
  5. xcall "rm -rf /opt/apps/hadoop/data2"
  6. xcall "rm -rf /opt/apps/hadoop/logs"
  7. # 2.重新开始第五节启动集群步骤
复制代码

5.4FSImage文件同步


   
为了确保HDFS初次启动时两个NameNode节点上的FSImage文件保持划一,在虚拟机bigdata01上完成HDFS格式化后(此操作仅初始化虚拟机bigdata01的NameNode并天生FSImage文件),需要将天生的FSImage文件从bigdata01复制到bigdata02对应的目次中。
  1. xsync -i "bigdata02" /opt/apps/hadoop/data1/data/namenode
  2. xsync -i "bigdata02" /opt/apps/hadoop/data2/data/namenode
复制代码


5.5.格式化ZKFC


   
ZKFC(ZooKeeper Failover Controller)是Hadoop高可用性(HA)架构中的一个关键组件,重要用于NameNode的故障转移管理。在HDFS HA配置中,通常会部署两个NameNode节点来提供服务冗余,其中一个处于Active状态负责处理客户端请求,另一个则处于Standby状态作为备份。ZKFC的作用就是在主NameNode发生故障时主动切换到备用NameNode,从而保证系统的连续性和数据的划一性。
在虚拟机bigdata01执行如下下令格式化ZKFC
  1. [root@bigdata01 logs]# hdfs zkfc -formatZK
复制代码

5.6.集群启动


  1. [root@bigdata01 hadoop]# start-all.sh     # 关闭命令stop-all.sh,QuorumPeerMain是zk的集群的启动类,需要执行zkCluster stop
复制代码

六、问题排查

   直接进入日记目次 cd $HADOOP_HOME/logs ,可以看到节点的启动log文件举行排查
  

  6.1Hadoop运行一段时间,NodeManager挂掉

检察hadoop-root-nodemanager-bigdata01.log如下图所示:

缘故原由:
(1)异常缘故原由为zookeeper的版本不适配,将zookeeper-3.4.6升级到apache-zookeeper-3.8.2-bin,此处问题解决。
(2)ResourceManager 对NodeManager暴露的地址.。NodeManager通过该地址向RM汇报心跳,领取任务等,默认与 0.0.0.0:8031举行通信。需要指定yarn-site.xml 增长如下设置
  1.     <!-- 指定第一个ResourceManager 对NodeManager暴露的地址。NodeManager通过该地址向RM汇报心跳,领取任务等。 -->
  2.     <property>
  3.         <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
  4.         <value>bigdata01:8031</value>
  5.     </property>
  6.     <!-- 指定第二个ResourceManager 对NodeManager暴露的地址。NodeManager通过该地址向RM汇报心跳,领取任务等。 -->
  7.     <property>
  8.         <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
  9.         <value>bigdata02:8031</value>
  10.     </property>
复制代码

6.2高可用节点默认指向节点2



可以把yarn-site.xml中rm1,rm2顺序,改成rm2,rm1,如下:
  1. <property>
  2.         <name>yarn.resourcemanager.ha.rm-ids</name>
  3.         <value>rm2,rm1</value>
  4.  </property>
复制代码

七、服务访问(需在访问主机添加hosts剖析)



7.1 检察yarn集群中的master节点


  1. # 查看所有节点活动状态
  2. [root@bigdata01 logs]# yarn rmadmin -getAllServiceState
  3. bigdata01:8033                                     standby   
  4. bigdata02:8033                                     active    
  5. # 查看提交应用程序的列表
  6. [root@bigdata01 logs]# yarn application -list
  7. 2025-01-06 10:22:06,267 INFO client.ConfiguredRMFailoverProxyProvider: Failing over to rm2
  8. Total number of applications (application-types: [], states: [SUBMITTED, ACCEPTED, RUNNING] and tags: []):0
  9.                 Application-Id      Application-Name        Application-Type          User           Queue                   State             Final-State             Progress                        Tracking-URL
  10. # 关闭bigdata02的yarn进程,自动切换活动节点
  11. [root@bigdata02 ~]# yarn --daemon stop resourcemanager
复制代码
7.2访问resourcemanager(高可用)

   http://bigdata01:8088/cluster

  7.3访问节点namenode

   http://192.168.26.22:9870/

   
7.4开启汗青日记服务器(bigdata01)

  1. [root@bigdata01 hadoop]# mapred --daemon start historyserver
复制代码
  http://bigdata01:19888/jobhistory
  
附录



附录一:编写Hadoop高可用集群脚本


   
不推荐利用start-all.sh下令,后续的Spark、hive有雷同下令冲突
  1. #!/bin/bash
  2. # chmod a+x /usr/local/bin/haCluster
  3. if [ $# -lt 1 ]
  4. then
  5.     echo "No Args Input!"
  6.     exit;
  7. fi
  8. case $1 in
  9. "start")
  10.         echo -e "\n================= 启动 hadoop集群 ================="
  11.         echo " ------------------- 启动 hdfs --------------------"
  12.         $HADOOP_HOME/sbin/start-dfs.sh
  13.         echo " ------------------- 启动 yarn --------------------"
  14.         $HADOOP_HOME/sbin/start-yarn.sh
  15.         echo " --------------- 启动 historyserver ---------------"
  16.         echo "Starting historyserver on [bigdata01]"
  17.         ssh bigdata01 "$HADOOP_HOME/bin/mapred --daemon start historyserver"
  18.     echo -e "\n"
  19. ;;
  20. "stop")
  21.         echo -e "\n================= 关闭 hadoop集群 ================="
  22.         echo " --------------- 关闭 historyserver ---------------"
  23.         echo "Stopping historyserver on [bigdata01]"
  24.         ssh bigdata01 "$HADOOP_HOME/bin/mapred --daemon stop historyserver"
  25.         echo " ------------------- 关闭 yarn --------------------"
  26.         $HADOOP_HOME/sbin/stop-yarn.sh
  27.         echo " ------------------- 关闭 hdfs --------------------"
  28.         $HADOOP_HOME/sbin/stop-dfs.sh
  29.     echo -e "\n"
  30. ;;
  31. *)
  32.     echo "Input Args Error!"
  33. ;;
  34. esac
复制代码
 
 

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

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

我爱普洱茶

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