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

宝安高端网站建设哪家公司好pageadmin是免费的吗

宝安高端网站建设哪家公司好,pageadmin是免费的吗,开发什么网站,中小企业商务网站建设1、什么是Apache Spark#xff1f;Spark是什么#xff1f; 是基于内存的分布式的大数据并行计算框架#xff0c;可用于构建大型的、低延迟的数据分析应用程序。包含Spark core、Spark sql、Spark streaming 、Spark MLlib 、spark GraphX五个核心组件。 2、Spark的核心组件…1、什么是Apache SparkSpark是什么 是基于内存的分布式的大数据并行计算框架可用于构建大型的、低延迟的数据分析应用程序。包含Spark core、Spark sql、Spark streaming 、Spark MLlib 、spark GraphX五个核心组件。 2、Spark的核心组件是什么 Spark Core是其它组件的基础spark的内核主要包含有向循环图、RDD、Lingage、Cache、broadcast等并封装了底层通讯框架 是Spark的基础。实现了 Spark 的基本功能包含任务调度、内存管理、错误恢复与存储系统交互等模块。还包含了对弹性分布式数据集Resilient Distributed Dataset简称RDD的API 定义。 Spark SQL用于处理结构化数据的模块支持SQL查询和DataFrame API。是Spark用来操作结构化数据的程序包可以使用SQL或者HQL来对历史数据做交互式查询即席查询用户根据自己的需求 自定义查询。Spark SQL 支持多种数据源比如Hive表Parquet 以及 JSON 等。 Spark Streaming是一个对实时数据流进行高通量、容错处理的流式处理系统可以对多种数据源如Kafka、Flume、Twitter、Zero和TCP 套接字 进行类似Map、Reduce和Join等复杂操作将流式计算分解成一系列短小的批处理作业。 MLlibSpark的机器学习库提供了常见的机器学习算法和工具。构建在 Spark 之上的提供常见的机器学习ML功能的程序库支持一系列数据挖掘算法。包括分类、回归、聚类、协同过滤还提供了模型评估、数据导入等额外的支持功能。 GraphXSpark的图计算库用于图处理和分析任务。 3、spark 的资源调度方式spark的有几种部署模式每种模式特点 1Local本地模式运行在一台计算机上的模式通常就是用于在本机上练手和测试。 local只启动一个executor local[k]:启动k个executor local[*]启动跟cpu数目相同的 executor 2Standalone模式分布式部署集群自带完整的服务资源管理和任务监控是Spark自己监控这个模式也是其他模式的基础。构建一个由MasterSlave 构成的 Spark 集群Spark 运行在集群中。 3Spark on yarn模式分布式部署集群资源和任务监控交给yarn管理但是目前仅支持粗粒度资源分配方式包含cluster和client运行模式cluster适合生产driver运行在集群子节点具有容错功能client适合调试dirver运行在客户端。 4Spark On Mesos模式国内不常用官方推荐这种模式当然原因之一是血缘关系。正是由于Spark开发之初就考虑到支持Mesos因此目前而言Spark运行在Mesos上会比运行在YARN上更加灵活更加自然。用户可选择两种调度模式之一运行自己的应用程序 1粗粒度模式Coarse-grained Mode每个应用程序的运行环境由一个Dirver和若干个Executor组成其中每个Executor占用若干资源内部可运行多个Task对应多少个“slot”。应用程序的各个任务正式运行之前需要将运行环境中的资源全部申请好且运行过程中要一直占用这些资源即使不用最后程序运行结束后回收这些资源。 2细粒度模式Fine-grained Mode鉴于粗粒度模式会造成大量资源浪费Spark On Mesos还提供了另外一种调度模式细粒度模式这种模式类似于现在的云计算思想是按需分配。 4、 spark 的特点 运行快基于内存Spark 实现了高效的DAG执行引擎可以通过基于内存来高效处理数据流计算的中间结果是存在于内存中的。 易于使用Spark支持Java、Python和Scala的API还支持超过80种高级算法使用户可以快速构建不同的应用。而Spark支持交互式的Python和Scala的Shell可以非常方便地在这些Shell中使用Spark集群来验证解决问题的方法。 通用Spark提供了统一的解决方案可用于批处理交互式查询实时流处理机器学习和图计算都可以在同一个应用中无缝使用 兼容性Spark可以很方便的与其他的开源产品进行融合。 5、Spark支持哪些数据源和数据格式 Spark支持多种数据源和数据格式包括 文件系统Spark可以读写各种文件系统如HDFS、本地文件系统、S3等。 数据库Spark可以连接和读写关系型数据库如MySQL、PostgreSQL等也支持NoSQL数据库如MongoDB、Cassandra等。 实时数据流Spark支持读取实时数据流如Kafka、Flume等。 数据格式Spark支持常见的数据格式如CSV、JSON、Parquet、Avro等。 6、Spark的数据处理模型中的RDD是什么什么是RDD RDDReslilent Distributed Dataset弹性分布式数据集是Spark中最基本的数据抽象。代码中是一个抽象类它代表一个不可变、可分区、里面的元素可并行计算的集合。 7、RDD的特点是什么 分布式RDD是一个抽象的概念RDD在spark driver中通过RDD来引用数据数据真正存储在节点机的partition上。 只读在Spark中RDD一旦生成了就不能修改。 那么为什么要设置为只读设置为只读的话因为不存在修改并发的吞吐量就上来了。 血缘关系我们需要对RDD进行一系列的操作因为RDD是只读的我们只能不断的生产新的RDD这样新的RDD与原来的RDD就会存在一些血缘关系。 Spark会记录这些血缘关系在后期的容错上会有很大的益处。 缓存当一个 RDD 需要被重复使用时或者当任务失败重新计算的时候这时如果将 RDD 缓存起来就可以避免重新计算保证程序运行的性能。 8、RDD的五大属性RDD的五大特点参考Spark之RDD的五大特性 - 简书 一组分区Partition即数据集的基本组成单位。 一个计算每个分区的函数。 RDD之间的依赖关系。 一个Partitioner即RDD的分片函数。 一个列表存储存取每个Partition的优先位置。 详细内容 1分区列表a list of partitions。Spark RDD是被分区的每一个分区都会被一个计算任务Task处理分区数决定并行计算数量RDD的并行度默认从父RDD传给子RDD。默认情况下一个HDFS上的数据分片就是一个PartitionRDD分片数决定了并行计算的力度可以在创建RDD时指定RDD分片个数如果不指定分区数量当RDD从集合创建时则默认分区数量为该程序所分配到的资源的CPU核数每个Core可以承载24个Partition如果是从HDFS文件创建默认为文件的Block数。 2每一个分区都有一个计算函数a function for computing each split。每个分区都会有计算函数Spark的RDD的计算函数是以分片为基本单位的每个RDD都会实现compute函数对具体的分片进行计算RDD中的分片是并行的所以是分布式并行计算。有一点非常重要就是由于RDD有前后依赖关系遇到宽依赖关系例如遇到reduceBykey等宽依赖操作的算子Spark将根据宽依赖划分StageStage内部通过Pipeline操作通过Block Manager获取相关的数据因为具体的split要从外界读数据也要把具体的计算结果写入外界所以用了一个管理器具体的split都会映射成BlockManager的Block而具体split会被函数处理函数处理的具体形式是以任务的形式进行的。 3依赖于其他RDD的列表a list of dependencies on other RDDs。RDD的依赖关系由于RDD每次转换都会生成新的RDD所以RDD会形成类似流水线的前后依赖关系当然宽依赖就不类似于流水线了宽依赖后面的RDD具体的数据分片会依赖前面所有的RDD的所有的数据分片这时数据分片就不进行内存中的Pipeline这时一般是跨机器的。因为有前后的依赖关系所以当有分区数据丢失的时候Spark会通过依赖关系重新计算算出丢失的数据而不是对RDD所有的分区进行重新计算。RDD之间的依赖有两种窄依赖Narrow Dependency、宽依赖Wide Dependency。RDD是Spark的核心数据结构通过RDD的依赖关系形成调度关系。通过对RDD的操作形成整个Spark程序。 RDD有Narrow Dependency和Wide Dependency两种不同类型的依赖其中的Narrow Dependency指的是每一个parent RDD的Partition最多被child RDD的一个Partition所使用而Wide Dependency指的是多个child RDD的Partition会依赖于同一个parent RDD的Partition。可以从两个方面来理解RDD之间的依赖关系一方面是该RDD的parent RDD是什么另一方面是依赖于parent RDD的哪些Partitions根据依赖于parent RDD的Partitions的不同情况Spark将Dependency分为宽依赖和窄依赖两种。Spark中宽依赖指的是生成的RDD的每一个partition都依赖于父RDD的所有partition宽依赖典型的操作有groupByKey、sortByKey等宽依赖意味着shuffle操作这是Spark划分Stage边界的依据Spark中宽依赖支持两种Shuffle Manager即HashShuffleManager和SortShuffleManager前者是基于Hash的Shuffle机制后者是基于排序的Shuffle机制。Spark 2.2现在的版本中已经没有Hash Shuffle的方式。 4key-value数据类型的RDD分区器-Optionally,a Partitioner for key-value RDDS控制分区策略和分区数。每个key-value形式的RDD都有Partitioner属性它决定了RDD如何分区。当然Partition的个数还决定每个Stage的Task个数。RDD的分片函数想控制RDD的分片函数的时候可以分区Partitioner传入相关的参数如HashPartitioner、RangePartitioner它本身针对key-value的形式如果不是key-value的形式它就不会有具体的Partitioner。Partitioner本身决定了下一步会产生多少并行的分片同时它本身也决定了当前并行parallelizeShuffle输出的并行数据从而使Spark具有能够控制数据在不同节点上分区的特性用户可以自定义分区策略如Hash分区等。Spark提供了“partitionBy”运算符能通过集群对RDD进行数据再分配来创建一个新的RDD。 5每个分区都有一个优先位置列表-Optionally,a list of preferred locations to compute each split on。它会存储每个Partition的优先位置对于一个HDFS文件来说就是每个Partition块的位置。观察运行spark集群的控制台会发现Spark的具体计算具体分片前它已经清楚地知道任务发生在什么节点上也就是说任务本身是计算层面的、代码层面的代码发生运算之前已经知道它要运算的数据在什么地方有具体节点的信息。这就符合大数据中数据不动代码动的特点。数据不动代码动的最高境界是数据就在当前节点的内存中。这时有可能是memory级别或Alluxio级别的Spark本身在进行任务调度时候会尽可能将任务分配到处理数据的数据块所在的具体位置。据Spark的RDD.Scala源码函数getPreferredLocations可知每次计算都符合完美的数据本地性。 9、RDD 的缓存有三种方式 cache、persist、checkPoint。 1、cache 方法不是在被调用的时候立即进行缓存而是当触发了 action 类型的算子之后才会进行缓存。 2、cache 和 persist 的区别 其实 cache 底层实际调用的就是 persist 方法只是缓存的级别默认是 MEMORY_ONLY而 persist 方法可以指定其他的缓存级别。 3、cache 和 checkPoint 的区别 checkPoint 是将数据缓存到本地或者 HDFS 文件存储系统中当某个节点的 executor 宕机了之后缓存的数据不会丢失而通过 cache 缓存的数据就会丢掉。 checkPoint 的时候会把 job 从开始重新再计算一遍因此在 checkPoint 之前最好先进行一步 cache 操作cache 不需要重新计算这样可以节省计算的时间。 4、persist 和 checkPoint 的区别 persist 也可以选择将数据缓存到磁盘当中但是它交给 blockManager 管理的一旦程序运行结束blockManager 也会被停止这时候缓存的数据就会被释放掉。而 checkPoint 持久化的数据并不会被释放是一直存在的可以被其它的程序所使用。 10、RDD的创建方式 1由一个已经存在的Scala数据集合创建由内存中创建 val rdd sc.parallelize(Array(1,2,3,4,5,6,7,8)) val rdd sc.makeRDD(Array(1,2,3,4,5,6,7,8)) 2由外部存储系统的数据集创建包括本地的文件系统还有所有Hadoop支持的数据集比如HDFS、Cassandra、HBase等关系型数据库mysql等 val rdd sc.textFile(hdfs://hadoop10/spark/wc/input/words.txt) 3从其他RDD转化而来 11、什么是RDD宽依赖和窄依赖 RDD和它依赖的parent RDD(s)的关系有两种不同的类型即窄依赖narrow dependency和宽依赖wide dependency 1窄依赖指的是每一个parent RDD的Partition最多被子RDD的一个Partition使用 2宽依赖指的是多个子RDD的Partition会依赖同一个parent RDD的Partition 12、RDD的弹性表现在哪几点 1自动的进行内存和磁盘的存储切换 2基于Lineage的高效容错 3task如果失败会自动进行特定次数的重试 4stage如果失败会自动进行特定次数的重试而且只会计算失败的分片 5checkpoint和persist数据计算之后持久化缓存 6数据调度弹性DAG TASK调度和资源无关 7数据分片的高度弹性。 13、RDD有哪些缺陷 1不支持细粒度的写和更新操作如网络爬虫spark写数据是粗粒度的。所谓粗粒度就是批量写入数据为了提高效率。但是读数据是细粒度的也就是说可以一条条的读。 2不支持增量迭代计算Flink支持。 14、Spark为什么比mapreduce快 1基于内存计算减少低效的磁盘交互 2高效的调度算法基于DAG 3容错机制Linage精华部分就是DAG和Lingae 15、简单说一下hadoop和spark的shuffle相同和差异 1从 high-level 的角度来看两者并没有大的差别。 都是将 mapperSpark 里是 ShuffleMapTask的输出进行 partition不同的 partition 送到不同的 reducerSpark 里 reducer 可能是下一个 stage 里的 ShuffleMapTask也可能是 ResultTask。Reducer 以内存作缓冲区边 shuffle 边 aggregate 数据等到数据 aggregate 好以后进行 reduce() Spark 里可能是后续的一系列操作。 2从 low-level 的角度来看两者差别不小。 Hadoop MapReduce 是 sort-based进入 combine() 和 reduce() 的 records 必须先 sort。这样的好处在于 combine/reduce() 可以处理大规模的数据因为其输入数据可以通过外排得到mapper 对每段数据先做排序reducer 的 shuffle 对排好序的每段数据做归并。目前的 Spark 默认选择的是 hash-based通常使用 HashMap 来对 shuffle 来的数据进行 aggregate不会对数据进行提前排序。如果用户需要经过排序的数据那么需要自己调用类似 sortByKey() 的操作如果你是Spark 1.1的用户可以将spark.shuffle.manager设置为sort则会对数据进行排序。在Spark 1.2中sort将作为默认的Shuffle实现。 3从实现角度来看两者也有不少差别。 Hadoop MapReduce 将处理流程划分出明显的几个阶段map(), spill, merge, shuffle, sort, reduce() 等。每个阶段各司其职可以按照过程式的编程思想来逐一实现每个阶段的功能。在 Spark 中没有这样功能明确的阶段只有不同的 stage 和一系列的 transformation()所以 spill, merge, aggregate 等操作需要蕴含在 transformation() 中。 如果我们将 map 端划分数据、持久化数据的过程称为 shuffle write而将 reducer 读入数据、aggregate 数据的过程称为 shuffle read。那么在 Spark 中问题就变为怎么在 job 的逻辑或者物理执行图中加入 shuffle write 和 shuffle read的处理逻辑以及两个处理逻辑应该怎么高效实现 Shuffle write由于不要求数据有序shuffle write 的任务很简单将数据 partition 好并持久化。之所以要持久化一方面是要减少内存存储空间压力另一方面也是为了 fault-tolerance。 16、Spark为什么要持久化一般什么场景下要进行persist操作 为什么要进行持久化 spark所有复杂一点的算法都会有persist身影spark默认数据放在内存spark很多内容都是放在内存的非常适合高速迭代1000个步骤只有第一个输入数据中间不产生临时数据但分布式系统风险很高所以容易出错就要容错rdd出错或者分片可以根据血统算出来如果没有对父rdd进行persist 或者cache的化就需要重头做。 以下场景会使用persist 1某个步骤计算非常耗时需要进行persist持久化 2计算链条非常长重新恢复要算很多步骤很好使persist 3checkpoint所在的rdd要持久化persist。checkpoint前要持久化写个rdd.cache或者rdd.persist将结果保存起来再写checkpoint操作这样执行起来会非常快不需要重新计算rdd链条了。checkpoint之前一定会进行persist。 4shuffle之后要persistshuffle要进性网络传输风险很大数据丢失重来恢复代价很大 5shuffle之前进行persist框架默认将数据持久化到磁盘这个是框架自动做的。 17、介绍一下join操作优化经验 join其实常见的就分为两类 map-side join 和 reduce-side join。当大表和小表join时用map-side join能显著提高效率。将多份数据进行关联是数据处理过程中非常普遍的用法不过在分布式计算系统中这个问题往往会变的非常麻烦因为框架提供的 join 操作一般会将所有数据根据 key 发送到所有的 reduce 分区中去也就是 shuffle 的过程。造成大量的网络以及磁盘IO消耗运行效率极其低下这个过程一般被称为 reduce-side-join。如果其中有张表较小的话我们则可以自己实现在 map 端实现数据关联跳过大量数据进行 shuffle 的过程运行时间得到大量缩短根据不同数据可能会有几倍到数十倍的性能提升。 备注这个题目面试中非常非常大概率见到务必搜索相关资料掌握这里抛砖引玉。 18、Spark使用parquet文件存储格式能带来哪些好处 1如果说HDFS是大数据时代分布式文件系统首选标准那么parquet则是整个大数据时代文件存储格式实时首选标准。 2速度更快从使用spark sql操作普通文件CSV和parquet文件速度对比上看绝大多数情况会比使用csv等普通文件速度提升10倍左右在一些普通文件系统无法在spark上成功运行的情况下使用parquet很多时候可以成功运行。 3parquet的压缩技术非常稳定出色在spark sql中对压缩技术的处理可能无法正常的完成工作例如会导致lost tasklost executor但是此时如果使用parquet就可以正常的完成。 4极大的减少磁盘I/o,通常情况下能够减少75%的存储空间由此可以极大的减少spark sql处理数据的时候的数据输入内容尤其是在spark1.6x中有个下推过滤器在一些情况下可以极大的减少磁盘的IO和内存的占用下推过滤器。 5spark 1.6x parquet方式极大的提升了扫描的吞吐量极大提高了数据的查找速度spark1.6和spark1.5x相比而言提升了大约1倍的速度在spark1.6X中操作parquet时候cpu也进行了极大的优化有效的降低了cpu消耗。 6采用parquet可以极大的优化spark的调度和执行。我们测试spark如果用parquet可以有效的减少stage的执行消耗同时可以优化执行路径。 19、介绍parition和block有什么关联关系 1hdfs中的block是分布式存储的最小单元等分可设置冗余这样设计有一部分磁盘空间的浪费但是整齐的block大小便于快速找到、读取对应的内容 2Spark中的partion是弹性分布式数据集RDD的最小单元RDD是由分布在各个节点上的partion组成的。partion是指的spark在计算过程中生成的数据在计算空间内最小单元同一份数据RDD的partion大小不一数量不定是根据application里的算子和最初读入的数据分块数量决定 3block位于存储空间、partion位于计算空间block的大小是固定的、partion大小是不固定的是从两个不同的角度去看数据。 20、不需要排序的hash shuffle是否一定比需要排序的sort shuffle速度快 不一定当数据规模小Hash shuffle快于Sorted Shuffle数据规模大的时候当数据量大sorted Shuffle会比Hash shuffle快很多因为数量大的有很多小文件不均匀甚至出现数据倾斜消耗内存大1.x之前spark使用hash适合处理中小规模1.x之后增加了Sorted shuffleSpark更能胜任大规模处理了。 21、Sort-based shuffle的缺陷? 1如果mapper中task的数量过大依旧会产生很多小文件此时在shuffle传递数据的过程中reducer段reduce会需要同时大量的记录进行反序列化导致大量的内存消耗和GC的巨大负担造成系统缓慢甚至崩溃。 2如果需要在分片内也进行排序此时需要进行mapper段和reducer段的两次排序。 22、Spark有哪两种算子 Transformation转化算子和Action执行算子。 23、Spark有哪些聚合类的算子,我们应该尽量避免什么类型的算子 在我们的开发过程中能避免则尽可能避免使用reduceByKey、join、distinct、repartition等会进行shuffle的算子尽量使用map类的非shuffle算子。 这样的话没有shuffle操作或者仅有较少shuffle操作的Spark作业可以大大减少性能开销。 24、Spark并行度怎么设置比较合适 spark并行度每个core承载2~4个partition,如32个core那么64~128之间的并行度也就是设置64~128个partion并行读和数据规模无关 只和内存使用量和cpu使用时间有关。 25、RDD通过Linage记录数据更新的方式为何很高效 1lazy记录了数据的来源RDD是不可变的且是lazy级别的且RDD之间构成了链条lazy是弹性的基石。由于RDD不可变所以每次操作就产生新的rdd 不存在全局修改的问题控制难度下降。 2记录原数据是每次修改都记录代价很大如果修改一个集合代价就很小官方说rdd是粗粒度的操作是为了效率为了简化每次都是操作数据集合 写或者修改操作都是基于集合的rdd的写操作是粗粒度的rdd的读操作既可以是粗粒度的也可以是细粒度读可以读其中的一条条的记录。 3简化复杂度是高效率的一方面写的粗粒度限制了使用场景如网络爬虫现实世界中大多数写是粗粒度的场景。 26、cache后面能不能接其他算子,它是不是action操作 cache可以接其他算子但是接了算子之后起不到缓存应有的效果因为会重新触发cache。 cache不是action操作。 27、为什么要进行序列化序列化 可以减少数据的体积减少存储空间高效存储和传输数据不好的是使用的时候要反序列化非常消耗CPU。 28、一个task的map数量由谁来决定 一般情况下在输入源是文件的时候一个task的map数量由splitSize来决定的 那么splitSize是由以下几个来决定的 goalSize totalSize / mapred.map.tasks inSize max {mapred.min.split.size, minSplitSize} splitSize max (minSize, min(goalSize, dfs.block.size)) 一个task的reduce数量由partition决定。 29、Spark累加器有哪些特点 1累加器在全局唯一的只增不减记录全局集群的唯一状态 2在exe中修改它在driver读取 3executor级别共享的广播变量是task级别的共享两个application不可以共享累加器但是同一个app不同的job可以共享。 30、spark hashParitioner的弊端是什么 HashPartitioner分区的原理很简单对于给定的key计算其hashCode并除于分区的个数取余如果余数小于0则用余数分区的个数最后返回的值就是 这个key所属的分区ID弊端是数据不均匀容易导致数据倾斜极端情况下某几个分区会拥有rdd的所有数据。 31、RangePartitioner分区的原理 RangePartitioner分区则尽量保证每个分区中数据量的均匀而且分区与分区之间是有序的也就是说一个分区中的元素肯定都是比另一个分区内的元素小 或者大但是分区内的元素是不能保证顺序的。简单的说就是将一定范围内的数映射到某一个分区内。其原理是水塘抽样。 32、rangePartioner分区器特点 rangePartioner尽量保证每个分区中数据量的均匀而且分区与分区之间是有序的一个分区中的元素肯定都是比另一个分区内的元素小或者大 但是分区内的元素是不能保证顺序的。简单的说就是将一定范围内的数映射到某一个分区内。RangePartitioner作用将一定范围内的数映射到某一个分区内 在实现中分界的算法尤为重要。算法对应的函数是rangeBounds。 33、union操作是产生宽依赖还是窄依赖 产生窄依赖。 34、窄依赖父RDD的partition和子RDD的parition是不是都是一对一的关系 不一定除了一对一的窄依赖还包含一对固定个数的窄依赖就是对父RDD的依赖的Partition的数量不会随着RDD数量规模的改变而改变 比如join操作的每个partiion仅仅和已知的partition进行join这个join操作是窄依赖依赖固定数量的父rdd因为是确定的partition关系。 35、Hadoop中Mapreduce操作的mapper和reducer阶段相当于spark中的哪几个算子 相当于spark中的map算子和reduceByKey算子当然还是有点区别的,MR会自动进行排序的spark要看你用的是什么partitioner。 36、什么是shuffle以及为什么需要shuffle shuffle中文翻译为洗牌需要shuffle的原因是某种具有共同特征的数据汇聚到一个计算节点上进行计算。
http://www.zqtcl.cn/news/280935/

相关文章:

  • 阿里云域名怎么做网站对网站进行seo优化
  • 响应式网站建设合同11月将现新冠感染高峰
  • 做网站客户一般会问什么问题百度云网盘资源分享网站
  • 网站设计中超链接怎么做艺术设计
  • 卡盟网站建设wordpress优化代码
  • 做网站需要什么技术员商城型网站开发网站建设
  • discuz做地方门户网站网站大全免费完整版
  • 莆田人做的网站一天赚2000加微信
  • 阿里云网站访问不了怎么办做网站二维码
  • 手机商城网站建设可采用的基本方式有
  • 网站备案管理做广告公司网站建设价格
  • 绵阳专业网站建设公司上海外贸公司排名榜
  • 如何做英文系统下载网站快速排名工具免费
  • 苏州建网站必去苏州聚尚网络网页视频提取在线工具
  • 网站建设服务市场分析百度集团
  • 网站怎么企业备案信息做网站业务员如何跟客户沟通
  • 如何网站推广知名的集团门户网站建设费用
  • 网站入口设计规范专门做喷涂设备的网站
  • 最简单网站开发软件有哪些企业管理培训课程培训机构
  • 桂城网站制作公司wordpress 导航网站
  • 一个公司做网站需要注意什么条件网站备案 登陆
  • 百度网站介绍显示图片装修公司一般多少钱一平方
  • 网站销售如何做业绩我找伟宏篷布我做的事ko家的网站
  • 建立网站有哪些步骤?jsp网站开发详细教程
  • 网站怎么做直播功能旅游做攻略用什么网站
  • 企业外贸营销型网站如何写好软文推广
  • 免费建站的网址个人网站建设程序设计
  • 淘宝网站建设违规吗上海大公司
  • 大淘客怎么自己做网站自己开网站能赚钱吗
  • 大型门户网站开发北京网站建设管庄