hadoop0.20.1安装部署

hadoop0.20.1安装部署
软件环境:
Linux系统: Fedora 6
hadoop版本:hadoop-0.18.3(最新版本为0.19,与之前版本相比有较大改动)
JDK版本:1.60(要求1.5以上版本)

硬件环境:
①3台机器IP配置如下:
hadoop:202.115.5.139
hadoop1:202.115.5.140
hadoop2:202.115.5.141
②修改/etc/hosts文件,以确保每台机器的主机名和IP地址之间能正确解析。
 Namenode机器:需要在hosts文件中加上集群中所有机器的IP地址及其对应的主机名。Datanode机器:只需在hosts文件中加上本机IP地址和Namenode

机器的IP地址。
本例中以hadoop作为Namenode,hadoop1和hadoop2为Datanode。
hadoop中的/etc/hosts文件修改如下:
127.0.0.0          localhost    localhost
202.115.5.139    hadoop       hadoop
202.115.5.157    hadoop1     hadoop1
202.115.5.231    hadoop2     hadoop2
hadoop1中的/etc/hosts文件修改如下:
127.0.0.0           localhost    localhost
202.115.5.139    hadoop       hadoop
202.115.5.157    hadoop1     hadoop1
hadoop2中的/etc/hosts文件修改如下:
127.0.0.0          localhost    localhost
202.115.5.139    hadoop       hadoop
202.115.5.231    hadoop2     hadoop2
测试:3台机器互相ping主机名,看是否可以ping通。

目录结构:
Hadoop要求所有机器上hadoop的部署目录结构要相同,并且都有一个相同的用户名的帐户。
3台机器用户名均为hadoop,主目录是/home/hadoop。
Hadoop部署的目录结构如下:/home/hadoop/hadoop-0.18.3
SSH设置:
在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个节点上的各种守护进程的,这就需要在节点之间执行指令的时候是不需要

输入密码的方式,故我们需要配置SSH使用无密码公钥认证的方式。
以本文中的三台机器为例,现在hadoop是主节点,它需要主动发起SSH连接到hadoop1和hadoop2,对于SSH服务来说,hadoop就是SSH客户端,而

hadoop1、hadoop2则是SSH服务端,因此在hadoop1,hadoop2上需要确定sshd服务已经启动。简单的说,在hadoop上需要生成一个密钥对,即一个私钥

,一个公钥。将公钥拷贝到hadoop1,hadoop2上,这样,比如当hadoop向hadoop1发起ssh连接的时候,hadoop1上就会生成一个随机数并用hadoop的公

钥对这个随机数进行加密,并发送给hadoop;hadoop收到这个加密的数以后用私钥进行解密,并将解密后的数发送回hadoop1,hadoop1确认解密的数

无误后就允许hadoop进行连接了。这就完成了一次公钥认证过程。
对于本文中的三台机器,首先在hadoop上生成密钥对:
代码清单1
[hadoop@hadoop:~]$ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
2e:57:e2:bf:fd:d4:45:5c:a7:51:3d:f1:51:3c:69:68  hadoop@hadoop
这个命令将为hadoop上的用户hadoop生成其密钥对,询问其保存路径时直接回车采用默认路径,当提示要为生成的密钥输入passphrase的时候,直接

回车,也就是将其设定为空密码。生成的密钥对id_rsa,id_rsa.pub,默认存储在/home/hadoop/.ssh目录下。然后将id_rsa.pub的内容复制到每个机

器(也包括本机)的/home/hadoop/.ssh/authorized_keys文件中,如果机器上已经有authorized_keys这个文件了,就在文件末尾加上id_rsa.pub中的

内容,如果没有authorized_keys这个文件,直接cp或者scp就好了,下面的操作假设各个机器上都没有authorized_keys文件。
对于hadoop
[hadoop@hadoop:.ssh]$cp id_rsa.pub authorized_keys
对于hadoop1(hadoop2同hadoop1的方法)
[hadoop@hadoop1:~]$mkdir .ssh
[hadoop@hadoop:.ssh]$scp authorized_keys hadoop1:/home/hadoop/.ssh/
此处的scp就是通过ssh进行远程copy,此处需要输入远程主机的密码,即hadoop1机器上hadoop帐户的密码,当然,你也可以用其他方法将

authorized_keys文件拷贝到其他机器上.
[hadoop@hadoop:.ssh]$chmod 644 authorized_keys
这一步非常关键,必须保证authorized_keys只对其所有者有读写权限,其他人不允许有写的权限,否则SSH是不会工作的。
[hadoop@hadoop:.ssh]ls -la
drwx------ 2 hadoop hadoop  .
drwx------ 3 hadoop hadoop  ..
-rw-r--r-- 1 hadoop hadoop authorized_keys
注意每个机器上的.ssh目录的ls -la都应该和上面是一样的。
接着,在三台机器上都需要对sshd服务进行配置,在三台机器上修改文件/etc/ssh/sshd_config
#去除密码认证
PasswordAuthentication  no
AuthorizedKeyFile       /home/hadoop/.ssh/authorized_keys
至此各个机器上的SSH配置已经完成,可以测试一下了,比如hadoop向hadoop1发起ssh连接:
[hadoop@hadoop:~]$ssh hadoop1
如果ssh配置好了,就会出现以下提示信息:
The authenticity of host [hadoop] can't be established.
Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.
Are you sure you want to continue connecting (yes/no)?
OpenSSH告诉你它不知道这台主机,但是你不用担心这个问题,因为你是第一次登录这台主机。键入“yes”。这将把这台主机的“识别标记”加到

“~/.ssh/know_hosts”文件中。第二次访问这台主机的时候就不会再显示这条提示信息了。
然后你会发现不需要输入密码就可以建立ssh连接了。
不过,别忘了测试本机ssh hadoop

Hadoop配置文件修改
需要修改/home/hadoop/hadoop-0.18.3/conf目录下的三个配置文件:hadoop-env.sh,hadoop-site.xml和masters 、slaves文件。
1. 修改hadoop_env.sh,设置 Hadoop环境变量:
export HADOOP_HOME=/home/hadoop/hadoop-0.18.3
export JAVA_HOME=/usr/java/jdk1.6.0_10
2. 修改core-site.xml文件:
  代码清单2
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
<description>The name of the default file system. Either the literal string "local" or a host:port for DFS.</description>
</property>

<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-0.20.1/tmp</value>
<description>A base for other temporary directories.</description>
</property>

<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/hadoop-0.20.1/name</value>
<description>Determines where on the local filesystem the DFS name node should store the name table. If this is a comma-delimited

list of directories then the name table is replicated in all of the directories, for redundancy. </description>
</property>

<property>

<name>dfs.data.dir</name>
<value>/home/hadoop/hadoop-0.20.1/data</value>
<description>Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list

of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist

are ignored.</description>
</property>

<property>
<name>dfs.replication</name>
<value>2</value>
<description>Default block replication. The actual number of replications can be specified when the file is created. The default

isused if replication is not specified in create time.</description>
</property>
</configuration>
3. 修改hdfs-site.xml文件:
  代码清单2
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>dfs.http.address</name>
<value>master:50070</value>
<description>The name of the default file system. Either the literal string "local" or a host:port for DFS.</description>
</property>
</configuration>
4. 修改mapred-site.xml文件:
  代码清单2
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
<description>The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and

reduce task.</description>
</property>
</configuration>

5. 设定主从节点
修改masters 文件,将其中的 localhost 改为hadoop,修改slaves 文件, 删掉其中的 localhost, 将我们的另两台机器hadoop1, hadoop2加入, 注意

每个机器一行。

6.将 Hadoop 部署到其它机器上去
代码清单3:
[hadoop@ hadoop:~]$scp -r /home/ hadoop /hadoop-0.18.3 
hadoop1: /home/hadoop/hadoop-0.18.3
[hadoop@hadoop:~]$scp -r /home/ hadoop /hadoop-0.18.3 
hadoop2:/home/ hadoop /hadoop-0.18.3

7.在hadoop上格式化一个新的分布式文件系统
代码清单4:
[hadoop@ hadoop:~]$cd /home/ hadoop /hadoop-0.18.3
[hadoop@ hadoop:hadoop-0.18.3]$bin/hadoop namenode –format

8. 在 hadoop上启动 hadoop进程
如代码清单5所示:
[hadoop@ hadoop:~]$ cd /home/ hadoop /hadoop-0.18.3
[hadoop@ hadoop hadoop-0.18.3]$bin/start-all.sh
启动完成之后,运行ps -ef 命令应该可以看到hadoop上启动了3 个新的 java 进程 (namenode, secondary namenode, jobtracker), 同时,我们可

以到 hadoop1, hadoop2 两台机器上用 ps –ef 查看,这两台机器上应该已经自动启动了 2 个新的 java 进程 (datanode, tasktracker).
9. 运行Hadoop程序
至此,整个 Hadoop 分布式环境已经部署完毕,并已启动相关后台进程。现在我们可以尝试运行一下下载的Hadoop Core包中的wordcount 程序,如代

码清单 6 所示:
代码清单 6
[hadoop@ hadoop:~] $ cd /home/ hadoop /hadoop-0.18.3
[hadoop@ hadoop:hadoop-0.18.3] $mkdir test-in 
[hadoop@ hadoop:hadoop-0.18.3] $cd test-in
#在 test-in 目录下创建两个文本文件, WordCount 程序将统计其中各个单词出现次数
[hadoop@ hadoop test-in] $echo "hello world bye world" >file1.txt  
[hadoop@ hadoop test-in] $echo "hello hadoop goodbye hadoop" >file2.txt
$ cd ..
[hadoop@ hadoop:hadoop-0.18.3] $ bin/hadoop dfs –put test-in input
# 将本地文件系统上的test-in 目录拷到 HDFS 的根目录上,目录名改为 input
[hadoop@ hadoop:hadoop-0.18.3] $ bin/hadoop jar hadoop-0.18.3-examples.jar wordcount input output
#查看执行结果:
# 将文件从 HDFS 拷到本地文件系统中再查看:
$ bin/hadoop dfs -get output output
$ cat output/*
# 也可以直接查看
$ bin/hadoop dfs -cat output/*
程序运行成功的结果如下:
09/04/13 16:13:00 INFO mapred.FileInputFormat: Total input paths to process : 2
09/04/13 16:13:00 INFO mapred.FileInputFormat: Total input paths to process : 2
09/04/13 16:13:01 INFO mapred.JobClient: Running job: job_200904131555_0003
09/04/13 16:13:02 INFO mapred.JobClient:  map 0% reduce 0%
09/04/13 16:13:27 INFO mapred.JobClient:  map 66% reduce 0%
09/04/13 16:13:33 INFO mapred.JobClient:  map 100% reduce 0%
09/04/13 16:13:40 INFO mapred.JobClient:  map 100% reduce 22%
09/04/13 16:13:45 INFO mapred.JobClient: Job complete: job_200904131555_0003
09/04/13 16:13:45 INFO mapred.JobClient: Counters: 16
09/04/13 16:13:45 INFO mapred.JobClient:   File Systems
09/04/13 16:13:45 INFO mapred.JobClient:     HDFS bytes read=54
09/04/13 16:13:45 INFO mapred.JobClient:     HDFS bytes written=41
09/04/13 16:13:45 INFO mapred.JobClient:     Local bytes read=75
09/04/13 16:13:45 INFO mapred.JobClient:     Local bytes written=298
09/04/13 16:13:45 INFO mapred.JobClient:   Job Counters
09/04/13 16:13:45 INFO mapred.JobClient:     Launched reduce tasks=1
09/04/13 16:13:45 INFO mapred.JobClient:     Launched map tasks=3
09/04/13 16:13:45 INFO mapred.JobClient:     Data-local map tasks=3
09/04/13 16:13:45 INFO mapred.JobClient:   Map-Reduce Framework
09/04/13 16:13:45 INFO mapred.JobClient:     Reduce input groups=5
09/04/13 16:13:45 INFO mapred.JobClient:     Combine output records=11
09/04/13 16:13:45 INFO mapred.JobClient:     Map input records=2
09/04/13 16:13:45 INFO mapred.JobClient:     Reduce output records=5
09/04/13 16:13:45 INFO mapred.JobClient:     Map output bytes=82
09/04/13 16:13:45 INFO mapred.JobClient:     Map input bytes=50
09/04/13 16:13:45 INFO mapred.JobClient:     Combine input records=14
09/04/13 16:13:45 INFO mapred.JobClient:     Map output records=8
09/04/13 16:13:45 INFO mapred.JobClient:     Reduce input records=5

10. 常见问题
1。之前的分析服务器上传文件报错,通过修改conf/hadoop-env.sh下的
export HADOOP_HEAPSIZE=4000
得到解决,也就是每台节点给Hadoop守护进程的JVM是4G。

2。另外,在生产环境中,需要在conf/mapred-site.xml下加个参数
mapred.userlog.limit.kb
参数表示mapreduce日志的最大值,用kb为单位,例如设成10G的话就是10000000
如果不改的话,Hadoop累计日志量还是很惊人的,我看现在分析服务器已经有2G了,这会造成磁盘空间不够需要手动清理

3.在使用start-all.sh启动hadoop的时候,会出现如下信息:
INFO ipc.Client:Retrying connect to server : nossana01/10.87.25.111:9000. Already tried 0 time(s).
该问题是由于在start-all.sh脚本中存在如下 命令:
./bin/hadoop dfsadmin –safemode leave

将该命令注释即可。

4.当磁盘空间已满的时候,分析服务器主节点会自动停机,导致分析无法继续,重启hadoop也不起作用。
需要将主节点的name,tmp删除,子节点的date,tmp,删除,重新在主节点运行命令:bin/hadoop namenode –format

5 java.io.IOException: Could not obtain block: blk_2712839034423478795_4327 file=/user/hadoop/pagecontents/part-m-00180
 at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.chooseDataNode(DFSClient.java:1787)
 at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.blockSeekTo(DFSClient.java:1615)
 at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.read(DFSClient.java:1742)
 at java.io.DataInputStream.readFully(Unknown Source)
 at java.io.DataInputStream.readFully(Unknown Source)
 at org.apache.hadoop.io.SequenceFile$Reader.init(SequenceFile.java:1450)
 at org.apache.hadoop.io.SequenceFile$Reader.(SequenceFile.java:1428)
 at org.apache.hadoop.io.SequenceFile$Reader.(SequenceFile.java:1417)
 at org.apache.hadoop.io.SequenceFile$Reader.(SequenceFile.java:1412)
 at org.apache.hadoop.mapreduce.lib.input.SequenceFileRecordReader.initialize(SequenceFileRecordReader.java:50)
 at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:418)
 at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:582)
 at org.apache.hadoop.mapred.MapTask.run(MapTask.java:305)
 at org.apache.hadoop.mapred.Child.main(Child.java:170)
 
6  java.io.IOException: xceiverCount 257 exceeds the limit of concurrent xcievers 256
        at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:88)
        at java.lang.Thread.run(Unknown Source)
2010-09-13 04:28:02,705 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(10.87.25.113:50010,

storageID=DS-1545289813-127.0.0.1-50010-1284281872905, infoPort=50075, ipcPort=500
20):DataXceiver

5. org.apache.hadoop.ipc.RemoteException: java.io.IOException: blk_-7921840443736065669_4455 is already commited, storedBlock ==

null.
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.nextGenerationStampForBlock(FSNamesystem.java:4676)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.nextGenerationStamp(NameNode.java:473)
        at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:508)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:959)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:955)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Unknown Source)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:953)
        at org.apache.hadoop.ipc.Client.call(Client.java:739)
        at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:220)
        at $Proxy4.nextGenerationStamp(Unknown Source)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.syncBlock(DataNode.java:1550)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.recoverBlock(DataNode.java:1524)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.recoverBlock(DataNode.java:1590)
        at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:508)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:959)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:955)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Unknown Source)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:953)

异常5,6都是关于Hadoop文件系统的,说明Hadoop文件操作的负载比较大,会导致datanode当掉而出各种错误

可以调整几个参数(下面的几个参数都是默认值的10倍),但需要监控内存是否够用。

在conf目录的hdfs-site.xml加几个参数:
<property>
<name>dfs.datanode.max.xcievers</name>
<value>2560</value>
</property>
<property>
  <name>dfs.namenode.handler.count</name>
  <value>100</value>
</property>
<property>
  <name>dfs.datanode.handler.count</name>
  <value>30</value>
  <description>The number of server threads for the datanode.</description>
</property>
同时改下hdfs-site里这个参数的值,由2改成3:
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
在core-site.xml加上这样一个参数:
<property>
  <name>ipc.server.listen.queue.size</name>
  <value>1280</value>
  <description>Indicates the length of the listen queue for servers accepting
               client connections.
  </description>
</property>
服务器地址 NAME目录 临时目录 日志目录 节点数据目录 主节点 子节点      

        
10.87.25.111 hadoop-0.20.1/name hadoop-0.20.1/tmp /hadoop/analyse01/logs01 /hadoop/analyse01/data01 是 

是                 

     
10.87.25.112 无 hadoop-0.20.1/tmp /hadoop/analyse01/logs02 /hadoop/analyse01/data02 否 是  

   
10.87.25.113 无 hadoop-0.20.1/tmp /hadoop/analyse01/logs03 /hadoop/analyse01/data03 否 是  

   
10.87.25.114 无 hadoop-0.20.1/tmp /hadoop/analyse01/logs04 /hadoop/analyse01/data04 否 是  

           
NAME目录配置:hadoop-0.20.1/conf/hdfs-site.xml    dfs.name.dir          

              
临时目录配置:hadoop-0.20.1/conf/core-site.xml    hadoop.tmp.dir         

               
日志目录配置:hadoop-0.20.1/conf/hadoop-env.sh    export HADOOP_LOG_DIR=/hadoop/analyse01/logs01     

  
节点数据目录配置:hadoop-0.20.1/conf/hdfs-site.xml    dfs.data.dir         

           
启动服务流程                

        
1.使用hadoop用户登录10.87.25.111服务器;            

            
2.进入hadoop-0.20.1目录               

         
3.在命令行输入:./bin/start-all.sh启动hadoop服务           

4.在命令行输入:nohup ./bin/hadoop jar web_analysis_hn.jar WebAnalytics &  启动网页分析服务      

 
5.监控日志命令为:tail -2000f nohup.out    或  tail -2000f analyse.log         

停止服务流程                

        
1.使用hadoop用户登录10.87.25.111服务器;            

 
2.进入hadoop-0.20.1目录               

         
3.使用ps -ef|grep java 查看WebAnalytice的进程号            

            
4.在命令行输入:kill -9 WebAnalytice进程号            

            
5.在命令行输入:./bin/stop-all.sh             

           
监控hadoop运行情况               

         
访问:http://10.87.25.111:50070 可以查看hadoop启动节点的状况          

              
访问:http://10.87.25.111:50030 可以查看hadoop中MAP数使用情况,分析任务的进行状态,运行中的任务,运行完成的任务,运行失败的任务  

          
异常情况                

        
如果需要在hadoop中添加或者删除子节点,首先删除主机的name,tmp,data目录,在删除分机的tmp,data目录;在/hadoop-0.20.1/conf目录中,修

改slaves文件,添加或删除一个子节点,并把改文件通过scp命令拷贝到其他机器,使所有机器的slaves文件内容保持一致,然后在命令行输入

./bin/hadoop namenode -format格式化目录             
参考资料
学习
 访问 Hadoop 官方网站,了解 Hadoop 及其子项目 HBase 的信息。
 Hadoop wiki上, 有许多 Hadoop 的用户文档,开发文档,示例程序等。
 阅读 Google Mapduce 论文: MapReduce: Simplified Data Processing on Large Clusters, 深入了解 Mapreduce 计算模型。
 深入了解 Hadoop 分布式文件系统 HDFS: The Hadoop Distributed File System:Architecture and Design
 深入了解 Google 文件系统 GFS: The Google File System, Hadoop HDFS 实现了与 GFS 类似的功能。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值