Hadoop三種安裝方式(Hadoop的三種安裝方式)

      網友投稿 3141 2022-05-30

      5. hadoop安裝

      5.1 hadoop的三種安裝/運行模式

      hadoop官方提供了三種安裝/運行模式:

      - 本地模式:單機運行,只是用來演示一下官方案例。生產環境不用

      - 偽分布式模式:也是單機運行,但是具備hadoop集群的所有功能,一臺服務器模擬一個分布式的環境。生產環境不用

      - 完全分布式模式:多臺服務器組成分布式環境。生產環境使用。

      本次側重講述完全分布式模式。

      5.2 安裝前準備

      hadoop完全分布式模式需要多臺虛擬機,可以先安裝一臺虛擬機,然后克隆虛擬機:

      安裝第一臺虛擬機的方式可用vmware,這里不再贅述

      如果第一臺虛擬機安裝的是最小系統版,需要進行以下操作:

      修改主機名為hadoop100:hostnamectl set-hostname hadoop100,重啟:reboot

      安裝epel-release,是“紅帽系”的操作系統提供額外的軟件包,適用于 RHEL、Centos、Seientific Linux。相當于一個軟件倉庫,大多數rpm包在官方repository中是找不到的:yum install epel-release

      安裝net-tools:yum install net-tools

      安裝vim:yum install vim

      安裝rsync:按照以下方式安裝,rsync命令的參數及配置文件參數含義見博客:https://www.cnblogs.com/koushuige/p/9162920.html

      yum -y install rsync #啟動rsync服務 systemctl start rsyncd.service # 啟動 systemctl enable rsyncd.service # 設置開機自啟 #檢查是否已經成功啟動 netstat -lnp|grep 873

      關閉防火墻:systemctl stop firewalld;取消開機自啟:systemctl disable firewalld.service

      添加用戶,修改密碼,及用戶組權限:

      添加名為user的用戶:useradd user

      修改user的密碼:passwd user

      配置user用戶具有root權限:vim /etc/sudoers,在%wheel ALL=(ALL) ALL下面插入一行user ALL=(ALL) ALL,如果想設置切換到user后,免密,可以寫成user ALL=(ALL) NOPASSWD: ALL。此外還需要注意,該行必須插入到whell下面,表示選擇將用戶設置為允許任何操作或者是將用戶添加到一個允許任何命令操作的用戶組中。如果添加到root ALL=(ALL) ALL下面,表示名為root的用戶允許任何命令操作,這樣是不可以的。(切換用戶,使用su user,切換root,直接su,現在還不需要切換)

      創建module、software文件夾:mkdir /opt/module, mkdir /opt/software

      修改module、software文件夾的所有者和所屬組均為user用戶:chown user:user /opt/module,chown user:user /opt/software

      卸載虛擬機自帶的jdk:rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps:

      rpm -qa:查詢所安裝的所有rpm軟件包

      grep -i: 忽略大小寫

      xargs -n1:表示每次只傳遞一個參數

      rpm -e --nodeps:強制卸載軟件

      重啟虛擬機:reboot

      克隆虛擬機:利用模板機hadoop100,克隆三臺虛擬機hadoop102/hadoop103/hadop104:

      克隆前先關閉hadoop100

      利用vmware克隆虛擬機:

      hadoop100上右鍵-管理-克隆!

      根據安裝向導安裝,其中克隆類型,要選擇創建完整克隆,虛擬機名稱hadoop102,位置自定義,完成即可。同樣的方法克隆hadoop103、hadoop104。

      修改克隆虛擬機的相關配置(以hadoop102為例):

      啟動hadoop102

      修改hadoop102的主機名:hostnamectl set-hostname hadoop102

      修改hosts文件:sudo vim /etc/hosts(如果是以user登錄的,必須加sudo)。添加以下內容:

      192.168.109.140 hadoop100 192.168.109.142 hadoop102 192.168.109.143 hadoop103 192.168.109.144 hadoop104

      重啟hadoop102:reboot

      在hadoop102上安裝jdk,不需要在hadoop3、hadoop4重復安裝,只需要拷貝即可:

      將安裝包放到/opt/software下

      解壓安裝包到/opt/module下:tar -zxvf /opt/software/jdk-8u281-linux-x64.tar.gz -C /opt/module/

      配置環境變量:

      新建/etc/profile.d/my_env.sh文件:sudo touch /etc/profile.d/my_env.sh

      添加以下內容sudo vim /etc/profile.d/my_env.sh:

      #JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_281 export PATH=$PATH:$JAVA_HOME/bin

      重啟profile:source /etc/profile

      測試:java -version

      5.3 安裝hadoop

      只需要在hadoop2上安裝hadoop即可,其他服務器直接拷貝,類似java安裝

      hadoop版本-:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/,下載hadoop-3.1.3.tar.gz

      將tar.gz安裝包放到/opt/software下

      解壓到/opt/module下:tar -zxvf /opt/software/hadoop-3.1.3.tar.gz -C /opt/module/

      將hadoop添加到環境變量

      編輯:sudo vim /etc/profile.d/my_env.sh,添加以下內容:

      #HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-3.1.3 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin

      重啟profile文件:source /etc/profile

      測試是否安裝成功:hadoop version

      5.4 hadoop安裝目錄

      bin:存放對hadoop相關服務(hdfs、yarn、MapReduce)進行操作的腳本

      etc:hadoop的配置文件目錄,存放hadoop的配置文件

      lib:存放hadoop的本地庫(對數據進行壓縮解壓縮功能)

      sbin:存放啟動或停止hadoop相關服務的腳本

      share:存放hadoop的依賴jar包、文檔、官方案例。

      6. hadoop運行模式

      在第五章提到,hadoop的安裝/運行模式分為三種,本章講述單機模式和完全分布式模式,重點是完全分布式模式,單機模式了解即可

      6.1 單機模式

      在hadoop-3.1.3目錄下創建一個wcinput文件夾:mkdir /opt/module/hadoop-3.1.3/wcinput

      在wcinput文件夾下新建一個word.txt文件:touch /opt/module/hadoop-3.1.3/wcinput/word.txt

      編輯word.txt文件:vim word.txt,在文本中輸入以下內容:

      hadoop yarn hadoop mapreduce user user

      切換到hadoop-3.1.3目錄:cd /opt/module/hadoop-3.1.3

      執行程序:hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-example-3.1.3.jar wordcount wcinput wcoutput

      查看結果:cat wcoutput/part-r-00000,結果如下:

      user 2 hadoop 2 mapreduce yarn 1

      6.2 完全分布式模式

      前提:按照之前章節準備好了虛擬機,環境等

      將hadoop2中的java和hadoop拷貝到hadoop3和hadoop4上:

      方法一scp:

      # -r為遞歸的意思 scp -r /opt/module/hadoop-3.1.3/ user@hadoop103:/opt/module/ scp -r /opt/module/hadoop-3.1.3/ user@hadoop104:/opt/module/ scp -r /opt/module/jdk1.8.0_281/ user@hadoop103:/opt/module/ scp -r /opt/module/jdk1.8.0_281/ user@hadoop104:/opt/module/

      方法二rsync:

      # rsync主要用于備份和鏡像,具有速度快、避免復制相同內容和支持符號鏈接的有點 # rsync與scp區別:rsync做文件的復制比scp快,rsync只對差異文件做更新,scp是復制所有文件 # 第一次使用rsync的效果等同于scp # 參數-a:歸檔拷貝;參數-v:顯示復制過程 # 使用rsync進行拷貝 rsync -av /opt/module/hadoop-3.1.3/ user@hadoop103:/opt/module/hadoop-3.1.3/ rsync -av /opt/module/hadoop-3.1.3/ user@hadoop104:/opt/module/hadoop-3.1.3/ rsync -av /opt/module/jdk1.8.0_281/ user@hadoop103:/opt/module/jdk1.8.0_281/ rsync -av /opt/module/jdk1.8.0_281/ user@hadoop104:/opt/module/jdk1.8.0_281/

      方法三推薦xsync集群分發腳本:方法一和方法二都有一個缺點:如果有100臺服務器,需要復制100次,這樣很麻煩,因此,帶來一個新的需求:循環復制文件到所有節點的相同目錄下。因此,可以編寫一個xsync的腳本:

      為了能讓腳本在任何路徑下使用,需要將腳本放到PATH的路徑下,echo $PATH查看都有哪些環境變量

      選擇/home/user/bin這個目錄存放xsync腳本:mkdir /home/user/bin, touch /home/user/bin/xsync

      編輯xsync腳本:vim xsync,內容如下:

      #!/bin/bash # 1. judge number of parameters, S#:get numbers of parameters, lt 1: less 1 if [ $# -lt 1 ] then echo Not Enough Arguement! exit; fi # 2. traverse all servers,***********************************注意:for循環這里,需要根據情況改成相應的主機名******************************************************* for host in hadoop102 hadoop103 hadoop104 do echo =======current host: $host================= # 3. travelse all directory and send # $@: get all parameters echo **********all paratemerts:$@****************** for file in $@ do # 4. judge whether the file exists if [ -e $file ] then # 5. get father directory pdir=$(cd -P $(dirname $file); pwd) echo ------father directory: $pdir------ # 6. get current file name fname=$(basename $file) echo ----------------current file:$fname----------- ssh $host "mkdir -p $pdir" # make father directory on host, but we are still on current host rsync -av $pdir/$fname $host:$pdir # rsync else echo $file does not exists! fi done done

      修改腳本具有可執行權限:chmod +x xsync

      測試腳本運行:xsync /home/user/bin。意思就是將當前主機下的/home/user/bin文件夾傳送到hadoop102、hadoop103、hadoop104這三臺機器。(傳送前會在hadoop102、hadoop103、hadoop104三臺機器上創建父文件夾,代碼已實現該功能),該步雖然寫的是測試,但在實際中也是需要的,作用就是將xsync腳本同步到其他服務器

      將腳本復制到/bin 中,以便全局調用:sudo cp xsync /bin/,因為分發root相關權限的文件時需要加sudo,加了sudo認為是root,xsync目前只是user的環境變量,非root的環境變量

      將/bin下的xsync同步到其他幾臺服務器:sudo xsync /bin/xsync

      將/opt/module同步到其他幾臺服務器:sudo xsync /opt/module

      同步module下的java和hadoop后,其他幾臺服務器的環境變量文件還沒有配置,因此同步環境變量文件:sudo xsync /etc/profile.d/my_env.sh

      環境變量生效:切換到其他幾臺服務器分別進行source /etc/profile

      此后,如有任何修改,都需要通過xsync同步到其他幾臺服務器

      設置ssh免密:xsync腳本中有一行代碼ssh,一般ssh到別的服務器都需要密碼,為了省略輸入密碼這一步,可以通過配置密鑰對的方式免密。

      密鑰對原理如下所示:

      假如服務器A想ssh到服務器B,那么一般情況下,需要輸入B的密碼。

      切換到/home/user/目錄,在A服務器上執行ssh-keygen -t rsa可以生成密鑰對,公鑰(id_rsa.pub)和私鑰(id_ras),公鑰是給別人用的,私鑰是自己的千萬不要給別人

      將A生成的公鑰拷貝到B上

      在A上sshB,此時數據用私鑰A加密

      B接收到數據后,去授權Key中查找A的公鑰,并解密數據

      B解密出來后,采用A公鑰加密的數據返回給A

      A接收到數據后,用A的私鑰解密數據

      以上就完成了ssh的免密登錄

      本次實戰的過程如下(操作均在hadoop2上執行):

      cd /home/user/

      ssh-keygen -t rsa,執行后,詢問語句執行按回車即可

      cd .ssh, ls,可以查看到生成的公鑰和私鑰文件

      將公鑰拷貝到需要ssh的服務器上:ssh-copy-id hadoop102, ssh-copy-id hadoop103, ssh-copy-id hadoop104

      此外還需要在hadoop103上采用user賬號配置無密登錄到hadoop102、hadoop103、hadoop104;還需要在hadoop104上采用user賬號配置無密登錄到hadoop102、hadoop103、hadoop104;還需要在hadoop102上采用root賬號配置無密登錄到hadoop102、hadoop103、hadoop104。

      .ssh文件下文件介紹:

      known_hosts: 記錄ssh訪問過計算機的公鑰(public key)

      id_rsa: 生成的私鑰

      id_rsa.pub: 生成的公鑰

      authorized_keys: 存放授權過的無密登錄服務器公鑰

      7. hadoop集群配置

      第六章只是講述了如何將安裝在hadoop102上的java、hadoop等分發到其他服務器,但是,到目前為止,hadoop102、hadoop103、hadoop104三臺服務器還沒有任何聯系,因此需要進行集群配置。

      集群規劃如下:

      NameNode和SecondaryNameNode都很耗費內存,因此最好不要安裝在同一臺服務器

      ResourceManger也很消耗內存,最好不要和NameNode、SecondNameNode配置在同一臺服務器。

      最終的服務器規劃如下所示(該規劃非常非常重要,后續進行文件配置都依賴于該規劃):

      配置文件說明:

      hadoop配置文件分為兩大類:默認配置文件和自定義配置文件,只有用戶想修改某一默認配置值時,才需要修改自定義配置文件,更改相應的屬性值

      默認配置文件:

      core-default.xml:核心配置文件,路徑:/opt/module/hadoop-3.1.3/share/doc/hadoop/hadoop-project-dist/hadoop-common/core-default.xml

      hdfs-default.xml:hdfs配置文件,路徑:/opt/module/hadoop-3.1.3/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

      yarn-default.xml:yarn配置文件,路徑:/opt/module/hadoop-3.1.3/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

      mapred-default.xml:MapReduce配置文件,路徑:/opt/module/hadoop-3.1.3/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

      自定義配置文件(下述配置文件路徑均為:/opt/module/hadoop-3.1.3/etc/hadoop/):

      core-sit.xml:核心配置文件

      hdfs-site.xml:hdfs配置文件

      yarn-site.xml:yarn配置文件

      mapred-site.xml:MapReduce配置文件

      配置4大自定義文件:

      配置核心文件:

      fs.defaultFS hdfs://hadoop102:8020 hadoop.tmp.dir /opt/module/hadoop-3.1.3/data hadoop.http.staticuser.user admin

      配置HDFS文件:

      dfs.namenode.http-address hadoop102:9870 dfs.namenode.secondary.http-address hadoop104:9868

      配置YARN文件

      yarn.resourcemanager.aux-services mapreduce_shuffle yarn.resourcemanager.hostname hadoop103 yarn.nodemanager.env-whitelist JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME

      配置MapReduce文件

      mapreduce.framework.name yarn

      在集群上分發配置好的Hadoop配置文件:xsync /opt/module/hadoop-3.1.3/etc/hadoop/,分發好以后可以自己去別的服務器看一看有沒有分發成功。

      8. 群起服務器

      配置workers:

      vim /opt/module/hadoop-3.1.3/etc/hadoop/workers,改為以下內容,有幾臺服務器就寫幾臺,注意該文件中添加的內容結尾不允許有空格,文件中不允許有空行

      hadoop102 hadoop103 hadoop104

      同步所有節點配置文件:xsync /opt/module/hadoop-3.1.3/etc

      啟動集群:

      如果集群是第一次啟動,需要在hadoop102節點格式化NameNode(注意:格式化NameNode,會產生新的集群id,導致NameNode和DataNode的集群id不一致,集群找不到以往的數據。如果集群在運行過程中報錯,需要重新格式化NameNode的話,一定要先停止namenode和datanode進程,并且要刪除所有機器的data和logs目錄,然后再進行格式化):hdfs namenode -format

      啟動HDFS:cd /opt/module/hadoop-3.1.3,sbin/start-dfs.sh

      在配置了ResourceManager的節點(hadoop103)啟動YARN:cd /opt/module/hadoop-3.1.3,sbin/start-yarn.sh

      web端查看HDFS的NameNode:

      瀏覽器輸入:http://hadoop102:9870,查看hdfs數據存儲信息。如何無法顯示,將hadoop2改為該臺機器的ip

      瀏覽器界面用得最多的是utilities-Browse the file system,這里面展示了有哪些文件。還有log,可以看到log信息

      瀏覽器輸入:http://hadoop103:8088,查看yarn上運行的job信息。如何無法顯示,將hadoop3改為該臺機器的ip

      運行任務時就可以在頁面看到變化

      路徑:/opt/module/hadoop-3.1.3/data/dfs/name/current有一個VERSION文件,里面存儲了hadoop的版本信息

      集群測試:

      上傳文件:

      在hadoop的hdfs上創建一個input文件夾:hadoop fs -mkdir /input。一般hdfs命令都要帶上hadoop和fs,其中fs表示hdfs,后面的-makedir就是linux命令

      hadoop三種安裝方式(Hadoop的三種安裝方式)

      查看hadoop的hdfs是否有/input文件夾:hadoop fs -ls /,結果為:drwxr-xr-x - user supergroup 0 2021-07-18 20:48 /input

      上傳服務器文件到hdfs上:hadoop fs -put /home/user/test.txt /input,put是上傳本地文件到hdfs上。test.txt文件是已經存放在服務器上的。

      查看hdfs是否收到文件:hadoop fs -ls /input,結果為-rw-r--r-- 3 user supergroup 72 2021-07-18 20:48 /input/test.txt

      查看web頁面:

      下載過程中如果出現打不開的情況,打開windows的hosts文件,添加如下內容

      192.168.109.142 hadoop102 192.168.109.143 hadoop103 192.168.109.144 hadoop104

      hadoop文件路徑:/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-961449125-192.168.109.142-1626485486041/current/finalized/subdir0/subdir0。/input是hdfs存放數據的路徑,web前端可以看到,那么hadoop存在文件路徑位于前述目錄,可以使用cat命令查看文件內容。

      -測試yarn-執行hadoop自帶的wordcount:

      輸入命令:hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input/ /output。hadoop-mapreduce-examples-3.1.3.jar是haddop自帶的一個具有統計功能的jar包,輸入是/input下的文件,輸出到output。

      web端查看結果:

      9. 配置歷史服務器

      為了查看程序的歷史運行情況,需要配置一下歷史服務器。具體配置如下:

      配置mapred-sit.xml

      mapreduce.framework.name yarn mapreduce.jobhistory.address hadoop102:10020 mapreduce.jobhistory.webapp.address hadoop102:19888

      分發配置:xsync /opt/module/hadoop-3.1.3/etc/hadoop

      在hadoop102上啟動歷史服務器:mapred --daemon start historyserver

      查看歷史服務器是否啟動成功:jps或者前端:http://hadoop102:19888/jobhistory

      10. 配置日志的聚集

      什么是日志的聚集:應用運行完成以后,將程序運行日志信息上傳到HDFS系統上。好處:可以方便的查看程序運行詳情,方便開發調試。注意:開啟日志聚集功能,需要重新啟動NodeManager、ResourceManager、historyserver。

      配置yarm-site.xml

      yarn.log-aggregation-enable true yarn.log.server.url http://hadoop102:19888/jobhistory/logs yarn.log-aggregation.retain-seconds 604800

      分發配置:xsync /opt/module/hadoop-3.1.3/etc/hadoop

      關閉NodeManger、ResourceManger和HistoryServer

      # 在hadoop103服務器上 cd /opt/module/hadoop-3.1.3/ sbin/stop-yarn.sh # 在hadoop102服務器上 mapred --daemon stop historyserver

      啟動NodeManger、ResourceManger和HistoryServer

      # 在hadoop103上 sbin/start-yarn.sh # 在hadoop102上 mapred --daemon start historyserver

      刪除HDFS已經存在的傳輸文件:hadoop fs -rm -r /output

      執行wordcount程序:hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input/ /output

      查看日志:歷史服務器:http://hadoop102:19888/jobhistory

      11. 集群啟動或停止的方法總結

      停止或啟動hdfs:

      整體啟動或停止:sbin/start-dfs.sh, sbin/stop-dfs.sh

      各個服務器組件逐個啟動或停止:hdfs --daemon start/stop namenode/datanode/secondarynamenode,停止還可以使用jps后,搭配kill -9 id號。

      停止或啟動yarn:

      整體啟動或停止:sbin/start-yarn.sh, sbin/stop-yarn.sh

      各個服務器組件逐個啟動或停止:yarn --daemon start/stop resourcemanager/nodemanager,停止還可以使用jps后,搭配kill -9 id號。

      啟動或停止歷史服務器:

      啟動或停止:mapred --daemon start/stop historyserver,停止還可以使用jps后,搭配kill -9 id號。

      編寫腳本啟停服務:參考上文xsync腳本的編寫

      12. 常用端口說明

      13. 集群時間同步

      如果服務器在公網(能連通外網),可以不采用集群時間同步,因為服務器會定期和公網時間進行校準;如果服務器在內網環境,必須要配置集群時間同步,否則時間久了,會產生時間偏差,導致集群執行任務時間不同步

      集群時間同步步驟:

      找一臺服務器作為時間服務器,其他機器與該臺服務定時進行時間同步,如選取hadoop102作為時間服務器

      查看所有節點ntpd服務器狀態和開機自啟狀態

      sudo yum install ntp # 如果沒有則安裝 sudo systemctl start ntpd # 開啟服務 sudo systemctl is-enabled ntpd # 設置開機自啟

      修改hadoop102上的ntp.conf配置文件vim /etc/ntp.conf:

      將#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap這句的注釋去掉。作用:授權192.168.1.0-192.168.1.255網段上的所有機器可以從這臺機器查詢和同步時間

      將server 0.centos.pool.ntp.org iburst、server 1.centos.pool.ntp.org iburst、server 2.centos.pool.ntp.org iburst、server 3.centos.pool.ntp.org iburst這四句注釋起來,作用:集群在局域網中,不使用其他互聯網上的時間。

      添加server 127.127.1.0、fudge 127.127.1.0 stratum 10兩行,作用:當該節點丟失網絡連接,依然可以采用本地時間作為時間服務器為集群中的其他節點提供時間同步。

      修改hadoop102的/etc/sysconfig/ntpd文件sudo vim /etc/sysconfig/ntpd:

      增加內容:SYNC_HWCLOCK=yes,作用:讓硬件時間與系統時間一起同步

      重啟ntpd服務:sudo systemctl start ntpd

      設置ntpd服務開機啟動:sudo systemctl enable ntpd

      其他機器配置(必須root用戶):

      關閉所有節點上ntp服務和自啟動(如果沒有服務先安裝)

      sudo systemctl stop ntpd sudo systemctl disable ntpd

      在其他機器配置1分鐘與時間服務器同步一次:sudo crontab -e,編寫內容:*/1 * * * * /usr/sbin/ntpdate hadoop102

      修改任意機器時間:sudo date -s "2021-9-11 11:11:11"

      1分鐘后查看機器是否與時間服務器同步:sudo date

      14. hadoop相關問題

      jps 發現進程已經沒有,但是重新啟動集群,提示進程已經開啟。原因是在 Linux 的根目錄下/tmp目錄中存在啟動的進程臨時文件,將集群相關進程刪除掉,再重新啟動集群。

      8088 端口連接不上:cat /etc/hosts,注釋127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4和::1 hadoop102。

      Hadoop 分布式

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel表格輸入加號的方法步驟圖(excel表格中如何輸入加號)
      下一篇:Java程序的方法設計(java程序設計的步驟)
      相關文章
      在线观看国产区亚洲一区成人 | 国产成人亚洲精品电影| 亚洲精品tv久久久久久久久| 亚洲国产精品嫩草影院久久| 在线播放亚洲精品| 亚洲三级高清免费| 久久亚洲最大成人网4438| 亚洲午夜精品在线| 亚洲av片不卡无码久久| 亚洲国产精品综合久久20| 国产91在线|亚洲| 亚洲色大情网站www| 亚洲人成无码网站在线观看| 亚洲熟妇自偷自拍另欧美| 日韩亚洲不卡在线视频中文字幕在线观看| 久久99亚洲网美利坚合众国| 亚洲黄网在线观看| 亚洲一卡2卡3卡4卡国产网站| 国产成+人+综合+亚洲专| 亚洲 暴爽 AV人人爽日日碰| 亚洲熟妇av午夜无码不卡| 亚洲国产成人手机在线观看 | 久久精品国产亚洲av成人| 亚洲欧洲一区二区| 亚洲毛片无码专区亚洲乱| 亚洲乱码日产精品BD在线观看| 亚洲综合色区中文字幕| 亚洲精品av无码喷奶水糖心| 亚洲?V乱码久久精品蜜桃 | 亚洲国产成人精品无码久久久久久综合| WWW国产亚洲精品久久麻豆| 无码不卡亚洲成?人片| 老司机亚洲精品影视www| 亚洲成a人片在线观看日本| 久久久无码精品亚洲日韩蜜臀浪潮| 亚洲天堂中文字幕在线观看| 亚洲人成电影网站色www| 亚洲AV无码成人精品区大在线| 亚洲综合久久夜AV | 久久精品亚洲综合一品| 亚洲日产2021三区|