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

泰安千橙网站建设优化熊掌号色盲测试图片

泰安千橙网站建设优化熊掌号,色盲测试图片,ecshop外贸网站,WordPress问答模板主题【大数据面试题大全】大数据真实面试题(持续更新) 1)Java1.1.Java 中的集合1.2.Java 中的多线程如何实现1.3.Java 中的 JavaBean 怎么进行去重1.4.Java 中 和 equals 有什么区别1.5.Java 中的任务定时调度器 2)SQL2.1.SQL 中的聚…

【大数据面试题大全】大数据真实面试题(持续更新)

  • 1)Java
    • 1.1.Java 中的集合
    • 1.2.Java 中的多线程如何实现
    • 1.3.Java 中的 JavaBean 怎么进行去重
    • 1.4.Java 中 == 和 equals 有什么区别
    • 1.5.Java 中的任务定时调度器
  • 2)SQL
    • 2.1.SQL 中的聚合函数
    • 2.2.SQL 中的各种 join 与区别
    • 2.3.简单说一下 MySQL 中的数据结构
    • 2.4.关系型数据库和大数据组件中的 nosql 数据库有什么区别
  • 3)Linux
  • 4)Hadoop
    • 4.1.Yarn
      • 4.1.1.Yarn 提交作业流程
      • 4.1.2.Yarn 的资源调度
      • 4.1.3.Yarn 成员
    • 4.2.HDFS
      • 4.2.1.HDFS 读写流程
      • 4.2.2.HDFS 中小文件过多会有什么影响
      • 4.2.3.HDFS 中小文件过多怎么处理
      • 4.2.4.HDFS 成员
      • 4.2.5.NameNode 和 SecondaryNameNode 的区别与联系
      • 4.2.6.HDFS 中 Fsimage 与 Edits 详解
    • 4.3.MapReduce
      • 4.3.1.map 阶段的工作机制
      • 4.3.2.reduce 阶段的工作机制
      • 4.3.3.MR 的优劣
      • 4.3.4.MR 的相关配置
  • 5)Hive
    • 5.1.Hive 相关数据的存储位置
    • 5.2.Hive 内外表的区别
    • 5.3.Hive 如何实现分区
    • 5.4.Hive 装载数据
    • 5.5.Hive 修复分区数据
    • 5.6.Hive 中的排序方式及对比
    • 5.7.row_number()、rank()、dense_rank() 的区别:
    • 5.8.Hive 如何实现数据的导入和导出
    • 5.9.Hive 中 over() 的使用
  • 6)Sqoop
    • 6.1.Sqoop 常用命令
    • 6.2.Sqoop 如何进行空值处理
    • 6.3.Sqoop 如何处理特殊字符
    • 6.4.Sqoop 任务有 reduce 阶段吗
  • 7)Oozie
  • 8)Azkaban
  • 9)Flume
    • 9.1.Flume 的架构组件
    • 9.2.Flume 的多种架构
    • 9.3.Flume 的相关配置
  • 10)Kafka
    • 10.1.Kafka为什么这么快
    • 10.2.Kafka 怎么避免重复消费
    • 10.3.Kafka 怎么保证顺序消费
    • 10.4.Kafka 分区有什么作用
    • 10.5.Kafka 如何保证数据不丢失
    • 10.6.消费者与消费者组之间的关系
    • 10.7.Kafka 架构及基本原理
  • 11)HBase
    • 11.1.HBase 的架构组成
    • 11.2.HBase 的读写流程
    • 11.3.HBase 中 rowkey 的设计
    • 11.4.Region 的分区和预分区
    • 11.5.HBase 优缺点

1)Java

作为目前最火爆的开发语言,使用Java已经是大数据开发者的基本技能,很多大数据组件也适用于Java开发,如:Flink

1.1.Java 中的集合

【Java-Java集合】Java集合详解与区别

1.2.Java 中的多线程如何实现

1、继承Thread类。

2、实现Runnable接口。

3、实现Callable接口。

4、线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。

详细https://www.cnblogs.com/big-keyboard/p/16813151.html

1.3.Java 中的 JavaBean 怎么进行去重

1、利用 HashSet,泛型指定我们创建好的 JavaBean,通过 hashSet 中的 add() 方法,进行去重。

public static void main(String[] args) {Date date=new Date();//获取创建好的javaBean对象并进行赋值JavaBean t1 = new JavaBean();t1.setLat("121");t1.setLon("30");t1.setMmsi("11");t1.setUpdateTime(date);//再创建一个javaBean对象,赋同样的值    JavaBean t2=new JavaBean();t2.setLat("121");t2.setLon("30");t2.setMmsi("11");t2.setUpdateTime(date);//用HashSetHashSet<JavaBean> hashSet = new HashSet<JavaBean>();  hashSet.add(t1);  hashSet.add(t2);  System.out.println(hashSet);  System.out.println();for(JavaBean t:hashSet){  //只会出现一个值System.out.println(t);  
} 

2、利用 ArrayList,泛型指定我们创建好的 javaBean,通过 ArrayList 中的 contain() 方法进行判断后去重。

//用List
List<TestMain18> lists = new ArrayList<TestMain18>();if(!lists.contains(t1)){lists.add(0, t1);}if(!lists.contains(t2)){//重写equalslists.add(0, t2);}
System.out.println("长度:"+lists.size());

1.4.Java 中 == 和 equals 有什么区别

==用来判断对象在内存中的地址是否相等,equals用来判断对象中的内容是否相等。

1.5.Java 中的任务定时调度器

1、Timer timer = new Timer() timer.schedule(重写 new TimerTask 方法)

//方式1:
Timer timer = new Timer();
//TimerTask task, 要定时执行的任务
//long delay,延迟多久开始执行
//long period,每隔多久执行延迟
timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("每隔1s执行一次");}
}50001000 );*/

2、Executors.newScheduleThreadPool(线程池数量)返回的对象 scheduleAtFixeRate,重写 run 方法。

//方式2:
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(3);
executorService.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {System.out.println("每隔1s执行一次");}
}51TimeUnit.SECONDS);

3、SprintBoot 中提供了定时任务的相关注解,使用起来特别方便,利用corn定义触发的规则。

@Component//表示该类是Spring的组件,会由Spring创建并管理
@EnableScheduling//表示开启定时任务扫描
public class TestTimedTask2 {//https://cron.qqe2.com/@Scheduled(cron = "0/3 * * * * ? ")public void task(){System.out.println("每隔3s执行一次");}
}

2)SQL

SQL 作为计算机行业最基本的语言之一,也是必须要了解的。

2.1.SQL 中的聚合函数

avg(),max(),min(),sum(),count()

注意

聚合函数不会自己使用,也不会和 where 一起使用,一般使用的时候都是和 group by 一起使用(分组必聚合),还有就是在 having 语句后面进行使用。

2.2.SQL 中的各种 join 与区别

inner join(内连接):就是找到两个表中的交集。

left join(左外连接):以左边的表为主,如果没有与右边的表相对应的用 null 补充在表中。

right join(右外连接):以右边的表为主,同上。

full join(满外连接):Hive 中特有的,MySQL 中没有,保留两边的表的所有内容,没有对应的互相都用 null 补充在表中。

2.3.简单说一下 MySQL 中的数据结构

MySQL的数据结构为 B + 树

【计算机基本原理-数据结构】八大数据结构分类

【计算机基本原理-数据结构】数据结构中树的详解

2.4.关系型数据库和大数据组件中的 nosql 数据库有什么区别

1、关系型数据库的特点:

  • 结构化的存储

  • 采用结构化的查询语言sql

  • 操作数据要具有一致性,比如事务操作

  • 可以进行join等复杂查询

  • 无法进行大量数据的高并发读写

2、nosql数据库的特点:

  • 非结构化的数据库

  • 高并发大数据下读写能力强

  • 事务性差

  • join 的复杂操作能力弱

3)Linux

在大数据环境安装部署、提交 jar 包的时候,都会应用到 Linux 操作系统,所以了解需要了解 Linux 常用命令。

【Linux-Linux常用命令】Linux常用命令总结

4)Hadoop

4.1.Yarn

4.1.1.Yarn 提交作业流程

1、由客户端向 RM 提交任务(MR,Spark…)

2、RM 接收任务,并根据任务随机找一台NM,启动 AppMaster,通知以 container 方式。

container:资源信息容器(节点信息,内存信息,CPU信息),运行:AppMaster

3、指定 NM 启动 AppMaster,启动后和 RM 保持心跳机制,用于报告当前已经启动了,并且通过心跳来传递相关信息。

4、根据 RM 给定任务信息,根据任务信息,对任务进行分配,主要会分配出要启动多少个 map 和多少个 reduce,以及每个 map 和每个 reduce 需要使用多大资源空间,然后将资源申请相关信息发送给 RM(心跳发送)

5、RM 接收到资源申请信息后,将申请信息交给内部资源调度器,由资源调度器,根据相关的资源调度方案,进行资源分配即可,如果当下没有资源,在此处等待。

注意:

资源并不是一次性全部给到 AppMaster,一般会采用极可能满足方案,如果满足不了,会先给与一定资源进行运行,如果空闲资源连一个 container 都不足,就会将这些资源挂起,等待资源充足。

6、AppMaster 基于心跳机制,不断询问RM是否已经准备好了资源了,如果发现已经准备好了,然后直接将资源信息获取。

7、根据资源信息说明,到指定的 NM 上启动 container 资源容器,开始运行相关任务。

8、NM 接收启动的信息后,开始启动执行,此时会和 AppMaster 以及 RM 保持心跳连接。

​ RM 将任务的相关信息根据心跳通知 AppMaster

​ AppMaster 将资源的使用信息根据心跳通知 RM

9、当 NM 运行完成后,会通知 AppMaster 并将资源使用完成情况通知给 RM。

10、AppMaster 告知给 RM 任务已经运行完成了, RM 回收资源,通知AppMaster进行自毁即可。

注意:

当 NM 在运行过程中,如果发生错误了,此时 RM 会立即将资源回收,此时 AppMaster 就需要重新和 RM 申请资源。

详情:【Hadoop-Yarn】Yarn 的运行流程

4.1.2.Yarn 的资源调度

1、FIFO scheduler先进先出调度方案

当一个调度任务进入到调度器之后,那么调度器会优先满足第一个MR任务全部资源,此时就有可能将资源全部都获取到了,导致后续的任务本身的运行时间很短,但是由于第一个MR将资源全部抢走了, 导致后续任务全部等待。

此种调度器在生产中 一般不会使用,因为生产中yarn平台不是你自己的

2、Fair scheduler公平调度器

可以预先分配出多个队列, 相当于对资源进行预先的划分。

3、capacity scheduler容量调度器

此种调度器是有 Yahoo 提供一种调度方案,同时也是当下Apache版本的hadoop默认调度方案。每个队列,可以指定占用多少的百分比的资源,从而保证,大的任务可以有单独的队列来运行,并且小的任务,也可以正常的运行。

4.1.3.Yarn 成员

clustermanager、nodemanager、applicationmaster。

4.2.HDFS

4.2.1.HDFS 读写流程

【Hadoop-HDFS】HDFS的读写流程 & SNN的数据写入流程

4.2.2.HDFS 中小文件过多会有什么影响

HDFS 擅长存储大文件,我们知道,HDFS 中每个文件都有各自的元数据信息,如果 HDFS 中有大量的小文件,就会导致元数据爆炸,集群管理的元数据的内存压力会非常大(namenode 节点)

4.2.3.HDFS 中小文件过多怎么处理

1、使用官方工具 parquet-tools 合并指定的 parquet 文件。

# 合并 HDFS 上的 parquet 文件
hadoop  jar  parquet-tools-1.9.0.jar  merge  /tmp/a.parquet  /tmp/b.parquet
# 合并本地的 parquet 文件
java  -jar  parquet-tools-1.9.0.jar  merge  /tmp/a.parquet  /tmp/b.parquet

2、合并本地的小文件,上传到 HDFS(通过 HDFS 客户端的 appendToFile 命令对小文件进行合并上传)

hdfs dfs -appendToFile user1.txt user2.txt /test/upload/merged_user.txt

3、合并 HDFS 的小文件,下载到本地,可以通过 HDFS 客户端的 getmerge 命令,将很多小文件合并成一个大文件,然后下载到本地,最后重新上传至 HDFS。

hdfs dfs -getmerge /test/upload/user*.txt ./merged_user.txt

4、Hadoop Archives (HAR files)是在 0.18.0 版本中引入到 HDFS 中的,它的出现就是为了缓解大量小文件消耗 NameNode 内存的问题。

HAR 文件是通过在 HDFS 上构建一个分层文件系统来工作。HAR 文件通过 hadoop archive 命令来创建,而这个命令实际上是运行 MapReduce 作业来将小文件打包成少量的 HDFS 文件(将小文件进行合并成几个大文件)

# Usage: hadoop archive -archiveName name -p <parent> <src>  <dest>
# har命令说明
# 参数 “-p” 为 src path 的前缀,src 可以写多个 path
# 归档文件:
hadoop archive -archiveName  m3_monitor.har -p /tmp/test/archive_test/m3_monitor/20220809 /tmp/test/archive# 删除数据源目录:
hdfs dfs -rm -r /tmp/test/archive_test/m3_monitor/20220809
​
# 查看归档文件:
hdfs dfs -ls -R  har:///tmp/test/archive/m3_monitor.har
​
# 解归档:将归档文件内容拷贝到另一个目录
hdfs dfs -cp har:///tmp/test/archive/m3_monitor.har/part-1-7.gz  /tmp/test/

4.2.4.HDFS 成员

namenode、datanode、secondarynamenode;namenode 有 active 和 standby。

4.2.5.NameNode 和 SecondaryNameNode 的区别与联系

SecondaryNameNode 并不是 NameNode 的备份节点,主要是将内存中的 Fsimage 和磁盘上的 Fsimage 文件进行合并。

4.2.6.HDFS 中 Fsimage 与 Edits 详解

【Hadoop-HDFS】HDFS中Fsimage与Edits详解

4.3.MapReduce

4.3.1.map 阶段的工作机制

【Hadoop-MapReduce】MapReduce编程步骤及工作原理(详见标题4:map 阶段的工作机制)

4.3.2.reduce 阶段的工作机制

【Hadoop-MapReduce】MapReduce编程步骤及工作原理(详见标题5:reduce 阶段的工作机制)

4.3.3.MR 的优劣

​不管是 map 阶段还是 reduce 阶段,大量进行磁盘到内存,内存到磁盘相关的 IO 操作,主要目的能够解决处理海量数据计算问题。

  • ​带来好处:能够处理海量的数据。

  • 带来的弊端:造成大量的磁盘 IO 工作导致效率比较低。

4.3.4.MR 的相关配置

配置默认值释义
mapreduce.task.io.sort.mb100设置环型缓冲区的内存值大小
mapreduce.map.sort.spill.percent0.8设置溢写的比例
mapreduce.cluster.local.dir${hadoop.tmp.dir}/mapred/local溢写数据目录
mapreduce.task.io.sort.factor10设置一次合并多少个溢写文件

5)Hive

5.1.Hive 相关数据的存储位置

Hive 的元数据存储在mysql中(默认derby,不支持多客户端访问),数据存储在 HDFS,执行引擎为 MR。

5.2.Hive 内外表的区别

1、建表时用 external 区分。

2、删除外表时删除元数据,删除内表是删除的是元数据和存储数据。

3、外表存储位置自己定,内表存储位置在 /uer/hive/warehouse 中。

5.3.Hive 如何实现分区

1、创建表时指定字段进行分区。

2、使用 alter table 对已经创建完成的表进行分区的增加和删除操作。

# 建表:
create table tablename(col1 string) partitioned by(col2 string);
# 添加分区:
alter table tablename add partition(col2=202101);
# 删除分区:
alter table tablename drop partition(col2=202101);

3、修改分区。

alter table db.tablename
set location '/warehouse/tablespace/external/hive/test.db/tablename'

5.4.Hive 装载数据

alter table db.tablename add if not exists partition (sample_date='20220102',partition_name='r') location '/tmp/db/tablename/sample_date=20220102/partition_name=r';

5.5.Hive 修复分区数据

msck repair table test; 

5.6.Hive 中的排序方式及对比

1、Hive 中的排序方式有:order by,sort by,distribute by,cluster by

2、四种排序方式的区别:

  • order by对数据进行全局排序,只有一个 reduce 工作

  • sort by一般和 distribute by 一起使用,当 task 为 1 时效果和 order by 一样

  • distribute by对 key 进行分区,和 sort by 一起实现对分区内数据的排序工作

  • cluster by当 order by 和 distribute by 的字段相同时可以用 cluster by 代替,但是只能升序

注意

生产环境中使用 sort by 比较少,容易造成 oom,使用 sort by 和 distribute by 较多。

5.7.row_number()、rank()、dense_rank() 的区别:

三者都是对数据进行标号排序

  • row_number()不会出现序号的增加或减少,当数值相同时也会有排名先后之分

  • rank()当排序相同时序号重复,总序不会变化

  • dense_rank()当排序相同时序号重复,总序会减少

5.8.Hive 如何实现数据的导入和导出

  • 导入数据:

    ① load data 的方式可以对本地或HDFS上的数据进行导入

    ② Location方式

    create external if not exists stu2 like student location '/user/hive/warehouse/student/student.txt';
    

    ③ sqoop方式

  • 导出数据:一般用sqoop方式

5.9.Hive 中 over() 的使用

6)Sqoop

6.1.Sqoop 常用命令

【Sqoop-命令】Sqoop相关了解及命令

6.2.Sqoop 如何进行空值处理

导出数据时采用 --input-null-string--input-null-non-string 两个参数。

导入数据时采用 --null-string--null-non-string

6.3.Sqoop 如何处理特殊字符

Sqoop 中遇到特殊字符可以使用 hive-drop-import-delims 丢弃,也可以使用 --hive-delims-replacement,它会将特殊字符替换为我们设定的字符。

6.4.Sqoop 任务有 reduce 阶段吗

只有 map 阶段,没有 reduce 阶段的任务。默认是 4 个 MapTask。

7)Oozie

1、Oozie 一般不单独使用,因为需要配置 xml 文件很麻烦。

2、Oozie 一般与 Hue 一起使用,可以调度各种任务比如 Shell,MR,Hive等。

3、无论是单独使用还是与 Hue 集成,Oozie中最重要的点都在于 workflow 的配置。

4、与 Hue 整合时在 Schedule 中配置定时任务的时间,在 workflow 中配置任务的相关位置信息。

8)Azkaban

1、元数据存储在 Mysql 中。

2、有三种部署模式: solo-server(所有服务在一台服务器上), tow-server(web,executor在不同服务器上),multiple-executor-server(一般不常用)。

3、azkaban的任务调度:

  • Hive脚本: test.sql

    use default;
    drop table aztest;
    create table aztest(id int,name string) row format delimited fields terminated by ',';
    load data inpath '/aztest/hiveinput' into table aztest;c
    reate table azres as select * from aztest;insert overwrite directory '/aztest/hiveoutput' select count(1) from aztest; 
    
  • hive.job(名称.job)

    type=command #固定
    dependencies=xx #有依赖的任务的时候添加这个
    command=/home/hadoop/apps/hive/bin/hive -f 'test.sql'
    
  • 将所有文件打包成 zip 包上传到 Azkaban 上,然后点击 summary,然后选择 schedule 进行时间的配置。

9)Flume

Flume 是一个用来实时采集流数据的分布式数据采集系统,容错性强,可靠性高。

9.1.Flume 的架构组件

(source,channel,sink)

1、Flume 中的 agent:包含 source,channel,sink 的统称。

2、source:是用来采集数据的组件,可以监控一个文件的变化,可以监控一个目录下新文件的变化,可以监控一个目录下所有文件的内容变化,也可以自定义数据源,在配置的时候要配置 source 的名称。

3、channnel:可以配置两种方式进行数据的缓存,一种是内存,另一种是以生成文件的方式。

4、sink:支持 HDFS,Kafka,自定义目标源等,还可以支持下一个 agent。

5、event:Flume 将采集到的数据封装到 event 中进行传输,本质上是一个字节数组。

9.2.Flume 的多种架构

1、Flume 可以以 agent 的方式进行串联。

2、Flume 可以并联,将多个 agent 的 sink 传输到新的 agent 的 source 中。

3、Flume 可以 串联+并联+多sink 等。

9.3.Flume 的相关配置

1、source,channel,sink 的名称。

2、channel 是基于内存还是基于文件。

3、sink 对应的 channel。

4、sink 到 kafka 的话要配置 kafka 的 topic,端口号,ack 等。

10)Kafka

10.1.Kafka为什么这么快

1、查询速度快

  • 分区,文件分段。

  • 二分查找法定位消息在哪个段(文件)中。

2、写入速度快

  • 顺序写入。

  • 零拷贝:数据直接从磁盘文件复制到网卡设备中,不需要经过应用程序之手。零拷贝技术通过 DMA 技术,将文件内容复制到内核模式下的 ReadBuffer,直接将数据内核的数据传递到网卡设备中,所以零拷贝是针对于内核,数据再内核模式下实现了零拷贝。

  • 批量发送:通过 batch.size 参数来设置批量提交数据的大小,默认是16K,当数据积压到这一值时就会统一发送,数据会发送到一个分区中。

  • 数据压缩:Producer 端压缩,Broker 端保持,Consumer 端解压缩。

10.2.Kafka 怎么避免重复消费

可以利用两阶段事务提交(Flink)或者容器去重(HashSet,Redis,布隆过滤器)

10.3.Kafka 怎么保证顺序消费

Kafka 是全局无序但是局部有序,只要我们在推送消息的时候都推送到同一个分区,消费时也指定一个分区消费即可。

10.4.Kafka 分区有什么作用

提升读写效率 + 方便集群扩容 + 消费者负载均衡

10.5.Kafka 如何保证数据不丢失

1、生产者端,设置 ack(0、1、-1 / all)

0:生产者端不会等到 Broker 端返回 ack,继续生产数据。

1:当 Broker 中的 Leader 端收到数据就返回 ack。

-1 / all:当 Broker 中的 Leader 和 所有的Follower 都接收到数据才返回 ack。

2、消费者端,采用先消费后提交的方式,宁愿重复消费也不能让数据丢失。

3、Broker 端:有副本机制保证数据安全性。

10.6.消费者与消费者组之间的关系

同一时间一条消息,只能被同一个消费者组的一个消费者消费,不能被同一个消费者组的其他消费者消费。但是可以被不同消费者的消费者组所消费。

10.7.Kafka 架构及基本原理

【Kafka-架构及基本原理】Kafka生产者、消费者、Broker原理解析 & Kafka原理流程图

11)HBase

11.1.HBase 的架构组成

  • HMaster

  • HRegionServer

  • Region

  • zookeeper

HBase:Client -> Zookeeper -> HRegionServer -> HLog -> Region -> store -> memorystore -> storeFile -> HFile

11.2.HBase 的读写流程

【HBase-读写流程】HBase的读写流程与内部执行机制

11.3.HBase 中 rowkey 的设计

  • Hash

  • 时间戳倒转

11.4.Region 的分区和预分区

  • HBase 在创建表的时候可以指定预分区规则。

  • HBase 建表后和可以通过 split 命令进行分区的更改。

  • HBase 也可以再建表的时候通过 split.txt 文件中的信息通过 SPLIT_FILE 命令进行预分区。

11.5.HBase 优缺点

  • 优点:

    • 支持非结构化数据的存储

    • 相对于关系型数据库HBase采用列式存储,写入的效率很快

    • HBase中的null值不会被记录在内,节省空间并提高了读写性能

    • 支持高并发的读写

    • 支持大量数据的存储工作

  • 缺点:

    • 本身并不支持sql查询

    • 不适合大范围的扫描查询

http://www.dt0577.cn/news/20829.html

相关文章:

  • wordpress 分类目录排序长春百度网站优化
  • 网页设计与网站建设实验报告德国搜索引擎
  • 学校网站的平台用途及建设规划网站搜索引擎推广
  • 免费wap网站建设开发网站需要多少钱
  • 免费搭建手机网站十大免费无代码开发软件
  • 织梦 网站无法显示该页面电商
  • 做网站推广都有哪些行业阿里云域名查询和注册
  • 开发大型网站的最主流语言汨罗网站seo
  • 专业建站lhznkj百度收录时间
  • 织梦模板更新网站磁力帝
  • 舟山网站建设seo工具
  • 做it软件的网站企业网站推广建议
  • 如何用文档做网站天津seo顾问
  • 做全网营销型网站建设近期国际新闻
  • 北京建设委网站网站搭建软件
  • 怎么看网站banner尺寸做网站的步骤
  • 线上推广公司排名seo网站推广排名
  • 广州网站设计网站制作营销技巧培训ppt
  • html语言做的网站和asp的区别bt种子磁力搜索
  • 动态网站登录加注册怎么做郑州官网网络营销外包
  • 视频网站怎么做压力测试海淀区seo搜索引擎
  • 网站建设基础ppt互联网广告营销方案
  • 独立商城系统网站建设国际新闻最新消息10条
  • wordpress 文章在数据库seo包年优化平台
  • 内涵吧网站免费搭建网站
  • 哪个网站有上门做指甲鼓楼网页seo搜索引擎优化
  • 旅游网站做精准营销的百度服务中心人工24小时电话
  • 万网个人网站建设教程广州seo黑帽培训
  • 个人网站怎么做推广网络广告宣传怎么做
  • 佳木斯网站设计全国防疫大数据平台