Hadoop环境搭建及相关组件的工作流程介绍

栏目: 服务器 · 发布时间: 5年前

内容简介:本篇博客主要是记录Hadoop环境配置包括单机伪分布环境搭建,分布式环境搭建和Hadoop相关组件的工作流程介绍,包括HDFS读写流程,YARN的资源调度流程,MapReduce工作流程。建议先理解各个组件的工作流程,再去配置环境会更容易理解。说明:Windows的上一台虚拟机VM,系统Centos6.5,系统用户zkpk,超级用户rootd.免秘钥登录(zkpk)

本篇博客主要是记录Hadoop环境配置包括单机伪分布环境搭建,分布式环境搭建和Hadoop相关组件的工作流程介绍,包括HDFS读写流程,YARN的资源调度流程,MapReduce工作流程。建议先理解各个组件的工作流程,再去配置环境会更容易理解。

2Hadoop单机伪分布配置

说明:Windows的上一台虚拟机VM,系统Centos6.5,系统用户zkpk,超级用户root

a.配置主机名(root)

命令:gedit /etc/sysconfig/network
    NETWORKING=yes #启动网络
    HOSTNAME=master #主机名
命令:hostname master
查看命令:hostname

b.配置网络(root)

这块主要是看虚拟机的网络配置设置可以选择桥接模式,NET模式。虚拟机网络连接区别 桥接、主机、Net

这里虚拟机的网络配置选择NET模式。

关闭防火墙: service iptables stop

c.配置hosts列表(root)

命令:gedit /etc/hosts
    192.168.1.77 master

d.免秘钥登录(zkpk)

su zkpk

前提安装ssh: sudo apt-get install ssh
命令:ssh-keygen -t rsa
命令:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
命令:chmod 600 ~/.ssh/authorized_keys

e.java环境准备(zkpk)软件 jdk-7u71-linux-x64.gz

命令:tar -xvf /usr/java/jdk-7u71-linux-x64.gz
命令:gedit /home/zkpk/.bash_profile
    export JAVA_HOME=/usr/java/jdk1.7.0_71/ 
    export PATH=$JAVA_HOME/bin:$PATH
命令:source /home/zkpk/.bash_profile
验证:java -version

f.Hadoop安装(zkpk)软件 hadoop-2.6.0-cdh5.7.0.tar.gz
下载地址

命令:tar -xvf ~/hadoop-2.6.0-cdh5.7.0.tar.gz
重命名命令:mv hadoop-2.6.0-cdh5.7.0 hadoop
命令:cd hadoop
命令:gedit ~/.bash_profile
    export HADOOP_HOME=/home/zkpk/app/hadoop
    export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
命令:source ~/.bash_profile

g.Hadoop配置文件的设置(zkpk)

1)当前目录是hadoop.设置Hadoop的 java 运行环境,对应的文件etc/hadoop/hadoop-env.sh

命令:gedit etc/hadoop/hadoop-env.sh
    # set to the root of your Java installation
    export JAVA_HOME=/usr/java/jdk1.7.0_71/

2)当前目录是hadoop.设置Hadoop中的HDFS:etc/hadoop/core-site.xml和etc/hadoop/hdfs-site.xml.

命令:gedit etc/hadoop/core-site.xml
#hadoop v2.0
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:8020</value>
    </property>
    <!-- Hadoop 文件缓存位置 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/zkpk/app/tmp</value>
    </property> 
</configuration>
命令:gedit etc/hadoop/hdfs-site.xml
<configuration>
    <!-- # Hadoop 块副本信息 -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

3.1).启动hdfs,当前目录hadoop

a.格式化文件系统(仅第一次执行即可,不可重复执行否则hdfs文件系统将重新清空,格式化了)
命令:hdfs namenode -format
b.启动 NameNode daemon and DataNode daemon
命令:sbin/start-dfs.sh
验证启动成功:jps
浏览器验证:master:50070
c.关闭 NameNode daemon and DataNode daemon
命令:sbin/stop-dfs.sh

3.2)Hadoop中HDFS shell使用————操作分布式文件系统

描述:此时有两个文件系统——本机文件系统和部署在本机上的分布式文件系统HDFS

常用命令: ls get mkdir rm put

方式一:hdfs dfs + commmond

方式二:hadoop fs + commmond

# a.将本机文件系统中的hello.txt放入到本机上的分布式文件系统HDFS中的/目录下
命令: hadoop fs -put /home/zkpk/app/demo/hello.txt /
# b.查看本机上的分布式文件系统HDFS中的/目录下的hello.txt文件
命令: hadoop fs -text /hello.txt
# c.在本机上的分布式文件系统HDFS中创建文件目录
命令: hadoop fs -mkdir /test/a/b
# d.在本机上的分布式文件系统HDFS中查看文件
命令: hadoop fs -ls -R /test
# e.将本机文件系统中的hello.txt放入到本机上的分布式文件系统HDFS中的 /test/a目录下
命令: hadoop fs -copyFromLocal /home/zkpk/app/demo/hello.txt /test/a
# f.将本机上的分布式文件系统HDFS中的/test/a目录下的hello.txt 放置到本机文件系统下
命令: hadoop fs -copyToLocal/get  /test/a/hello.txt /home/zkpk/app/demo/h.txt
# g.删除本机上的分布式文件系统HDFS中的/test目录
命令: hadoop fs -rm -R /test

h.yarn资源调度器的设置(zkpk)

当前目录是hadoop

1)设置etc/hadoop/mapred-site.xml:

命令:gedit etc/hadoop/mapred-site.xml
<configuration>
    <!-- 设置MapReduce是运行在yarn上的 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

2)设置etc/hadoop/yarn-site.xml:

命令:gedit etc/hadoop/yarn-site.xml
<configuration>
    <!-- 设置yarn上的应用程序是MapReduce,启动的服务是MapReduce -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

3)启动yarn

a.启动ResourceManager daemon 和 NodeManager daemon
命令:sbin/start-yarn.sh
验证启动成功:jps
浏览器验证:master:8088
b.关闭ResourceManager daemon 和 NodeManager daemon
命令:sbin/stop-yarn.sh

4)提交MapReduce任务到yarn上运行

使用命令 hadoop jar + jar包名

3Hadoop分布式配置

说明,一台Windows上,开启了3个虚拟机VM1,VM2,VM3各个虚拟机在机器中充当的角色如下:

VM1 master:192.168.1.77,NameNode,DataNode,NodeManager,ResourceManager

VM1 slave1:192.168.1.105 DataNode,NodeManager

VM1 slave2:192.168.1.107 DataNode,NodeManager

a.配置主机名(root)

同单机伪分布配置,在3台机器上都需要配置,对应设置自己对应的主机名。

b.配置网络(root)

此处需要将虚拟机的网络配置设置为桥接模式。也需要关闭防火墙,命令同单机伪分布。

c.配置hosts列表(root)

命令:gedit /etc/hosts
    192.168.1.77 master 
    192.168.1.105 slave1
    192.168.1.107 slave2

d.免秘钥登录(zkpk)

1)在master,slave1,slave2 VM上运行:
前提安装ssh: sudo apt-get install ssh
命令:ssh-keygen -t rsa
2)在master运行:
命令:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
命令:chmod 600 ~/.ssh/authorized_keys
最后将master上的authorized_keys拷贝到另外两台机器
命令:scp  ~/.ssh/authorized_keys zkpk@slave1:~/.ssh/
命令:scp  ~/.ssh/authorized_keys zkpk@slave2:~/.ssh/
e.java环境准备(zkpk) 软件 jdk-7u71-linux-x64.gz
f.Hadoop安装(zkpk) 软件 hadoop-2.6.0-cdh5.7.0.tar.gz

下载地址

e.f两步设置同单机伪分布配置,都只在master VM上设置好。

g.HDFS配置和YARN配置

这些都只在master VM上设置,当前目录为hadoop。

1)设置Hadoop的java运行环境,对应的文件etc/hadoop/hadoop-env.sh

命令:gedit etc/hadoop/hadoop-env.sh
    # set to the root of your Java installation
    export JAVA_HOME=/usr/java/jdk1.7.0_71/

2)设置HDFS相关配置。当前目录为hadoop

mkdir -p ../hadoop_tmp/dfs/data mkdir -p ../hadoop_tmp/dfs/name

设置etc/hadoop/core-site.xml

命令:gedit etc/hadoop/core-site.xml
<configuration>
    <!-- 设置HDFS对应的URI -->
     <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:8020</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/zkpk/app/hadoop_tmp</value>
    </property> 
</configuration>

设置etc/hadoop/hdfs-site.xml.

命令:gedit etc/hadoop/hdfs-site.xml
<configuration>
    <!-- 设置HDFS对应Block副本数 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <!-- 设置HDFS的DataNode和NameNode对应的存放目录 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/zkpk/app/hadoop_tmp/dfs/name</value>
    </property> 
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/zkpk/app/hadoop_tmp/dfs/data</value>
    </property>
</configuration>

3)设置yarn配置

设置etc/hadoop/mapred-site.xml:

命令:cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
命令:gedit etc/hadoop/mapred-site.xml
<configuration>
    <!-- 设置MapReduce是运行在yarn上的 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

设置etc/hadoop/yarn-site.xml:

命令:gedit etc/hadoop/yarn-site.xml
<configuration>
    <!-- 设置yarn上的应用程序是MapReduce,启动的服务是MapReduce -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!-- 设置yarn的resourcemanager是运行在主机master上 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>master</value>
    </property>
</configuration>

h设置分布式集群的从节点关系

设置etc/hadoop/slaves文件。

通常情况下,选择集群中的一台机器充当NameNode,并选择一台机器充当ResourceManager。 其余的机器同时充当DataNode和NodeManager,并被称为从机。然后将从机的主机名写入gedit etc/hadoop/slaves文件中。

命令:gedit etc/hadoop/slaves
master 
slave1
slave2

说明:因为master上运行了NodeManager和DataNode,所以需要将master添加到这上面。

i将上述Hadoop的相关文件复制到其他节点机器

主要包括java环境的设置,Hadoop安装环境,只在master上复制操作。

1)先拷贝java相关的
命令:sudo scp -r /usr/java/jdk1.7.0_71 root@slave1:/usr/java/jdk1.7.0_71/
命令:sudo scp -r /usr/java/jdk1.7.0_71 root@slave2:/usr/java/jdk1.7.0_71/
2)拷贝Hadoop相关的
slave1和slave2需要有NameNode和DataNode对应的存储文件夹/home/zkpk/app/hadoop_tmp/dfs/node和/home/zkpk/app/hadoop_tmp/dfs/name,没有需要先创建
命令:sudo  -r /home/zkpk/app/hadoop zkpk@slave1:/home/zkpk/app/hadoop
命令:sudo  -r /home/zkpk/app/hadoop zkpk@slave2:/home/zkpk/app/hadoop
3)拷贝配置文件/home/zkpk/.bash_profile
命令:sudo  -r /home/zkpk/.bash_profile zkpk@slave1:/home/zkpk/
命令:sudo  -r /home/zkpk/.bash_profile zkpk@slave2:/home/zkpk/
4)slave1和slave2下分别运行
命令:source /home/zkpk/.bash_profile

j启动整个分布式集群

启动命令:./sbin/start-all.sh
验证命令:jps
终止命令:./sbin/stop-all.sh

Hadoop环境搭建及相关组件的工作流程介绍

4HDFS读写流程

Hadoop环境搭建及相关组件的工作流程介绍

4.1写数据

Client:发起写请求,获取到block的大小信息,副本个数信息。然后切分文件成多个block

NameNode:全局协调所有的请求,对于每个block,计算出block存储的DataNode的位置

DataNode:pipline数据存储

4.2读数据

Client:发送NameNode出文件名。从DataNode读取出数据

NameNode:回送文件包含的块列表,每个块对应的DataNode信息。

DataNode:数据存储

1.写过程

Client发送写请求,并指定block的大小信息,副本个数信息,然后Client将大文件切分为多个block,并将要存储的block信息发送到NameNode,待NameNode计算好block存储的位置后,一个一个将block和该block副本位置发送到NameNode指定的DataNode位置。

NameNode,接收写请求和block的信息,副本个数信息。根据各个DataNode的存储资源情况计算出block存储的DataNode的位置。

DataNode,接收Client发送过来的block块和该block副本位置,并将该block复制到另外一个DataNode作为一个副本。存储完成后需要通知NameNode。

2.读过程

Client发送读请求,并指定文件名,将该请求和文件名发送给NameNode。

NameNode接收Client请求和文件名,计算出文件的元信息(文件的block存储位置,block信息,副本信息),并将文件的元信息反馈回Client。

Client接收到文件的元信息后,将从对应的DataNode上的下载block,最后将所有的block组合成文件。

5YARN资源调度流程

Hadoop环境搭建及相关组件的工作流程介绍

5.1YARN架构中包含的重要概念

YARN:多个不同的计算框架可以共享同一个HDFS集群上的数据,享受整体的资源调度。

XXX on YARN 的好处:与其他计算框架共享集群资源,按资源需要分配,进而提高集群资源的利用率

XXX:Spark、MapReduce、Storm、Flink

1)ResourceManager: RM

整个集群同一时间提供服务的RM只有一个,负责集群资源的统一管理和调度

处理客户端的请求: 提交一个作业、杀死一个作业

监控我们的NM,一旦某个NM挂了,那么该NM上运行的任务需要告诉我们的AM来如何进行处理

ResourceManager包含一个ApplicationManager和Resource Scheduler.其中ApplicationManager负责分配ApplicationMaster运行的Container资源,并与Container对应的NodeManager通信。ApplicationManager也负责与ApplicationMaster通信了解Job的运行状态。Resource Scheduler负责Job中的任务资源分配。

2) NodeManager: NM

整个集群中有多个,负责自己本身节点资源管理和使用

定时向RM汇报本节点的资源使用情况

接收并处理来自RM的各种命令:启动Container

处理来自AM的命令

单个节点的资源管理

3) ApplicationMaster: AM

每个应用程序对应一个:MR、Spark,负责应用程序的管理

为应用程序向RM申请资源(core、memory),分配给内部task

需要与NM通信:启动/停止task,task是运行在container里面,AM也是运行在container里面

4) Container

封装了CPU、Memory等资源的一个容器

是一个任务运行环境的抽象

5) Client

提交作业、查询作业的运行进度、杀死作业

5.2YARN执行过程

执行过程

1.Client向Yarn中的RM提交一个Job(MP/Spark作业),RM为该Job分配第一个Container资源,并与Container对应的NodeManager通信

2.RM与NodeManager通信,请求启动分配的Container(AM),当Job是MP的job时,对应的是MP的AM。

3.AM容器启动后向RM注册,以便用户可以通过RM查看Job的运行状态。并且AM(MP)将为Job中的各个任务如(Map任务、Reduce任务)向RM申请资源(采用轮询的方式向RM申请和领取资源)。

4.当AM申请到资源后,AM将则与资源对应的NodeManager通信,要求NM启动Container来运行任务。

5.各个任务需要需要向AM汇报运行状态和进度。

6MapReduce的工作过程

6.1MapReduce2.x运行过程

此处的MapReduce是运行在YARN上的,作为YARN上的一个应用程序,也就是 5.2YARN执行过程 中的Client,MapReduce向YARN中提交的是一个Job。

6.2MapReduce编程模型过程

Hadoop环境搭建及相关组件的工作流程介绍

1)编程模型图说明(从左往右说明)

首先,从HDFS中读取出file,使用InputFormat接口将file进行切片处理得到多个Split,然后InputFormat将Split转换为对应的<k1, v1>作为Mapper的输入。一个Split对应一个<k1, v1>对应一个Mapper。

其次,经过Mapper Task处理后输出<k2, v2>,经由Shuffle进行一定程度的组合得到<k2, {v2,…}>,作为Reduce的输入,Reduce进行K的合并操作,输出 <k3, v3>。后面会详细叙述Shuffle的过程。

最后,,在得到 <k3, v3>后经OutputFormat转换为HDFS的文件存储到相应的HDFS目录下。

2)Map和Reduce的输入输出数据格式

(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output)

其中的K,V必须实现Writable可序列化接口,其中K还必须实现WriteableComparable接口。

3)核心概念

Split:MapReduce中最小的计算单元

Block:HDFS中的最小存储单元,默认情况下,Split和Block是一一对应关系。

InputFormat:将输入文件进行分片处理,并转化为键值对形式。

OutputFormat:将键值对转化为文件输出

Combiner:本地的Reduce,先将Mapper找你的相同的Key先做一部分处理,减少了MapTask输出的数量量。使用场景求和,次数 ,不能用平均数。

Partitioner:决定MapTask输出的数据交由那个ReduceTask处理,默认的情况下分发的key的hash值对Reduce Task个数取模。

6.2.1MapReduce中的Shuffle过程详解

Hadoop环境搭建及相关组件的工作流程介绍

借助参考链接中的说明:

为什么MapReduce计算模型需要Shuffle过程?MapReduce计算模型一般包括两个重要的阶段:Map是映射,负责数据的过滤分发;Reduce是规约,负责数据的计算归并。Reduce的数据来源于Map,Map的输出即是Reduce的输入,Reduce需要通过Shuffle来获取数据。

从Map输出到Reduce输入的整个过程可以广义地称为Shuffle。Shuffle横跨Map端和Reduce端,在Map端包括Spill过程,在Reduce端包括copy和sort过程.

Spill过程

Hadoop环境搭建及相关组件的工作流程介绍

说明:1.每个Map任务不断地以<key, value>对的形式把数据输出到在内存中构造的一个环形数据结构中kvbuffer。使用环形数据结构是为了更有效地使用内存空间,在内存中放置尽可能多的数据.

2.把Kvbuffer中的数据按照partition值和key两个关键字升序排序,移动的只是索引数据,排序结果是Kvmeta中数据按照partition为单位聚集在一起,同一partition内的按照key有序。

3.当每个Map任务不断地以<key, value>加入到内存的kvbuffer中时,并进行 排序 后,当kvbuffer中的内存使用空间达到一定程度时,将kvmate的数据写到 磁盘上

4.最后把所有的数据都输出到磁盘上,最后merge成一个文件。

Map端的Shuffle过程到此结束。

Copy过程

Reduce任务通过HTTP向各个Map任务拖取它所需要的数据。如果map中的partition值设置了,将会把Map最后的输出,输送到指定的Reduce上供Reduce拖取(复制到内存)。

Sort

Map的输出数据已经是有序的,Merge进行一次合并排序,所谓Reduce端的sort过程就是这个合并的过程。

Reduce端的Shuffle过程至此结束。

上面只是根据自己的理解记录的,如果不是很清楚可以查看参考链接。

kvbuffer数据结构介绍:

1.kvmeta,存放<K,V>数据.

2.kvindex,牵引数据,四元组(value的起始位置、key的起始位置、partition值、value的长度),大小4个int.

6.3MapReduce中的Jobhistory配置记录

1.需要设置etc/hadoop/mapred-site.xml:

命令:gedit etc/hadoop/mapred-site.xml
<configuration>
    <!-- 设置MapReduce的Jobhistory服务 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>master:10020</value>
    </property>
    <!-- 设置MapReduce的Jobhistory web服务 -->
     <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>master:19988</value>
    </property> 
    <!-- 设置MapReduce的Jobhistory 历史存放目录 -->
     <property>
        <name>mapreduce.jobhistory.done-dir</name>
        <value>/home/zkpk/app/history/done</value>
    </property>   
    <!-- 设置MapReduce的Jobhistory 正在执行的job历史目录 -->
     <property>
        <name>mapreduce.jobhistory.intermediate-done-dir</name>
        <value>master:19988</value>
    </property>     
</configuration>

启动:./sbin/mr-jobhistory-daemon.sh start historyserver

此时YARN的聚合日志功能也需要开启:

命令:gedit etc/hadoop/yarn-site.xml
<configuration>
    <!-- 设置yarn的日志聚合 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
</configuration>

问题集

Hadoop中HDFS javaAPI测试问题记录

编程环境:两台电脑(同一个局域网),一台Windows里装了3个VM Centos虚拟机,VM网络模式NET模式,并将上面3台VM进行了上面的 分布式集群配置

Windows:192.168.1.108

VM1 master:192.168.1.77

VM1 slave1:192.168.1.105

VM1 slave2:192.168.1.107

一台Mac: 192.168.1.115

在MAC的IDEA中使用HDFS API来操作VM中的HDFS。

VM网络连接设置的区别 桥接、主机、Net

ping相连的结果:

1)VM网络模式NET模式

问题1:mac 能ping通Windows。Mac ping不通VM1,VM2,VM3。

Windows,VM1,VM2,VM3能ping通mac.

方法:将VM网络模式设置为桥接模式

2)VM网络模式桥接模式

此时需要先设置VM的静态IP地址,子网掩码等信息。

修改命令:vi /etc/sysconfig/network-scripts/ifcfg-eth0

如果虚拟机是克隆的需要更改mac地址,把mac地址修改为当前VM网卡的mac地址

BOOTPROTO=static #启用静态IP地址

ONBOOT=yes #开启自动启用网络连接

IPADDR=192.168.21.129 #设置IP地址

NETMASK=255.255.255.0 #设置子网掩码

GATEWAY=192.168.21.2 #设置网关

DNS1=8.8.8.8 #设置主DNS

DNS2=8.8.4.4 #设置备DNS

IPV6INIT=no #禁止IPV6

注意 虚拟机克隆etho网络恢复 的问题

问题2:VMware ping 不通主机和主机ping不通虚拟机解决,此时VM网络连接模式是桥接模式。

方法:桥接模式,需要到性能网络编辑器中指定桥接模式桥接到当前的网卡上,不用自动模式。

主机的网络中心设在禁用VMnet8 和VMnet1

问题3:Mac中IDEA 调用HDFS API”hdfs://192.168.1.77:8020”连接不上VM中的HDFS

方法:HDFS的寄托的VM上需要关闭防火墙

(root模式下)service iptables stop

永久关闭:chkconfig iptables off


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++数据结构与算法

C++数据结构与算法

[美]乔兹德克(Adam Drozdek) / 徐丹、吴伟敏 / 清华大学出版社 / 2014-10-1 / 63.00元

本书全面系统地介绍了数据结构,并以C++语言实现相关的算法。书中主要强调了数据结构和算法之间的联系,使用面向对象的方法介绍数据结构,其内容包括算法的复杂度分析、链表、栈、队列、递归、二叉树、图、排序和散列。书中还清晰地阐述了同类教材中较少提到的内存管理、数据压缩和字符串匹配等主题。书中包含大量的示例分析和图形,便于读者进一步理解和巩固所学的知识。一起来看看 《C++数据结构与算法》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具