当前位置: 首页 > news >正文

大连做公司网站哪家好中国建设银行官网站基金查询

大连做公司网站哪家好,中国建设银行官网站基金查询,可以申请做cpa广告的网站,网络策划案1. MapReduce是什么#xff1f;请简要说明它的工作原理。 MapReduce是一种编程模型#xff0c;主要用于处理大规模数据集的并行运算#xff0c;特别是非结构化数据。这个模型的核心思想是将大数据处理任务分解为两个主要步骤#xff1a;Map和Reduce。用户只需实现map()和r…1. MapReduce是什么请简要说明它的工作原理。 MapReduce是一种编程模型主要用于处理大规模数据集的并行运算特别是非结构化数据。这个模型的核心思想是将大数据处理任务分解为两个主要步骤Map和Reduce。用户只需实现map()和reduce()两个函数即可实现分布式计算。 在Map阶段接受输入数据并将其分解成一系列的键值对。这些键值对会被传送到对应的Reduce任务中进行处理。而在Reduce阶段将由Map阶段传递过来的键值对进行处理最终生成一个最终的结果。 此外MapReduce是一个分布式运算程序的编程框架是用户开发“基于hadoop的数据分析应用”的核心框架。其核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序并发运行在一个hadoop集群上。因此MapReduce可以以一种可靠的、具有容错能力的方式并行地处理上TB级别的海量数据集主要用于搜索领域解决海量数据的计算问题。 2. MapReduce有哪些主要组件请简要介绍它们的作用。 MapReduce主要包括以下四个核心组件Mapper、Reducer、Driver和Job。 Mapper模块负责处理输入的数据具体的业务逻辑在map()方法中完成。Mapper将输入数据解析成键值对输出的数据也是KV格式。Reducer模块其主要任务是处理Mapper程序输出的KV数据具体的业务逻辑在reduce()方法中进行。Reducer会对具有相同key的值进行合并处理并输出最终结果。Driver模块主要负责将用户编写的程序提交到YarnYet Another Resource Negotiator进行调度运行提交的程序是一个封装了运行参数的job对象。Job模块表示整个MapReduce作业它由一系列的Map任务和Reduce任务组成这些任务并行执行共同完成大规模数据集的处理。 举个简单的例子假设我们需要统计一份日志文件中每个单词出现的次数。在这个场景下Mapper的任务就是读取每一行日志文件将每行文本拆分为一个个单词并将每个单词作为key出现次数作为value输出而Reducer则需要接收所有Mapper输出的key-value对对于相同的key将其对应的所有value值进行累加从而得到每个单词的总出现次数。 3. 请解释MapReduce的Shuffle阶段。它为什么重要 在MapReduce中Shuffle阶段是一个核心流程它负责将Mapper阶段处理的数据传递给Reduce在MapReduce中Shuffle阶段是一个核心流程它负责将Mapper阶段处理的数据传递给Reducer阶段。这一阶段涵盖了数据分区、排序、局部聚合、缓存、拉取和再合并等关键步骤。 首先数据分区是将输出的键值对按照特定的规则分发到不同的Reduce任务中。例如如果我们只需要找出一个数据集的最大值那么每个Mapper都只需输出自己所知道的最大值及其位置这样就可以显著减少数据传输量。 其次排序是为了保证相同key的数据能够发送到同一个Reduce任务中进行处理。这样Reduce任务可以对具有相同key的值进行合并处理从而得到每个单词的总出现次数。 接着局部聚合是为了在网络节点间对数据进行整理。在这个过程中Mapper会生成大量的键值对这些键值对需要在网络节点间进行传输。通过局部聚合可以减少数据传输的数量。 然后缓存和拉取是为了在数据传输过程中提高效率。在这个过程中Mapper端会将数据暂时存储在内存中而Reducer会从Mapper端拉取需要的数据进行处理。 最后再合并是为了将同一key的所有value进行汇总。这样Reducer就可以对这些value进行求和或其他操作得出最终的结果。 因此Shuffle阶段对于MapReduce作业的执行至关重要它直接影响到数据处理的效率和准确性。 4. 请解释MapReduce的Combiner函数。它有什么作用如何实现 Combiner函数是MapReduce中的一个优化步骤其主要目标是在Map阶段结束后进行局部聚合操作以减少数据的传输量。Combiner函数的运行逻辑如下 输入Combiner接收到的输入数据与Mapper输出的数据格式相同都是键值对。处理对具有相同key的值进行合并处理。输出Combiner的输出是经过合并处理后的键值对。 Combiner函数的使用场景通常是当Mapper的输出数据量过大网络传输和磁盘I/O压力较大时。通过使用Combiner函数可以在Map阶段结束后就进行部分数据的合并和压缩从而减少Shuffle阶段的数据传输量和计算压力。 5. 请解释MapReduce的Partitioner类。它有什么作用如何实现 Partitioner类在MapReduce编程模型中起着关键的作用其主要任务是对Mapper阶段的输出数据Partitioner类在MapReduce编程模型中起着关键的作用其主要任务是对Mapper阶段的输出数据进行分区确定每个键值对被分发到哪个Reduce任务中去处理。这样具有相同key的数据会被发送到同一个Reduce任务中进行处理从而极大地增加了数据处理的效率。 具体来说Partitioner类的工作方式类似于哈希函数。首先它获取键的哈希值然后使用这个哈希值对Reduce任务数求模以此确定每个键值对将被分发到哪个Reduce任务。默认情况下MapReduce作业只有一个Reduce任务因此Partitioner只需将数据均匀地分发到这一个Reduce任务上。 如果需要自定义分区逻辑可以通过继承Partitioner类并重写getPartition方法来实现。例如根据数字把文件分为两部分的需求可以定义一个Partitioner类使得数字大于15的数据归为一类小于等于15的数据分为另一类。注意自定义分区的数量需要和Reduce任务的数量保持一致。 6. MapReduce如何处理数据排序请说明WritableComparable接口的作用。 在MapReduce中数据排序是通过Sort阶段来实现的。在这个阶段MapReduce框架会将所有具有相同key的数据发送到同一个Reduce任务中进行处理。为了确保相同的key被发送到同一个ReducerMapReduce需要对数据进行排序。 WritableComparable接口是Hadoop中的一个基本接口它定义了可写和可比较两个方法。任何实现了这个接口的类都可以被序列化和反序列化并且可以进行比较。在MapReduce中键值对的key通常需要实现WritableComparable接口以便在排序阶段正确地将具有相同key的数据发送到同一个Reduce任务中进行处理。 例如如果我们想要统计一个文本文件中每个单词出现的次数那么单词就可以作为key而出现次数可以作为value。在这种情况下我们需要自定义一个类来表示单词及其出现次数并让这个类实现WritableComparable接口。这样MapReduce就可以正确地将具有相同单词的数据发送到同一个Reduce任务中进行处理从而实现数据的排序。 7. 请解释MapReduce中的InputFormat和OutputFormat类。它们的作用分别是什么 在MapReduce中InputFormat和OutputFormat是两个关键的接口。它们分别负责数据输入和输出的处理。 InputFormat的主要职责是读取数据。当运行MapReduce程序时输入的文件格式可以是多种多样的例如基于行的日志文件、二进制文件、数据库表等。为了处理这些不同类型的数据MapReduce通过InputFormat来实现数据的读取。InputFormat有许多子类可供选择包括TextInputFormat用于读取普通文本这是MR框架默认的读取实现类型、KeyValueTextInputFormat用于读取一行文本数据按照指定分隔符将数据封装为键值对类型、NLineInputFormat用于按照行数划分数据以及CombineTextInputFormat用于合并小文件以避免启动过多的MapTask任务。用户也可以根据需要自定义InputFormat。 相对于InputFormat的数据处理输入OutputFormat则主要关注结果数据的输出。在Reducer执行完reduce()方法后Reducer会通过OutputFormat将处理结果输出到外部环境。在Hadoop中默认使用的OutputFormat是TextOutputFormat它会将reduce()方法的处理结果按行输出到文件中。OutputFormat是所有MapReduce输出程序的基类任何实现了MapReduce输出功能的程序都必须实现OutputFormat接口。此外OutputFormat有多种官方自带的实现类包括NullOutputFormat、FileOutputFormat、MapFileOutputFormat等用户可以根据需要选择合适的OutputFormat类。例如TextOutputFormat是默认的字符串输出格式它会使用tab作为key和value之间的分隔符而SequenceFileOutputFormat则会将key和value以sequencefile格式输出。 8. 请解释MapReduce中的Counter类。它有什么作用如何使用 在MapReduce中Counter类是一个用于记录作业执行过程中某些感兴趣的变量的工具。这些变量可以包括作业的执行进度和状态以及一些自定义的变量。例如你可能会使用一个Counter来跟踪作业已经处理了多少个键值对或者已经消耗了多少数据输入。 Hadoop内置了计数器功能它可以帮助用户理解程序的运行情况辅助用户诊断故障。此外MapReduce还提供了许多默认的Counter以帮助用户观察MapReduce job运行期间的各种细节数据。 要使用Counter类你需要首先创建一个Counter对象然后使用其inc()方法来增加计数器的值或使用dec()方法来减少计数器的值。例如 import org.apache.hadoop.mapreduce.Counter;public class MyMapper extends MapperLongWritable, Text, Text, IntWritable {private Counter wordCount new Counter();public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String[] words value.toString().split(\\s);for (String word : words) {wordCount.increment(word);}} }在这个例子中我们创建了一个名为wordCount的Counter对象并在map()函数中使用它来统计每个单词出现的次数。 9. 请解释MapReduce中的IdentityMapper和IdentityReducer类。它们有什么作用 在MapReduce编程模型中IdentityMapper和IdentityReducer是两种默认的组件。它们的主要作用是将输入的数据不做任何处理直接原封不动地输出。 具体来说IdentityMapper是Map阶段的默认处理类它不对输入数据进行任何处理而是将输入的键值对直接传递到下一个阶段。这意味着如果你没有为你的MapReduce任务定义自定义的Mapper类Hadoop将自动使用IdentityMapper作为默认的Mapper。 同理IdentityReducer是Reduce阶段的默认处理类。它也不对输入数据做任何处理直接将输入的键值对传递给Reduce函数进行处理并输出。如果用户没有提供自定义的Reducer类Hadoop将自动使用IdentityReducer作为默认的Reducer。 因此IdentityMapper和IdentityReducer可以被视为一种“空操作”的处理类用于确保MapReduce作业至少能够正常运行。 10. 如何在MapReduce中处理小文件问题请提供一种解决方案。 在MapReduce中小文件问题是一个常见的问题。当输入数据被分割成很多小文件时每个Mapper任务处理的数据量就会很小这会导致大量的Map任务和Reduce任务从而增加了作业的运行时间和资源消耗。 一种解决小文件问题的常见方法是使用Combiner函数。Combiner函数可以在Map阶段结束后对具有相同key的数据进行局部聚合减少数据的传输量。这样即使有大量小文件也可以大大减少网络传输和磁盘I/O压力。 例如假设我们有一个包含单词及其出现次数的文件我们想要统计每个单词出现的次数。如果文件中有很多小文件我们可以使用Combiner函数来合并具有相同单词的键值对然后只发送一个包含所有相同单词的键值对到Reduce阶段。 具体来说首先我们需要定义一个实现了WritableComparable接口的Combine类 public class WordCountCombiner extends WritableComparableText, IntWritable {private Text word new Text();private IntWritable count new IntWritable();public void set(Text word, IntWritable count) {this.word.set(word);this.count.set(count);}public Text getWord() { return word; }public IntWritable getCount() { return count; }Overridepublic void write(DataOutput out) throws IOException {word.write(out);count.write(out);}Overridepublic void readFields(DataInput in) throws IOException {word.readFields(in);count.readFields(in);}Overridepublic int compareTo(WritableComparableText, IntWritable o) {return word.compareTo(o.get());} }然后在Mapper类中重写setup()方法将Combiner类作为参数传递给Context对象 public class WordCountMapper extends MapperLongWritable, Text, Text, IntWritable {private WordCountCombiner combiner new WordCountCombiner();Overrideprotected void setup(Context context) throws IOException, InterruptedException {super.setup(context);context.setCombinerClass(WordCountCombiner.class);} }最后在Reducer类中处理Combiner输出的数据 public class WordCountReducer extends ReducerText, IntWritable, Text, IntWritable {private IntWritable result new IntWritable();Overrideprotected void reduce(Text key, IterableIntWritable values, Context context) throws IOException, InterruptedException {int sum 0;for (IntWritable val : values) {sum val.get();}result.set(sum);context.write(key, result);} }11. 请解释MapReduce的ChainMapper和ChainReducer类。它们有什么作用如何使用 ChainMapper和ChainReducer是MapReduce编程中的两种特殊类它们主要用于ChainMapper和ChainReducer是MapReduce编程中的两种特殊类它们主要用于处理线性链式的Mapper任务。在Map或Reduce阶段中如果存在多个Mapper这些Mapper就可以像Linux管道一样将前一个Mapper的输出结果直接重定向到下一个Mapper的输入形成一个流水线。 具体来说ChainMapper允许使用多个Map子类作为一个Map任务。这些map子类的执行与liunx的管道命令十分相似第一个map的输出会成为第二个map的输入第二个map的输出也会变成第三个map的输入以此类推直到最后一个map的输出会变成整个mapTask的输出。 同时ChainReducer则用于设置Reducer并添加后处理的Mapper。整个Job中只能有一个Reducer而在Reducer前面可以有一个或者多个Mapper后面的链式Mapper数量可以为0。通过使用ChainReducer的addMapper()方法你可以方便地添加额外的Mapper到作业中。 例如假设我们有一个需要进行多步处理的大数据集。首先我们可以通过一系列的Mapper进行数据预处理然后是核心的MapReduce任务最后可能还需要一些其他的Mapper进行后处理。在这种情况下我们就可以利用ChainMapper来链接这些预处理的Map任务而利用ChainReducer来设置Reducer并添加后处理的Mapper。这样设计的优点是提高了生成效率。 12. 请解释MapReduce中的JobClient和JobTracker类。它们各自的作用是什么 在MapReduce编程模型中JobClient和JobTracker分别扮演着重要的角色。 JobClient是客户端类其主要功能是提交作业并包含一些与作业相关的配置信息例如设置作业的输入输出路径、Mapper和Reducer类以及输入输出的数据类型等。当客户端提交作业后它会将一些必要的文件上传到HDFS如作业的jar包等并将路径信息提交给JobTracker。此外用户还可以通过JobClient查看作业的运行状态。 而JobTracker则是整个集群的全局管理者其主要职责包括作业管理、状态监控和任务调度等。具体来说当JobClient将作业提交后JobTracker会创建每一个任务包括MapTask和ReduceTask并将它们发送到各个TaskTracker上去执行。同时它还需要监控这些任务的执行状态并在任务失败时进行恢复操作。 以一个实际的例子来说明假设我们有一个需要进行大数据分析的任务。首先我们需要编写一个MapReduce程序并通过JobClient将这个程序以及相关的配置信息提交到Hadoop集群上。然后JobTracker会在集群中分配资源并创建任务这些任务会被发送到各个节点上的TaskTracker去执行。最后我们可以使用JobClient来查看作业的运行状态以便及时了解任务是否执行成功。 13. 请解释MapReduce中的TaskTracker类。它的作用是什么如何与JobTracker通信 在MapReduce编程模型中TaskTracker是一个关键的组件它扮演着JobTracker和Task之间的桥梁。一方面TaskTracker会接收并执行来自JobTracker的各种命令包括运行任务、提交任务、杀死任务等。另一方面它会周期性地将本节点上各种信息通过心跳机制汇报给JobTracker。这些信息主要包括两部分机器级别信息如节点健康情况、资源使用情况等和任务级别信息如任务执行进度、任务运行状态等。 具体来说当JobTracker接收到用户提交的MapReduce作业后会将这个作业分解为多个任务并将这些任务分配给各个TaskTracker去执行。每个TaskTracker在接收到任务后会开始执行具体的任务并将任务的执行进度和状态等信息通过心跳汇报给JobTracker。如果某个任务因为某种原因失败JobTracker会根据TaskTracker上报的状态信息来重新分配任务或者重新启动失败的任务。 以一个实际的文本处理任务为例假设我们需要统计一个大文本集中每个单词出现的次数。首先用户需要编写一个MapReduce程序并在其中定义如何进行单词计数的逻辑。然后用户通过JobClient将这个程序提交到Hadoop集群中执行。在这个过程中JobTracker负责整个作业的协调和管理而TaskTracker则负责执行具体的任务。 14. 请解释MapReduce中的ResourceManager和NodeManager类。它们各自的作用是什么 在MapReduce框架中ResourceManager和NodeManager是两个关键的组件。ResourceManager主要负责整个集群的资源管理和任务调度。具体来说它接收来自各个节点NodeManager的资源汇报信息并根据这些信息按照一定的策略分配给各个应用程序。资源分配的单位被称为“容器”Container这是一个动态的资源分配单位它将内存、CPU、磁盘、网络等资源封装在一起从而限定每个任务使用的资源量。除此之外ResourceManager还负责处理客户端请求启动或监控ApplicationMaster以及监控NodeManager。 而NodeManager则是每个节点上的资源和任务管理器。其主要功能是对本节点上的资源进行管理和监控并向ResourceManager汇报本节点的资源使用情况和各个Container的运行状态。同时NodeManager还负责启动和监控在本节点上运行的任务。 以一个实际的大数据处理任务为例假设我们需要对一个大数据集进行处理并获取结果。首先用户需要编写一个MapReduce程序并在其中定义数据处理的逻辑。然后用户通过提交作业将这个程序提交到Hadoop集群中执行。在这个过程中ResourceManager负责整个集群中所有资源的统一管理和分配而NodeManager则负责执行具体的任务。 15. 请解释MapReduce中的作业提交过程。请说明YARN的作用。 在MapReduce模型中作业提交过程主要包括以下几个步骤首先用户编写好MapReduce程序并配置相关参数然后使用客户端将这个程序和配置信息提交到Hadoop集群上。如果提交到本地工作环境只需要提交切片信息和xml配置文件如果提交到Yarn工作环境还需要提交jar包。 一旦作业提交成功ResourceManager会为该作业分配资源并启动任务。具体来说ResourceManager会根据作业的需求和集群中的资源状况划分出多个“资源容器”Container每个Container内包含一定数量的CPU、内存等计算资源。然后ResourceManager将这些Container分配给各个NodeManager去执行具体的任务。 在这个过程中YARNYet Another Resource Negotiator分布式资源管理系统扮演了重要的角色。作为Hadoop的资源管理系统YARN主要由ResourceManager和NodeManager两个组件构成。其中ResourceManager是主节点负责管理整个集群的资源以及调度任务而NodeManager则是从节点每个NodeManager都包含了一定的计算资源并且负责启动和监控在其上运行的任务。通过这样的设计YARN能够有效地协调和管理集群中的资源保证MapReduce作业的顺利执行。 16. 请解释MapReduce中的计数器Counter和布隆过滤器Bloom Filter。它们各自的作用是什么如何实现 在MapReduce编程模型中计数器Counter和布隆过滤器Bloom Filter是两种常用的数据结构工具。 计数器主要用于统计MapReduce作业中的各种键值对的数量。例如如果我们想要统计一个文本数据集中每个单词出现的次数就可以使用计数器来实现。计数器会跟踪并更新作业中的键值对数量并在作业完成后将结果返回给客户端。 而布隆过滤器则是一种空间效率极高的概率型数据结构它的主要功能是判断一个元素是否存在于集合中。布隆过滤器可以快速地判断出一个元素是否可能在集合中但可能会产生假阳性的结果。换句话说布隆过滤器可能会错误地认为某个元素存在于集合中也可能会错误地认为某个元素不存在于集合中。因此布隆过滤器通常用于大规模数据集的过滤操作比如垃圾邮件过滤、恶意网址检测等。 具体到MapReduce作业中这两种工具的使用场景非常广泛。以舆情分析为例我们可以利用计数器来统计某个话题下的所有舆情数据然后通过布隆过滤器来过滤掉无关的或者恶意的信息。 17. 请解释MapReduce中的本地化计算Local Computation。它有什么优点如何实现 在MapReduce中本地化计算Local Computation是一种优化策略其基本思想在MapReduce中本地化计算Local Computation是一种优化策略其基本思想是将计算任务移动到数据所在的节点上执行而不是把数据移动到计算节点上。这样做的主要原因是移动大量数据往往需要消耗大量的网络资源和时间而将计算任务移至数据所在的位置执行可以显著减少这部分开销从而提高整体的系统吞吐量。 具体来说Hadoop集群中的数据集通常会被切割成多个块并将这些块分布在不同的节点上。在进行MapReduce计算时可以通过配置任务调度器使得每个map task处理的数据均位于同一台机器上即数据的存储位置和计算位置尽可能保持一致。这样就大大减少了数据在网络中的传输降低了网络延迟提高了处理效率。 实现本地化计算的一种常见做法是使用Hadoop的任务调度器通过设置任务调度器的优先级使得相同数据的map task尽可能地分配到同一台机器上运行。此外还可以结合数据本地性优化算法如First-Fit、Best-Fit等进一步优化任务调度的策略以实现更高效的本地化计算。 18. 请解释MapReduce中的Combiner优化和分组排序Grouping and Sorting优化。它们各自的作用是什么如何实现 在MapReduce编程模型中Combiner优化和分组排序Grouping and Sorting优化是两种重要的优化策略。 Combiner是一种优化组件它在Map阶段进行数据的部分聚合以减少需要传输到Reduce阶段的数据量。Combiner的主要作用是合并重复的key值并减少网络拷贝量从而降低网络开销。例如在WordCount的案例里对于像 (a,1)、 (a,1)、 (a,1)这种完全一样的数据启用Combiner进行一个简单的聚合即转换成 (a,3)这样的数据。这样做的好处很明显就是大大减少了输入到Reduce的数据量从而减少了reduce处理的资源压力。Combiner的使用场景有两个地方第一个场景是mapper每次溢写到磁盘的时候每当溢写的时候就可以进行Combiner操作。每个分区内部就开始简单合并。 分组排序Grouping and Sorting优化则是在Reduce端进行的。在进行分组之前数据会先根据key进行排序然后才开始分组进行分组的时候只会比较相邻的元素。如果排序规则和分组规则不统一是无法正确分组的。这种优化策略可以有效地提高Reduce阶段的处理效率。 19. 请解释MapReduce中的数据压缩Data Compression。它有什么优点如何实现 在MapReduce编程模型中数据压缩是一种关键的优化策略。其主要优点包括减少磁盘IO和磁盘存储空间。通过这种方式可以有效地提高网络带宽和磁盘空间的利用效率特别是在处理大规模数据时能够显著降低I/O操作、网络数据传输以及Shuffle和Merge的时间开销。 实现数据压缩的方式有多种Hadoop提供了多种压缩编码方式如Gzip和Bzip2等。在选择压缩方式时需要综合考虑压缩/解压缩速度、压缩率即压缩后的数据大小、以及压缩后的数据是否支持切片等因素。例如Gzip压缩算法的压缩率较高但其不支持Split操作且压缩/解压速度一般而Bzip2压缩算法虽然解压速度较慢但其支持Split操作并且具有较高的压缩率。 然而需要注意的是数据压缩也会带来一些负面影响主要体现在增加了CPU的开销。因此在选择是否进行数据压缩时还需要根据任务类型进行权衡。例如对于运算密集型的任务由于CPU的占用本就较多如果再采取压缩可能会进一步降低CPU性能从而影响整体效率。 20. 请解释MapReduce中的数据分片Data Sharding。它有什么作用如何实现 MapReduce中的数据分片Data Sharding是一种数据处理策略主要目的是MapReduce中的数据分片Data Sharding是一种数据处理策略主要目的是将大规模数据集切分为多个较小的数据块以便并行处理。在MapReduce作业提交时会预先对将要分析的原始数据进行划分处理形成一个个等长的逻辑数据对象称之为输入分片inputSplit简称“分片”。之后MapReduce为每一个分片构建一个单独的MapTask并由该任务来运行用户自定义的map方法。 数据分片的主要作用可以归纳为以下几点首先通过分片大规模数据集可以被分解成多个较小的数据块进而提高了处理效率其次数据分片可以实现数据的并行处理充分利用集群资源提高处理速度最后对于超大数据集数据分片还可以实现数据的分布式存储和处理。 在实际的处理过程中如何进行数据分片通常取决于具体的业务需求和数据特性。例如可以按照时间、地域、用户ID等方式进行数据分片。此外还需要考虑到数据的均衡性问题尽可能保证每个分片数据量的大小和处理复杂度相近以避免出现数据倾斜的问题。
http://www.w-s-a.com/news/117923/

相关文章:

  • 安徽建设厅网站首页网站开发aichengkeji
  • 自贡网站制作荣茂网站建设
  • 什么做的网站吗正规的机械外包加工订单网
  • 网络工程公司的业务邵阳seo快速排名
  • 博主怎么赚钱网站seo找准隐迅推
  • 营销号经典废话北京网站建设公司网站优化资讯
  • 一六八互联网站建设怎么做套版网站
  • wordpress 书站建筑公司简介范文大全
  • 建设官方网站多少鲜花网站建设的主要工作流程
  • 卖主机网站轻量wordpress主题
  • 网站建设规划书结构制作一个自己的网站
  • 外贸网站商城建设做网站和推广
  • 网站建设微信群免费简约ppt模板
  • 哈尔滨网站设计公司哪家更好shopify和wordpress
  • 岚县网站建设网站建设中效果
  • 网站建设软文推广网站建设分金手指排名十四
  • 网站建设要什么知识广州注册公司地址怎么解决
  • 自己可以做开奖网站吗wordpress和hexo
  • 成都网站关键词优化wordpress价格
  • 网站开发后端站建设 app开发网站
  • 毕业设计做网站好的想法开发网站代码量
  • 西宁网站建设排名wordpress的站点地址如何配置
  • 医院网站建设 价格app和网站开发的成本
  • 常见的网站开发工具山东建设厅官方网站李兴军
  • 二级院系网站建设情况做网站域名是什么意思
  • 网站开发双语辽宁省建设厅网站怎样下载表格
  • 网站后台密码怎么修改百度查重免费入口
  • 衡阳网站页面设计公司绍兴网站设计
  • 青岛手机建站多少钱做图表的网站 免费
  • 如何去建立和设计一个公司网站开封建设教育协会网站