大数据开发常用算法 浅谈大数据开发初学路线

电子说

1.2w人已加入

描述

  本文主要是关于大数据开发的相关介绍,并着重对大数据开发的算法运算进行了详尽的阐述。

  大数据

  大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 [1]

  在维克托·迈尔-舍恩伯格及肯尼斯·库克耶编写的《大数据时代》 [2] 中大数据指不用随机分析法(抽样调查)这样捷径,而采用所有数据进行分析处理。大数据的5V特点(IBM提出):Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Veracity(真实性)。

  大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 [1]

  在维克托·迈尔-舍恩伯格及肯尼斯·库克耶编写的《大数据时代》 [2] 中大数据指不用随机分析法(抽样调查)这样捷径,而采用所有数据进行分析处理。大数据的5V特点(IBM提出):Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Veracity(真实性)。

  对于“大数据”(Big data)研究机构Gartner给出了这样的定义。“大数据”是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力来适应海量、高增长率和多样化的信息资产。 [1]

  麦肯锡全球研究所给出的定义是:一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有海量的数据规模、快速的数据流转、多样的数据类型和价值密度低四大特征。 [4]

  大数据技术的战略意义不在于掌握庞大的数据信息,而在于对这些含有意义的数据进行专业化处理。换而言之,如果把大数据比作一种产业,那么这种产业实现盈利的关键,在于提高对数据的“加工能力”,通过“加工”实现数据的“增值”。 [5]

  从技术上看,大数据与云计算的关系就像一枚硬币的正反面一样密不可分。大数据必然无法用单台的计算机进行处理,必须采用分布式架构。它的特色在于对海量数据进行分布式数据挖掘。但它必须依托云计算的分布式处理、分布式数据库和云存储、虚拟化技术。 [2]

  随着云时代的来临,大数据(Big data)也吸引了越来越多的关注。分析师团队认为,大数据(Big data)通常用来形容一个公司创造的大量非结构化数据和半结构化数据,这些数据在下载到关系型数据库用于分析时会花费过多时间和金钱。大数据分析常和云计算联系到一起,因为实时的大型数据集分析需要像MapReduce一样的框架来向数十、数百或甚至数千的电脑分配工作。

  大数据需要特殊的技术,以有效地处理大量的容忍经过时间内的数据。适用于大数据的技术,包括大规模并行处理(MPP)数据库、数据挖掘、分布式文件系统、分布式数据库、云计算平台、互联网和可扩展的存储系统。

  最小的基本单位是bit,按顺序给出所有单位:bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB。

  它们按照进率1024(2的十次方)来计算:

  1 Byte =8 bit

  1 KB = 1,024 Bytes = 8192 bit

  1 MB = 1,024 KB = 1,048,576 Bytes

  1 GB = 1,024 MB = 1,048,576 KB

  1 TB = 1,024 GB = 1,048,576 MB

  1 PB = 1,024 TB = 1,048,576 GB

  1 EB = 1,024 PB = 1,048,576 TB

  1 ZB = 1,024 EB = 1,048,576 PB

  1 YB = 1,024 ZB = 1,048,576 EB

  1 BB = 1,024 YB = 1,048,576 ZB

  1 NB = 1,024 BB = 1,048,576 YB

  1 DB = 1,024 NB = 1,048,576 BB

  全称:

  1 Bit(比特) =Binary Digit

  8Bits = 1 Byte(字节)

  1,000 Bytes = 1 Kilobyte

  1,000Kilobytes = 1 Megabyte

  1,000 Megabytes = 1 Gigabyte

  1,000 Gigabytes = 1Terabyte

  1,000 Terabytes = 1 Petabyte

  1,000 Petabytes = 1 Exabyte

  1,000Exabytes = 1 Zettabyte

  1,000 Zettabytes = 1 Yottabyte

  1,000 Yottabytes = 1Brontobyte

  1,000 Brontobytes = 1 Geopbyte

  特征

  容量(Volume):数据的大小决定所考虑的数据的价值和潜在的信息; [6]

  种类(Variety):数据类型的多样性; [6]

  速度(Velocity):指获得数据的速度; [6]

  可变性(Variability):妨碍了处理和有效地管理数据的过程。 [6]

  真实性(Veracity):数据的质量 [6]

  复杂性(Complexity):数据量巨大,来源多渠道 [6]

  价值(value):合理运用大数据,以低成本创造高价值

  大数据开发常用算法

  奥地利符号计算研究所(Research Institute for Symbolic Computation,简称RISC)的Christoph Koutschan博士在自己的页面上发布了一篇文章,提到他做了一个调查,参与者大多数是计算机科学家,他请这些科学家投票选出最重要的算法,以下是这次调查的结果,按照英文名称字母顺序排序。

  1、A* 搜索算法——图形搜索算法,从给定起点到给定终点计算出路径。其中使用了一种启发式的估算,为每个节点估算通过该节点的最佳路径,并以之为各个地点排定次序。算法以得到的次序访问这些节点。因此,A*搜索算法是最佳优先搜索的范例。

  2、集束搜索(又名定向搜索,Beam Search)——最佳优先搜索算法的优化。使用启发式函数评估它检查的每个节点的能力。不过,集束搜索只能在每个深度中发现最前面的m个最符合条件的节点,m是固定数字——集束的宽度。

  3、二分查找(Binary Search)——在线性数组中找特定值的算法,每个步骤去掉一半不符合要求的数据。

  4、分支界定算法(Branch and Bound)——在多种最优化问题中寻找特定最优化解决方案的算法,特别是针对离散、组合的最优化。

  5、Buchberger算法——一种数学算法,可将其视为针对单变量最大公约数求解的欧几里得算法和线性系统中高斯消元法的泛化。

  6、数据压缩——采取特定编码方案,使用更少的字节数(或是其他信息承载单元)对信息编码的过程,又叫来源编码。

  7、Diffie-Hellman密钥交换算法——一种加密协议,允许双方在事先不了解对方的情况下,在不安全的通信信道中,共同建立共享密钥。该密钥以后可与一个对称密码一起,加密后续通讯。

  8、Dijkstra算法——针对没有负值权重边的有向图,计算其中的单一起点最短算法。

  9、离散微分算法(Discrete differentiation)。

  10、动态规划算法(Dynamic Programming)——展示互相覆盖的子问题和最优子架构算法

  11、欧几里得算法(Euclidean algorithm)——计算两个整数的最大公约数。最古老的算法之一,出现在公元前300前欧几里得的《几何原本》。

  12、期望-最大算法(Expectation-maximization algorithm,又名EM-Training)——在统计计算中,期望-最大算法在概率模型中寻找可能性最大的参数估算值,其中模型依赖于未发现的潜在变量。EM在两个步骤中交替计算,第一步是计算期望,利用对隐藏变量的现有估计值,计算其最大可能估计值;第二步是最大化,最大化在第一步上求得的最大可能值来计算参数的值。

  13、快速傅里叶变换(Fast Fourier transform,FFT)——计算离散的傅里叶变换(DFT)及其反转。该算法应用范围很广,从数字信号处理到解决偏微分方程,到快速计算大整数乘积。

  14、梯度下降(Gradient descent)——一种数学上的最优化算法。

  15、哈希算法(Hashing)。

  16、堆排序(Heaps)。

  17、Karatsuba乘法——需要完成上千位整数的乘法的系统中使用,比如计算机代数系统和大数程序库,如果使用长乘法,速度太慢。该算法发现于1962年。

  18、LLL算法(Lenstra-Lenstra-Lovasz lattice reduction)——以格规约(lattice)基数为输入,输出短正交向量基数。LLL算法在以下公共密钥加密方法中有大量使用:背包加密系统(knapsack)、有特定设置的RSA加密等等。

  19、最大流量算法(Maximum flow)——该算法试图从一个流量网络中找到最大的流。它优势被定义为找到这样一个流的值。最大流问题可以看作更复杂的网络流问题的特定情况。最大流与网络中的界面有关,这就是最大流-最小截定理(Max-flow min-cut theorem)。Ford-Fulkerson 能找到一个流网络中的最大流。

  20、合并排序(Merge Sort)。

  21、牛顿法(Newton‘s method)——求非线性方程(组)零点的一种重要的迭代法。

  22、Q-learning学习算法——这是一种通过学习动作值函数(action-value function)完成的强化学习算法,函数采取在给定状态的给定动作,并计算出期望的效用价值,在此后遵循固定的策略。Q-leanring的优势是,在不需要环境模型的情况下,可以对比可采纳行动的期望效用。

  23、两次筛法(Quadratic Sieve)——现代整数因子分解算法,在实践中,是目前已知第二快的此类算法(仅次于数域筛法Number Field Sieve)。对于110位以下的十位整数,它仍是最快的,而且都认为它比数域筛法更简单。

  24、RANSAC——是“RANdom SAmple Consensus”的缩写。该算法根据一系列观察得到的数据,数据中包含异常值,估算一个数学模型的参数值。其基本假设是:数据包含非异化值,也就是能够通过某些模型参数解释的值,异化值就是那些不符合模型的数据点。

  25、RSA——公钥加密算法。首个适用于以签名作为加密的算法。RSA在电商行业中仍大规模使用,大家也相信它有足够安全长度的公钥。

  26、Schönhage-Strassen算法——在数学中,Schönhage-Strassen算法是用来完成大整数的乘法的快速渐近算法。其算法复杂度为:O(N log(N) log(log(N))),该算法使用了傅里叶变换。

  27、单纯型算法(Simplex Algorithm)——在数学的优化理论中,单纯型算法是常用的技术,用来找到线性规划问题的数值解。线性规划问题包括在一组实变量上的一系列线性不等式组,以及一个等待最大化(或最小化)的固定线性函数。

  28、奇异值分解(Singular value decomposition,简称SVD)——在线性代数中,SVD是重要的实数或复数矩阵的分解方法,在信号处理和统计中有多种应用,比如计算矩阵的伪逆矩阵(以求解最小二乘法问题)、解决超定线性系统(overdetermined linear systems)、矩阵逼近、数值天气预报等等。

  29、求解线性方程组(Solving a system of linear equations)——线性方程组是数学中最古老的问题,它们有很多应用,比如在数字信号处理、线性规划中的估算和预测、数值分析中的非线性问题逼近等等。求解线性方程组,可以使用高斯—约当消去法(Gauss-Jordan elimination),或是柯列斯基分解( Cholesky decomposition)。

  30、Strukturtensor算法——应用于模式识别领域,为所有像素找出一种计算方法,看看该像素是否处于同质区域( homogenous region),看看它是否属于边缘,还是是一个顶点。

  31、合并查找算法(Union-find)——给定一组元素,该算法常常用来把这些元素分为多个分离的、彼此不重合的组。不相交集(disjoint-set)的数据结构可以跟踪这样的切分方法。合并查找算法可以在此种数据结构上完成两个有用的操作:

  查找:判断某特定元素属于哪个组。

  合并:联合或合并两个组为一个组。

  32、维特比算法(Viterbi algorithm)——寻找隐藏状态最有可能序列的动态规划算法,这种序列被称为维特比路径,其结果是一系列可以观察到的事件,特别是在隐藏的Markov模型中。

  大数据开发初学者学习路线

  1.1 学会百度与Google

  不论遇到什么问题,先试试搜索并自己解决。

  Google首选,翻不过去的,就用百度吧。

  1.2 参考资料首选官方文档

  特别是对于入门来说,官方文档永远是首选文档。

  相信搞这块的大多是文化人,英文凑合就行,实在看不下去的,请参考第一步。

  1.3 先让Hadoop跑起来

  Hadoop可以算是大数据存储和计算的开山鼻祖,现在大多开源的大数据框架都依赖Hadoop或者与它能很好的兼容。

  关于Hadoop,你至少需要搞清楚以下是什么:

  Hadoop 1.0、Hadoop 2.0

  MapReduce、HDFS

  NameNode、DataNode

  JobTracker、TaskTracker

  Yarn、ResourceManager、NodeManager

  自己搭建Hadoop,请使用第一步和第二步,能让它跑起来就行。

  建议先使用安装包命令行安装,不要使用管理工具安装。

  另外:Hadoop1.0知道它就行了,现在都用Hadoop 2.0.

  1.4 试试使用Hadoop

  HDFS目录操作命令;

  上传、下载文件命令;

  提交运行MapReduce示例程序;

  打开Hadoop WEB界面,查看Job运行状态,查看Job运行日志。

  知道Hadoop的系统日志在哪里。

  1.5 你该了解它们的原理了

  MapReduce:如何分而治之;

  HDFS:数据到底在哪里,什么是副本;

  Yarn到底是什么,它能干什么;

  NameNode到底在干些什么;

  ResourceManager到底在干些什么;

  1.6 自己写一个MapReduce程序

  请仿照WordCount例子,自己写一个(照抄也行)WordCount程序,

  打包并提交到Hadoop运行。

  你不会Java?Shell、Python都可以,有个东西叫Hadoop Streaming。

  如果你认真完成了以上几步,恭喜你,你的一只脚已经进来了。

  第二章:更高效的WordCount

  2.1 学点SQL吧

  你知道数据库吗?你会写SQL吗?

  如果不会,请学点SQL吧。

  2.2 SQL版WordCount

  在1.6中,你写(或者抄)的WordCount一共有几行代码?

  给你看看我的:

  SELECT word,COUNT(1) FROM wordcount GROUP BY word;

  这便是SQL的魅力,编程需要几十行,甚至上百行代码,我这一句就搞定;使用SQL处理分析Hadoop上的数据,方便、高效、易上手、更是趋势。不论是离线计算还是实时计算,越来越多的大数据处理框架都在积极提供SQL接口。

  2.3 SQL On Hadoop之Hive

  什么是Hive?官方给的解释是:

  The Apache Hive data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage and queried using SQL syntax.

  为什么说Hive是数据仓库工具,而不是数据库工具呢?有的朋友可能不知道数据仓库,数据仓库是逻辑上的概念,底层使用的是数据库,数据仓库中的数据有这两个特点:最全的历史数据(海量)、相对稳定的;所谓相对稳定,指的是数据仓库不同于业务系统数据库,数据经常会被更新,数据一旦进入数据仓库,很少会被更新和删除,只会被大量查询。而Hive,也是具备这两个特点,因此,Hive适合做海量数据的数据仓库工具,而不是数据库工具。

  2.4 安装配置Hive

  请参考1.1 和 1.2 完成Hive的安装配置。可以正常进入Hive命令行。

  2.5 试试使用Hive

  请参考1.1 和 1.2 ,在Hive中创建wordcount表,并运行2.2中的SQL语句。

  在Hadoop WEB界面中找到刚才运行的SQL任务。

  看SQL查询结果是否和1.4中MapReduce中的结果一致。

  2.6 Hive是怎么工作的

  明明写的是SQL,为什么Hadoop WEB界面中看到的是MapReduce任务?

  2.7 学会Hive的基本命令

  创建、删除表;

  加载数据到表;

  下载Hive表的数据;

  请参考1.2,学习更多关于Hive的语法和命令。

  如果你已经按照《写给大数据开发初学者的话》中第一章和第二章的流程认真完整的走了一遍,那么你应该已经具备以下技能和知识点:

  0和Hadoop2.0的区别;

  MapReduce的原理(还是那个经典的题目,一个10G大小的文件,给定1G大小的内存,如何使用Java程序统计出现次数最多的10个单词及次数);

  HDFS读写数据的流程;向HDFS中PUT数据;从HDFS中下载数据;

  自己会写简单的MapReduce程序,运行出现问题,知道在哪里查看日志;

  会写简单的SELECT、WHERE、GROUP BY等SQL语句;

  Hive SQL转换成MapReduce的大致流程;

  Hive中常见的语句:创建表、删除表、往表中加载数据、分区、将表中数据下载到本地;

  从上面的学习,你已经了解到,HDFS是Hadoop提供的分布式存储框架,它可以用来存储海量数据,MapReduce是Hadoop提供的分布式计算框架,它可以用来统计和分析HDFS上的海量数据,而Hive则是SQL On Hadoop,Hive提供了SQL接口,开发人员只需要编写简单易上手的SQL语句,Hive负责把SQL翻译成MapReduce,提交运行。

  此时,你的”大数据平台”是这样的:

  那么问题来了,海量数据如何到HDFS上呢?

  第三章:把别处的数据搞到Hadoop上

  此处也可以叫做数据采集,把各个数据源的数据采集到Hadoop上。

  3.1 HDFS PUT命令

  这个在前面你应该已经使用过了。

  put命令在实际环境中也比较常用,通常配合shell、python等脚本语言来使用。

  建议熟练掌握。

  3.2 HDFS API

  HDFS提供了写数据的API,自己用编程语言将数据写入HDFS,put命令本身也是使用API。

  实际环境中一般自己较少编写程序使用API来写数据到HDFS,通常都是使用其他框架封装好的方法。比如:Hive中的INSERT语句,Spark中的saveAsTextfile等。

  建议了解原理,会写Demo。

  3.3 Sqoop

  Sqoop是一个主要用于Hadoop/Hive与传统关系型数据库

  Oracle/MySQL/SQLServer等之间进行数据交换的开源框架。

  就像Hive把SQL翻译成MapReduce一样,Sqoop把你指定的参数翻译成MapReduce,提交到Hadoop运行,完成Hadoop与其他数据库之间的数据交换。

  自己下载和配置Sqoop(建议先使用Sqoop1,Sqoop2比较复杂)。

  了解Sqoop常用的配置参数和方法。

  使用Sqoop完成从MySQL同步数据到HDFS;

  使用Sqoop完成从MySQL同步数据到Hive表;

  PS:如果后续选型确定使用Sqoop作为数据交换工具,那么建议熟练掌握,否则,了解和会用Demo即可。

  3.4 Flume

  Flume是一个分布式的海量日志采集和传输框架,因为“采集和传输框架”,所以它并不适合关系型数据库的数据采集和传输。

  Flume可以实时的从网络协议、消息系统、文件系统采集日志,并传输到HDFS上。

  因此,如果你的业务有这些数据源的数据,并且需要实时的采集,那么就应该考虑使用Flume。

  下载和配置Flume。

  使用Flume监控一个不断追加数据的文件,并将数据传输到HDFS;

  PS:Flume的配置和使用较为复杂,如果你没有足够的兴趣和耐心,可以先跳过Flume。

  3.5 阿里开源的DataX

  之所以介绍这个,是因为我们公司目前使用的Hadoop与关系型数据库数据交换的工具,就是之前基于DataX开发的,非常好用。

  可以参考我的博文《异构数据源海量数据交换工具-Taobao DataX 下载和使用》。

  现在DataX已经是3.0版本,支持很多数据源。

  你也可以在其之上做二次开发。

  PS:有兴趣的可以研究和使用一下,对比一下它与Sqoop。

  如果你认真完成了上面的学习和实践,此时,你的”大数据平台”应该是这样的:

  第四章:把Hadoop上的数据搞到别处去

  前面介绍了如何把数据源的数据采集到Hadoop上,数据到Hadoop上之后,便可以使用Hive和MapReduce进行分析了。那么接下来的问题是,分析完的结果如何从Hadoop上同步到其他系统和应用中去呢?

  其实,此处的方法和第三章基本一致的。

  4.1 HDFS GET命令

  把HDFS上的文件GET到本地。需要熟练掌握。

  4.2 HDFS API

  同3.2.

  4.3 Sqoop

  同3.3.

  使用Sqoop完成将HDFS上的文件同步到MySQL;

  使用Sqoop完成将Hive表中的数据同步到MySQL;

  4.4 DataX

  同3.5.

  如果你认真完成了上面的学习和实践,此时,你的”大数据平台”应该是这样的:

  如果你已经按照《写给大数据开发初学者的话2》中第三章和第四章的流程认真完整的走了一遍,那么你应该已经具备以下技能和知识点:

  知道如何把已有的数据采集到HDFS上,包括离线采集和实时采集;

  你已经知道sqoop(或者还有DataX)是HDFS和其他数据源之间的数据交换工具;

  你已经知道flume可以用作实时的日志采集。

  从前面的学习,对于大数据平台,你已经掌握的不少的知识和技能,搭建Hadoop集群,把数据采集到Hadoop上,使用Hive和MapReduce来分析数据,把分析结果同步到其他数据源。

  接下来的问题来了,Hive使用的越来越多,你会发现很多不爽的地方,特别是速度慢,大多情况下,明明我的数据量很小,它都要申请资源,启动MapReduce来执行。

  第五章:快一点吧,我的SQL

  其实大家都已经发现Hive后台使用MapReduce作为执行引擎,实在是有点慢。

  因此SQL On Hadoop的框架越来越多,按我的了解,最常用的按照流行度依次为SparkSQL、Impala和Presto.

  这三种框架基于半内存或者全内存,提供了SQL接口来快速查询分析Hadoop上的数据。关于三者的比较,请参考1.1.

  我们目前使用的是SparkSQL,至于为什么用SparkSQL,原因大概有以下吧:

  使用Spark还做了其他事情,不想引入过多的框架;

  Impala对内存的需求太大,没有过多资源部署;

  5.1 关于Spark和SparkSQL

  什么是Spark,什么是SparkSQL。

  Spark有的核心概念及名词解释。

  SparkSQL和Spark是什么关系,SparkSQL和Hive是什么关系。

  SparkSQL为什么比Hive跑的快。

  5.2 如何部署和运行SparkSQL

  Spark有哪些部署模式?

  如何在Yarn上运行SparkSQL?

  使用SparkSQL查询Hive中的表。

  PS: Spark不是一门短时间内就能掌握的技术,因此建议在了解了Spark之后,可以先从SparkSQL入手,循序渐进。

  关于Spark和SparkSQL,可参考

  http://lxw1234.com/archives/category/spark

  如果你认真完成了上面的学习和实践,此时,你的”大数据平台”应该是这样的:

  第六章:一夫多妻制

  请不要被这个名字所诱惑。其实我想说的是数据的一次采集、多次消费。

  在实际业务场景下,特别是对于一些监控日志,想即时的从日志中了解一些指标(关于实时计算,后面章节会有介绍),这时候,从HDFS上分析就太慢了,尽管是通过Flume采集的,但Flume也不能间隔很短就往HDFS上滚动文件,这样会导致小文件特别多。

  为了满足数据的一次采集、多次消费的需求,这里要说的便是Kafka。

  6.1 关于Kafka

  什么是Kafka?

  Kafka的核心概念及名词解释。

  6.2 如何部署和使用Kafka

  

  使用单机部署Kafka,并成功运行自带的生产者和消费者例子。

  使用Java程序自己编写并运行生产者和消费者程序。

  Flume和Kafka的集成,使用Flume监控日志,并将日志数据实时发送至Kafka。

  如果你认真完成了上面的学习和实践,此时,你的”大数据平台”应该是这样的:

  这时,使用Flume采集的数据,不是直接到HDFS上,而是先到Kafka,Kafka中的数据可以由多个消费者同时消费,其中一个消费者,就是将数据同步到HDFS。

  如果你已经按照《写给大数据开发初学者的话3》中第五章和第六章的流程认真完整的走了一遍,那么你应该已经具备以下技能和知识点:

  为什么Spark比MapReduce快。

  使用SparkSQL代替Hive,更快的运行SQL。

  使用Kafka完成数据的一次收集,多次消费架构。

  自己可以写程序完成Kafka的生产者和消费者。

  从前面的学习,你已经掌握了大数据平台中的数据采集、数据存储和计算、数据交换等大部分技能,而这其中的每一步,都需要一个任务(程序)来完成,各个任务之间又存在一定的依赖性,比如,必须等数据采集任务成功完成后,数据计算任务才能开始运行。如果一个任务执行失败,需要给开发运维人员发送告警,同时需要提供完整的日志来方便查错。

  结语

  关于大数据开发的相关介绍就到这了,如有不足之处欢迎指正。

相关阅读推荐:一文告诉你工厂如何利用大数据

相关阅读推荐:大数据时代信息保护遭挑战

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分