当前位置:首页 » 编程软件 » hadoop编程

hadoop编程

发布时间: 2022-06-28 00:48:05

❶ 怎么做hadoop编程

自定义 MR 实现如下逻辑

proct_no lac_id moment start_time user_id county_id staytime city_id13429100031 22554 8 2013-03-11 08:55:19.151754088 571 571 282 571
13429100082 22540 8 2013-03-11 08:58:20.152622488 571 571 270 571
13429100082 22691 8 2013-03-11 08:56:37.149593624 571 571 103 571
13429100087 22705 8 2013-03-11 08:56:51.139539816 571 571 220 571
13429100087 22540 8 2013-03-11 08:55:45.150276800 571 571 66 571
13429100082 22540 8 2013-03-11 08:55:38.140225200 571 571 133 571
13429100140 26642 9 2013-03-11 09:02:19.151754088 571 571 18 571
13429100082 22691 8 2013-03-11 08:57:32.151754088 571 571 287 571
13429100189 22558 8 2013-03-11 08:56:24.139539816 571 571 48 571
13429100349 22503 8 2013-03-11 08:54:30.152622440 571 571 211 5711234567891011

字段解释:
proct_no:用户手机号;
lac_id:用户所在基站;
start_time:用户在此基站的开始时间;
staytime:用户在此基站的逗留时间。
需求描述:
根据 lac_id 和 start_time 知道用户当时的位置,根据 staytime 知道用户各个基站的逗留时长。根据轨迹合
并连续基站的 staytime。最终得到每一个用户按时间排序在每一个基站驻留时长。
期望输出举例:

13429100082 22540 8 2013-03-11 08:58:20.152622488 571 571 270 571
13429100082 22691 8 2013-03-11 08:56:37.149593624 571 571 390 571
13429100082 22540 8 2013-03-11 08:55:38.140225200 571 571 133 571
13429100087 22705 8 2013-03-11 08:56:51.139539816 571 571 220 571
13429100087 22540 8 2013-03-11 08:55:45.150276800 571 571 66 57112345

分析上面的结果:
第一列升序,第四列时间降序。因此,首先需要将这两列抽取出来,然后自定义排序。

实现如下:

package FindFriend;import java.io.DataInput;import java.io.DataOutput;import java.io.IOException;import java.net.URI;import java.net.URISyntaxException;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.NullWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.io.WritableComparable;import org.apache.hadoop.maprece.Job;import org.apache.hadoop.maprece.Mapper;import org.apache.hadoop.maprece.Recer;import org.apache.hadoop.maprece.lib.input.FileInputFormat;import org.apache.hadoop.maprece.lib.output.FileOutputFormat;public class StringComp2 {
final static String INPUT_PATH = "hdfs://master:8020/liguodong/test2"; final static String OUT_PATH = "hdfs://master:8020/liguodong/test2out"; public static void main(String[] args) throws IOException,
URISyntaxException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration(); final FileSystem fs = FileSystem.get(new URI(INPUT_PATH), conf); if(fs.exists(new Path(OUT_PATH))){
fs.delete(new Path(OUT_PATH),true);
}

Job job = Job.getInstance(conf, "date sort");

job.setJarByClass(StringComp2.class);

job.setMapperClass(MyMapper.class);
job.setMapOutputKeyClass(NewK2.class);
job.setMapOutputValueClass(Text.class); //job.setCombinerClass(MyRecer.class);
job.setRecerClass(MyRecer.class);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);

FileInputFormat.addInputPath(job, new Path(INPUT_PATH));
FileOutputFormat.setOutputPath(job,new Path(OUT_PATH));

System.exit(job.waitForCompletion(true)?0:1);
} static class MyMapper extends Mapper<LongWritable, Text, NewK2, Text>{ @Override
protected void map(LongWritable k1, Text v1,
Context context) throws IOException, InterruptedException { //这里采用正则表达式抽取出了proct_no 与 start_time列的数据。
Pattern pattern = Pattern.compile
("([\d]{11})|([\d]{4}-[\d]{2}-[\d]{2} [\d]{2}:[\d]{2}:[\d]{2}.[\d]{9})");
Matcher matcher = pattern.matcher(v1.toString());
matcher.find();
String str1= matcher.group();
matcher.find();
String str2= matcher.group(); final NewK2 k2 = new NewK2(str1, str2); //System.err.println(stringBuilder);
context.write(k2, v1);
}

} static class MyRecer extends Recer<NewK2, Text, Text, NullWritable>{ @Override
protected void rece(NewK2 k2, Iterable<Text> v2s, Context context) throws IOException, InterruptedException { for (Text v2 : v2s) {
context.write(v2,NullWritable.get());
}

}

} static class NewK2 implements WritableComparable<NewK2>{
String first;
String second; public NewK2(){} public NewK2(String first, String second){ this.first = first; this.second = second;
} @Override
public void readFields(DataInput in) throws IOException { this.first = in.readUTF(); this.second = in.readUTF();
} @Override
public void write(DataOutput out) throws IOException {
out.writeUTF(first);
out.writeUTF(second);
} /**
* 当k2进行排序时,会调用该方法.
* 当第一列不同时,升序;当第一列相同时,第二列降序
*/
@Override
public int compareTo(NewK2 o) { final int minus = compTo(this.first,o.first); if(minus != 0){ return minus;
} return -compTo(this.second,o.second);
} //仿照JDK源码String类的compareTo方法进行实现,
//我发现直接使用String类的compareTo方法,并不能得到我想要的结果(第一列升序,第二列降序)。
public int compTo(String one,String another) { int len = one.length(); char[] v1 = one.toCharArray(); char[] v2 = another.toCharArray(); int k = 0; while (k < len) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2;
}
k++;
} return 0;
} @Override
public int hashCode() { return this.first.hashCode()+this.second.hashCode();
} @Override
public boolean equals(Object obj) { if(!(obj instanceof NewK2)){ return false;
}
NewK2 oK2 = (NewK2)obj; return (this.first==oK2.first)&&(this.second==oK2.second);
}
}
}155156157158159160161162

运行结果:

❷ 大数据/Hadoop平台开发工程师是做什么的

大数据工程师做什么?需要具备什么能力?
大数据是眼下非常时髦的技术名词,与此同时自然也催生出了一些与大数据处理相关的职业,通过对数据的挖掘分析来影响企业的商业决策。
这群人在国外被叫做数据科学家(Data Scientist),这个头衔最早由D.J.Pati和Jeff Hammerbacher于2008年提出,他们后来分别成为了领英(LinkedIn)和Facebook数据科学团队的负责人。而数据科学家这个职位目前也已经在美国传统的电信、零售、金融、制造、物流、医疗、教育等行业里开始创造价值。
不过在国内,大数据的应用才刚刚萌芽,人才市场还不那么成熟,“你很难期望有一个全才来完成整个链条上的所有环节。更多公司会根据自己已有的资源和短板,招聘能和现有团队互补的人才。”领英(LinkedIn)中国商务分析及战略总监王昱尧对《第一财经周刊》说。
于是每家公司对大数据工作的要求不尽相同:有的强调数据库编程、有的突出应用数学和统计学知识、有的则要求有咨询公司或投行相关的经验、有些是希望能找到懂得产品和市场的应用型人才。正因为如此,很多公司会针对自己的业务类型和团队分工,给这群与大数据打交道的人一些新的头衔和定义:数据挖掘工程师、大数据专家、数据研究员、用户分析专家等都是经常在国内公司里出现的Title,我们将其统称为“大数据工程师”。
王昱尧认为,在一个成熟的数据驱动型公司,“大数据工程师”往往是一个团队,它意味着从数据的收集、整理展现、分析和商业洞察、以至于市场转化的全过程。这个团队中可能包括数据工程师、分析师、产品专员、市场专员和商业决策者等角色,共同完成从原始数据到商业价值的转换—概括来讲,这是一个支持企业做出商业决策、发掘商业模式的重要群体。
由于国内的大数据工作还处在一个有待开发的阶段,因此能从其中挖掘出多少价值完全取决于工程师的个人能力。已经身处这个行业的专家给出了一些人才需求的大体框架,包括要有计算机编码能力、数学及统计学相关背景,当然如果能对一些特定领域或行业有比较深入的了解,对于其快速判断并抓准关键因素则更有帮助。
虽然对于一些大公司来说,拥有硕博学历的公司人是比较好的选择,不过阿里巴巴集团研究员薛贵荣强调,学历并不是最主要的因素,能有大规模处理数据的经验并且有喜欢在数据海洋中寻宝的好奇心会更适合这个工作。
除此之外,一个优秀的大数据工程师要具备一定的逻辑分析能力,并能迅速定位某个商业问题的关键属性和决定因素。“他得知道什么是相关的,哪个是重要的,使用什么样的数据是最有价值的,如何快速找到每个业务最核心的需求。”联合国网络大数据联合实验室数据科学家沈志勇说。学习能力能帮助大数据工程师快速适应不同的项目,并在短时间内成为这个领域的数据专家;沟通能力则能让他们的工作开展地更顺利,因为大数据工程师的工作主要分为两种方式:由市场部驱动和由数据分析部门驱动,前者需要常常向产品经理了解开发需求,后者则需要找运营部了解数据模型实际转化的情况。
你可以将以上这些要求看做是成为大数据工程师的努力方向,因为根据万宝瑞华管理合伙人颜莉萍的观察,这是一个很大的人才缺口。目前国内的大数据应用多集中在互联网领域,有超过56%的企业在筹备发展大数据研究,“未来5年,94%的公司都会需要数据科学家。”颜莉萍说。因此她也建议一些原本从事与数据工作相关的公司人可以考虑转型。
本期《第一财经周刊》采访了BAT这3家国内互联网公司,以及相关领域的人力资源专家,他们从职场角度为我们解读如何成为大数据工程师以及这类岗位的职场现状。
A 大数据工程师做什么?
用阿里巴巴集团研究员薛贵荣的话来说,大数据工程师就是一群“玩数据”的人,玩出数据的商业价值,让数据变成生产力。大数据和传统数据的最大区别在于,它是在线的、实时的,规模海量且形式不规整,无章法可循,因此“会玩”这些数据的人就很重要。
沈志勇认为如果把大数据想象成一座不停累积的矿山,那么大数据工程师的工作就是,“第一步,定位并抽取信息所在的数据集,相当于探矿和采矿。第二步,把它变成直接可以做判断的信息,相当于冶炼。最后是应用,把数据可视化等。”
因此分析历史、预测未来、优化选择,这是大数据工程师在“玩数据”时最重要的三大任务。通过这三个工作方向,他们帮助企业做出更好的商业决策。
找出过去事件的特征
大数据工程师一个很重要的工作,就是通过分析数据来找出过去事件的特征。比如,腾讯的数据团队正在搭建一个数据仓库,把公司所有网络平台上数量庞大、不规整的数据信息进行梳理,总结出可供查询的特征,来支持公司各类业务对数据的需求,包括广告投放、游戏开发、社交网络等。
找出过去事件的特征,最大的作用是可以帮助企业更好地认识消费者。通过分析用户以往的行为轨迹,就能够了解这个人,并预测他的行为。“你可以知道他是什么样的人、他的年纪、兴趣爱好,是不是互联网付费用户、喜欢玩什么类型的游戏,平常喜欢在网上做什么事情。”腾讯云计算有限公司北京研发中心总经理郑立峰对《第一财经周刊》说。下一步到了业务层面,就可以针对各类人群推荐相关服务,比如手游,或是基于不同特征和需求衍生出新的业务模式,比如微信的电影票业务。
预测未来可能发生的事情
通过引入关键因素,大数据工程师可以预测未来的消费趋势。在阿里妈妈的营销平台上,工程师正试图通过引入气象数据来帮助淘宝卖家做生意。“比如今年夏天不热,很可能某些产品就没有去年畅销,除了空调、电扇,背心、游泳衣等都可能会受其影响。那么我们就会建立气象数据和销售数据之间的关系,找到与之相关的品类,提前警示卖家周转库存。”薛贵荣说。
在网络,沈志勇支持“网络预测”部分产品的模型研发,试图用大数据为更广泛的人群服务。已经上线的包括世界杯预测、高考预测、景点预测等。以网络景点预测为例,大数据工程师需要收集所有可能影响一段时间内景点人流量的关键因素进行预测,并为全国各个景点未来的拥挤度分级—在接下来的若干天时间里,它究竟是畅通、拥挤,还是一般拥挤?
找出最优化的结果
根据不同企业的业务性质,大数据工程师可以通过数据分析来达到不同的目的。
以腾讯来说,郑立峰认为能反映大数据工程师工作的最简单直接的例子就是选项测试(AB Test),即帮助产品经理在A、B两个备选方案中做出选择。在过去,决策者只能依据经验进行判断,但如今大数据工程师可以通过大范围地实时测试—比如,在社交网络产品的例子中,让一半用户看到A界面,另一半使用B界面,观察统计一段时间内的点击率和转化率,以此帮助市场部做出最终选择。
作为电商的阿里巴巴,则希望通过大数据锁定精准的人群,帮助卖家做更好的营销。“我们更期待的是你能找到这样一批人,比起现有的用户,这些人对产品更感兴趣。”薛贵荣说。一个淘宝的实例是,某人参卖家原来推广的目标人群是产妇,但工程师通过挖掘数据之间的关联性后发现,针对孕妇群体投放的营销转化率更高。
B 需要具备的能力
数学及统计学相关的背景
就我们采访过的BAT三家互联网大公司来说,对于大数据工程师的要求都是希望是统计学和数学背景的硕士或博士学历。沈志勇认为,缺乏理论背景的数据工作者,更容易进入一个技能上的危险区域(Danger Zone)—一堆数字,按照不同的数据模型和算法总能捯饬出一些结果来,但如果你不知道那代表什么,就并不是真正有意义的结果,并且那样的结果还容易误导你。“只有具备一定的理论知识,才能理解模型、复用模型甚至创新模型,来解决实际问题。”沈志勇说。
计算机编码能力
实际开发能力和大规模的数据处理能力是作为大数据工程师的一些必备要素。“因为许多数据的价值来自于挖掘的过程,你必须亲自动手才能发现金子的价值。”郑立峰说。
举例来说,现在人们在社交网络上所产生的许多记录都是非结构化的数据,如何从这些毫无头绪的文字、语音、图像甚至视频中攫取有意义的信息就需要大数据工程师亲自挖掘。即使在某些团队中,大数据工程师的职责以商业分析为主,但也要熟悉计算机处理大数据的方式。
对特定应用领域或行业的知识
在颜莉萍看来,大数据工程师这个角色很重要的一点是,不能脱离市场,因为大数据只有和特定领域的应用结合起来才能产生价值。所以,在某个或多个垂直行业的经历能为应聘者积累对行业的认知,对于之后成为大数据工程师有很大帮助,因此这也是应聘这个岗位时较有说服力的加分项。
“他不能只是懂得数据,还要有商业头脑,不论对零售、医药、游戏还是旅游等行业,能就其中某些领域有一定的理解,最好还是与公司的业务方向一致的,”就此薛贵荣还打了个比方,“过去我们说一些奢侈品店员势利,看人一眼就知道买得起买不起,但这群人恰恰是有敏锐度的,我们认为他们是这个行业的专家。又比如对医疗行业了解的人,他在考虑医疗保险业务时,不仅会和人们医院看病的记录相关,也会考虑饮食数据,这些都是基于对该领域的了解。”
C 大数据工程师的职业发展
如何成为大数据工程师
由于目前大数据人才匮乏,对于公司来说,很难招聘到合适的人才—既要有高学历,同时最好还有大规模数据处理经验。因此很多企业会通过内部挖掘。
今年8月,阿里巴巴举办了一个大数据竞赛,把天猫平台上的数据拿出来,去除敏感问题后,放到云计算平台上交予7000多支队伍进行比赛,比赛分为内部赛和外部赛。“通过这个方式来激励内部员工,同时也发现外部人才,让各行业的大数据工程师涌现出来。”
颜莉萍建议,目前长期从事数据库管理、挖掘、编程工作的人,包括传统的量化分析师、Hadoop方面的工程师,以及任何在工作中需要通过数据来进行判断决策的管理者,比如某些领域的运营经理等,都可以尝试该职位,而各个领域的达人只要学会运用数据,也可以成为大数据工程师。
薪酬待遇
作为IT类职业中的“大熊猫”,大数据工程师的收入待遇可以说达到了同类的顶级。根据颜莉萍的观察,国内IT、通讯、行业招聘中,有10%都是和大数据相关的,且比例还在上升。颜莉萍表示,“大数据时代的到来很突然,在国内发展势头激进,而人才却非常有限,现在完全是供不应求的状况。”在美国,大数据工程师平均每年薪酬高达17.5万美元,而据了解,在国内顶尖互联网类公司,同一个级别大数据工程师的薪酬可能要比其他职位高20%至30%,且颇受企业重视。
职业发展路径
由于大数据人才数量较少,因此大多数公司的数据部门一般都是扁平化的层级模式,大致分为数据分析师、资深研究员、部门总监3个级别。大公司可能按照应用领域的维度来划分不同团队,而在小公司则需要身兼数职。有些特别强调大数据战略的互联网公司则会另设最高职位—如阿里巴巴的首席数据官。“这个职位的大部分人会往研究方向发展,成为重要数据战略人才。”颜莉萍说。另一方面,大数据工程师对商业和产品的理解,并不亚于业务部门员工,因此也可转向产品部或市场部,乃至上升为公司的高级管理层。

❸ hadoop好学么

Hadoop并不难学习,概念和基础容易理解,难点是挑战项目复杂性。在进入大数据这个圈子之前,应该多动手操作一些挑战性的项目。学过Java和Linux的话,对学习Hadoop会有很大帮助,可以更快速掌握大数据开发技术。Hadoop基本上是用Java编写的,因此至少需要掌握该编程语言的基础知识。Hadoop基本上是在Linux上运行的,因此了解Linux的基本知识更容易入门大数据Hadoop。

❹ hadoop是做什么的

提供海量数据存储和计算的,需要java语言基础。

Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。

特点

1、快照支持在一个特定时间存储一个数据拷贝,快照可以将失效的集群回滚到之前一个正常的时间点上。HDFS已经支持元数据快照。

2、HDFS的设计是用于支持大文件的。运行在HDFS上的程序也是用于处理大数据集的。这些程序仅写一次数据,一次或多次读数据请求,并且这些读操作要求满足流式传输速度。

HDFS支持文件的一次写多次读操作。HDFS中典型的块大小是64MB,一个HDFS文件可以被切分成多个64MB大小的块,如果需要,每一个块可以分布在不同的数据节点上。

3、阶段状态:一个客户端创建一个文件的请求并不会立即转发到名字节点。实际上,一开始HDFS客户端将文件数据缓存在本地的临时文件中。

❺ 请问HADOOP都支持哪些编程语言,麻烦列全面一点,谢谢

hadoop只支持JAVA编程,但是操作hadoop可以用很多其他语言,比如hadoop streaming 实现maprece 支持标准输入输出,你可以用任意语言实现这种输入输出。另外,hadoop提供很多操作的网络接口,这种网络接口也是语言无关的,只要遵守协议任何语言都可以通信hadoop。

❻ hadoop支持什么开发语言

hadoop支持C++,Java开发语言。

Hadoop带有用Java语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如 C++。MapRece是处理大量半结构化数据集合的编程模型。编程模型是一种处理并结构化特定问题的方式。

例如,在一个关系数据库中,使用一种集合语言执行查询,如SQL。告诉语言想要的结果,并将它提交给系统来计算出如何产生计算。还可以用更传统的语言(C++,Java),一步步地来解决问题。这是两种不同的编程模型,MapRece就是另外一种。

(6)hadoop编程扩展阅读

特点

1、确定哪些数据属于企业的敏感数据。根据公司的隐私保护政策,以及相关的行业法规和政府规章来综合确定。

2、确保数据保护方案同时采用了隐藏和加密技术,尤其是如果我们需要将敏感数据在Hadoop中保持独立的话。

3、确保需要加密的时候有合适的技术(比如Java、Pig等)可被部署并支持无缝解密和快速访问数据。

❼ Hadoop是什么,具体有什么用呢

首先Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop 的最常见用法之一是 Web 搜索。虽然它不是唯一的软件框架应用程序,但作为一个并行数据处理引擎,它的表现非常突出。Hadoop 最有趣的方面之一是 Map and Rece 流程,它受到Google开发的启发。这个流程称为创建索引,它将 Web爬行器检索到的文本 Web 页面作为输入,并且将这些页面上的单词的频率报告作为结果。
结果是对输入域中的单词进行计数,这无疑对处理索引十分有用。但是,假设有两个输入域,第一个是 one small step for man,第二个是 one giant leap for mankind。您可以在每个域上执行 Map 函数和 Rece 函数,然后将这两个键/值对列表应用到另一个 Rece 函数,这时得到与前面一样的结果。换句话说,可以在输入域并行使用相同的操作,得到的结果是一样的,但速度更快。这便是 MapRece 的威力;它的并行功能可在任意数量的系统上使用
回到 Hadoop 上,它实现这个功能的方法是:一个代表客户机在单个主系统上启动的 MapRece应用程序称为 JobTracker。类似于 NameNode,它是 Hadoop 集群中唯一负责控制 MapRece应用程序的系统。在应用程序提交之后,将提供包含在 HDFS 中的输入和输出目录。JobTracker 使用文件块信息(物理量和位置)确定如何创建其他 TaskTracker 从属任务。MapRece应用程序被复制到每个出现输入文件块的节点。将为特定节点上的每个文件块创建一个唯一的从属任务。每个 TaskTracker 将状态和完成信息报告给 JobTracker
通过Hadoop安全部署经验总结,开发出以下十大建议,以确保大型和复杂多样环境下的数据信息安全 [9] 。
1、先下手为强!在规划部署阶段就确定数据的隐私保护策略,最好是在将数据放入到Hadoop之前就确定好保护策略 [9] 。
2、确定哪些数据属于企业的敏感数据。根据公司的隐私保护政策,以及相关的行业法规和政府规章来综合确定 [9] 。
3、及时发现敏感数据是否暴露在外,或者是否导入到Hadoop中 [9] 。
4、搜集信息并决定是否暴露出安全风险 [9] 。
5、确定商业分析是否需要访问真实数据,或者确定是否可以使用这些敏感数据。然后,选择合适的加密技术。如果有任何疑问,对其进行加密隐藏处理,同时提供最安全的加密技术和灵活的应对策略,以适应未来需求的发展 [9] 。
6、确保数据保护方案同时采用了隐藏和加密技术,尤其是如果我们需要将敏感数据在Hadoop中保持独立的话 [9] 。
7、确保数据保护方案适用于所有的数据文件,以保存在数据汇总中实现数据分析的准确性 [9] 。
8、确定是否需要为特定的数据集量身定制保护方案,并考虑将Hadoop的目录分成较小的更为安全的组 [9] 。
9、确保选择的加密解决方案可与公司的访问控制技术互操作,允许不同用户可以有选择性地访问Hadoop集群中的数据 [9] 。
10、确保需要加密的时候有合适的技术(比如Java、Pig等)可被部署并支持无缝解密和快速访问数据

热点内容
编程凸轮 发布:2025-02-13 05:38:21 浏览:690
判断素数的编程 发布:2025-02-13 05:29:25 浏览:617
androidaes加密 发布:2025-02-13 05:08:36 浏览:492
李宗瑞文件夹 发布:2025-02-13 04:27:59 浏览:611
phpparent的parent 发布:2025-02-13 04:18:08 浏览:457
小容量存储器市场 发布:2025-02-13 04:01:11 浏览:373
ickeck文件夹 发布:2025-02-13 04:00:21 浏览:644
上传照片文案 发布:2025-02-13 03:53:13 浏览:426
电脑版花雨庭怎么调中文服务器 发布:2025-02-13 03:32:35 浏览:39
linux开发android 发布:2025-02-13 03:32:34 浏览:490