在Win10中用Hyper-V虛擬機搭建CDH集群

Version: v0.1

Last Update: July/23/2021

Keywords:CDH材诽,Hadoop互亮,Big Data Platform汉操,Hyper-V愁铺,Virtual Machine

Abstract:
因想要學(xué)習(xí)大數(shù)據(jù)各種相關(guān)組件和技術(shù)鹰霍,而自家有臺臺式機可以折騰,購買所需配置的云服務(wù)器又太貴茵乱,故準備自行搭建CDH集群茂洒。因有Win10專業(yè)版,因此嘗鮮玩玩Hyper-V瓶竭。整體思路如下:規(guī)劃好整個集群的數(shù)量督勺、配置、角色斤贰,準備好所有軟件包智哀;先配置一臺虛擬機A,盡可能將所有公共的配置設(shè)置好荧恍,再依次復(fù)制出其余虛擬機瓷叫。
文內(nèi)全部使用經(jīng)過驗證的PowerShell和Shell腳本進行配置,注釋豐富便于理解整體操作邏輯(和復(fù)制粘貼)送巡。使用VMWare/VirtualBox/KVM等基本流程均相似摹菠。

0. 背景

  • 因想要學(xué)習(xí)大數(shù)據(jù)各種相關(guān)組件和技術(shù),而自家有臺臺式機可以折騰骗爆,購買所需配置的云服務(wù)器又太貴次氨,故準備自行搭建CDH集群。
  • 最初準備使用Ubuntu+VKVM摘投,但臺式機家人共享糟需,雙系統(tǒng)切換也很麻煩,故考慮在Win10一個平臺解決所有問題谷朝。
  • 因有Win10專業(yè)版洲押,VMWare Workstation要收費,VirtualBox是Oracle家的不喜歡圆凰,因此嘗鮮玩玩Hyper-V杈帐。
  • 以Win10專業(yè)版21H1+Hyper-V為例,若使用MacOS/Linux+VMWare/VirtualBox/KVM,則需依據(jù)實際情況參考操作挑童。
  • Hyper-V需要在BIOS中開啟CPU虛擬化累铅,具體操作略。
  • 安裝過程盡可能參考Cloudera官方文檔站叼,其余參考文章也都備注了來源娃兽。

整體思路如下:

  • 規(guī)劃好整個集群的數(shù)量、配置尽楔、角色投储,準備好所有軟件包。
  • 因臺式機單機資源有限阔馋,同時開啟多臺虛擬機比較費玛荞,故先配置一臺虛擬機A,盡可能將所有公共的配置設(shè)置好呕寝,再復(fù)制出其余虛擬機勋眯。
  • 需要有一臺虛擬機B,作為CM Server和CDH私有倉庫服務(wù)器下梢,用于安裝其余虛擬機所用的所有服務(wù)客蹋。其余所有虛擬機C的設(shè)置在安裝CDH前都是一樣的。
  • 因此操作流程為:
    • 配置A
    • 由A生成B孽江,配置B為CM Server和CDH私有倉庫服務(wù)器
    • 由A生成C嚼酝,配置C為CM Agent
    • 由C生成DEFG等
    • 配置DB
    • 安裝CDH

文中操作說明:

  • 文中敘述的可選操作或命令,如果是斜體的 可選:xxx 或在命令塊注釋內(nèi)竟坛,是我在自己搭建的實際操作中沒有執(zhí)行的,否則是執(zhí)行了的钧舌。
  • 操作涉及到Hosts/Hostname/IP/路徑/文件命名/參數(shù)名/參數(shù)值等担汤,均以集群規(guī)劃部分的描述為示范。若使用不同的配置項洼冻,可將本文下載下來崭歧,查找替換成自己的配置再看更舒服。
  • 使用命令行操作撞牢,不使用界面率碾。其實若PowerShell,鼠標操作可能更簡單屋彪。
  • PowerShell命令行所宰,默認需要以管理員身份運行終端,且僅在Terminal/PowerShell中驗證過畜挥。
  • Shell操作仔粥,默認需要sudo或以root用戶執(zhí)行。
  • 如果使用yum等命令反應(yīng)遲緩,可以自行配置國內(nèi)proxy源加速訪問躯泰。
  • 涉及到vi修改文件谭羔,含義如下:
    • 修改一行 (modify: from xxx to xxx)
    • 添加一行 (append: xxx)
    • 注釋一行 (comment: # xxx),也可以刪除該行

特別感謝參考文章:

1. 集群規(guī)劃

需要準備的軟件和版本。

1.1 硬件與角色規(guī)劃

參考-Hardware Requirements

參考-CDH Cluster Hosts and Role Assignments

依據(jù)官方的"20 Worker Hosts with High Availability"角色搭配建議和最低硬件要求秀撇,整理圖表如下超棺。
其中"4c2g"代表官方建議4核CPU,2GB內(nèi)存呵燕。因磁盤空間一般不是問題棠绘,故沒有列出。
星號*表示該角色沒有計入實際搭建和操作中再扭,只是規(guī)劃在表格中氧苍。
"Final Config"是依據(jù)實際最終搭建完成后的運行情況,倒推出的最低配置泛范,僅供參考让虐。
如果宿主機內(nèi)存只有16~32GB,可以使用"10 Worker Hosts without High Availability"搭配罢荡,且將DataNode放在所有VM上赡突,三臺VM即可滿足,但實用性可能不足区赵,即無法快樂的跑Job惭缰。

Service Role master01 master02 master03 utility01 gateway01 node001 node002 node003 Total
HDFS NameNode 4c2g
SecondaryNN 4c2g
*JournalNode 1c1g 1c1g 1c1g
*ZKFC + +
DataNode 4c4g 4c4g 4c4g
YARN ResourceManager 1c6g *1c6g
JobHistoryServer 1c1g
NodeManager 8c1g 8c1g 8c1g
ZK ZooKeeper 4c1g 4c1g 4c1g
Hive HiveServer2 4c4g
Metastore Server 4c4g
Hue Server&LB 1c4g
CM All Services 4c12g
Oozie Server 1c1g
DB MySQL 2c4g
*Kafka *Kafka 2c4g 2c4g 2c4g
*Spark *History Server 1c1g
*HBase *Master 4c4g
*Thrift Server 2c1g
*Region Server 4c8g 4c8g 4c8g
Max CPU Cores 4 4 4 4 4 8 8 8 44
Total Memory 11 4 2 20 8 5 5 5 60
Final Config 4c16g 4c8g 4c4g 4c16g 4c8g 4c8g 4c8g 4c8g 16c64g

1.2 各VM的FQDN與IP規(guī)劃

IP Addr FQDN short name
10.10.64.11 master01.cdh.lionxcat.com m01
10.10.64.12 master02.cdh.lionxcat.com m02
10.10.64.13 master03.cdh.lionxcat.com m03
10.10.64.51 utility01.cdh.lionxcat.com ut01
10.10.64.71 gateway01.cdh.lionxcat.com gw01
10.10.64.101 node001.cdh.lionxcat.com n001
10.10.64.102 node002.cdh.lionxcat.com n002
10.10.64.103 node003.cdh.lionxcat.com n003
10.10.64.250 centos7.cdh.lionxcat.com *c7

c7是模板機,不是CDH集群中的成員笼才,用于復(fù)制出其余所有VM漱受。

2. 宿主機環(huán)境準備

2.1 配置Terminal/PowerShell環(huán)境

  • 安裝Terminal和插件的方法略。
    如果對某個PowerShell命令不熟悉骡送,可以使用:
Get-Help New-VM -Online
  • 可選昂羡,配置好hosts,方便宿主機訪問VM摔踱。
# 用管理員權(quán)限修改 C:\Windows\System32\drivers\etc\hosts
ipconfig /flushdns

2.2 安裝Hyper-V

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
# 或者可以使用DISM安裝
# dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V /all /norestart
# 需要重啟電腦
Restart-Computer

2.3 配置VM網(wǎng)絡(luò)

參考-Set up a NAT network

參考-Hyper-V虛擬機配置內(nèi)部網(wǎng)絡(luò)固定IP并連接外網(wǎng)

# 創(chuàng)建一個名稱為cdh-wmswitch的內(nèi)部虛擬路由器
New-VMSwitch -Name cdh-vmswitch -SwitchType Internal
# 查詢出剛創(chuàng)建的cdh-wmswitch的ifIndex為60虐先,依據(jù)實際情況更改
Get-NetAdapter
# 設(shè)置cdh-wmswitch的IP地址,將上一步查出的InterfaceIndex帶入?yún)?shù)
New-NetIPAddress -IPAddress 10.10.64.1 -PrefixLength 24 -InterfaceIndex 60
# 設(shè)置cdh-wmswitch使用NAT獲得物理機的互聯(lián)網(wǎng)訪問派敷,此操作只能使用命令行
New-NetNat -Name cdh-vmnat -InternalIPInterfaceAddressPrefix 10.10.64.0/24

2.4 創(chuàng)建CentOS VM

參考-Create a Virtual Machine with PowerShell

下載CentOS 7赴穗,可下個Everything版本留著玩。
以下假定文件路徑為“$InstallMedia”所示。

# Set VM Name, Switch Name, and Installation Media Path.
$VMName = 'c7'
$Switch = 'cdh-vmswitch'
$BasePath = 'D:\VirtualMachines\CDH-Cluster'
$InstallMedia = 'D:\CentOS-7-x86_64-Everything-2009.iso'

# 創(chuàng)建VM般眉,可自行設(shè)置啟動內(nèi)存大小
# 硬盤空間可以大些了赵,因為會動態(tài)伸縮不會占用過多宿主機資源
# CentOS必須使用1代Hyper-VM
$VM = @{
    Name = $VMName
    MemoryStartupBytes = 4GB
    SwitchName = $Switch
    NewVHDPath = "$BasePath\$VMName\$VMName.vhdx"
    NewVHDSizeBytes = 64GB
    Path = $BasePath
    Generation = 1
}
New-VM @VM
# 設(shè)置CPU數(shù)量,可選甸赃,默認1core
Set-VMProcessor $VMName -Count 2

# 默認情況下如上VM會配備好一個DVD并默認從DVD啟動柿汛,否則可以執(zhí)行如下命令創(chuàng)建DVD:
# Add-VMScsiController -VMName $VMName
# Add-VMDvdDrive -VMName $VMName -ControllerNumber 1 -ControllerLocation 0 -Path $InstallMedia

# 加載CentOS7鏡像并設(shè)置啟動順序
$DVDDrive = Get-VMDvdDrive $VMName
Set-VMDvdDrive $VMName -Path $InstallMedia
# 默認情況下1代VM創(chuàng)建好后,啟動順序即如此埠对,不用修改
# Set-VMBios $VMName -StartupOrder @("CD", "IDE", "LegacyNetworkAdapter", "Floppy")

2.5 安裝CentOS

2.5.1 安裝前

開啟VM络断,并安裝系統(tǒng)。

$VMName = 'c7'
Start-VM $VMName
# 連接上VM進行OS安裝
VMConnect localhost $VMName

2.5.2 安裝中

安裝注意事項:

  • 可選项玛,在選擇"Install CentOS7"前啟用強制GPT分區(qū)貌笨,方便今后掛載大于2TB磁盤和磁盤動態(tài)伸縮。
    按TAB鍵襟沮,在最下方參數(shù)后面加上"inst.gpt"锥惋,即改成:"vmlinuz ... quiet inst.gpt",回車开伏。
  • 可選膀跌,設(shè)置時區(qū)為Shanghai。
  • 可選固灵,Keyboard layout自行配置捅伤。
  • 可選,添加簡體中文語言支持巫玻。
  • SOFTWARE SELECTION選取Base Environment:Compute Node(計算節(jié)點)丛忆。
  • 若手動磁盤分區(qū),需添加一個容量為2M的"biosboot"分區(qū)放置GPT仍秤。
  • 如果宿主機內(nèi)存不夠大熄诡,最好為CentOS分配夠大的Swap分區(qū),例如8GB以上徒扶,否則后面服務(wù)起不來一切白費。
  • 可選根穷,關(guān)閉KDUMP姜骡。
  • 因為生成VM時配置好了虛擬路由器,可以在安裝時直接設(shè)置好IP屿良,方便安裝完成后ssh上VM圈澈。
    • 靜態(tài)(Manual)IPv4;
    • 添加IP:10.10.64.250尘惧;
    • 掩碼:255.255.255.0康栈;
    • 網(wǎng)關(guān):10.10.64.1;
    • DNS:223.5.5.5,8.8.8.8;
    • 開機啟用(Automatic connect to ...)啥么。
  • 可選登舞,設(shè)置好Hostname:centos7.cdh.lionxcat.com。
  • 可選悬荣,創(chuàng)建新用戶時勾上"將此用戶設(shè)置為管理員"菠秒,也可今后自行添加到sudoers/wheel組。

2.5.3 安裝后

  • 使用VMConnect可以不用IP連接VM氯迂,但內(nèi)置的終端超難用践叠。使用自己喜歡的終端ssh登錄VM操作比較方便。
    若安裝時不配置IP嚼蚀,安裝后可在Hyper-V中選中該VM禁灼,最下網(wǎng)絡(luò)Tab里找到Hyper-V自動提供的IP(v4或v6)地址。

  • 若安裝時配置了IP轿曙,則嘗試登錄VM并判斷網(wǎng)絡(luò)是否連通弄捕。以下假定在Win10中配置了hosts,若沒配置可用IP拳芙。

ssh root@c7
ifconfig
ping www.xxx.com
  • 若安裝中沒有配置IP察藐,則先登錄VM并設(shè)置IP。
# 在宿主機中執(zhí)行
$VMName = 'c7'
Start-VM $VMName
VMConnect localhost $VMName
# 在c7中執(zhí)行
ifconfig
vi /etc/sysconfig/network-scripts/ifcfg-eth0 # eth0是具體VM網(wǎng)卡
# modify: BOOTPROTO="static"
# modify: ONBOOT="yes"
# append: IPADDR=10.10.64.250 # 今后需要替換成各VM自己的IP地址
# append: NETMASK=255.255.255.0
# append: GATEWAY=10.10.64.1
# append: DNS1=223.5.5.5
# append: DNS2=8.8.8.8

systemctl restart network
ping www.xxx.com
  • 可選舟扎,如果發(fā)現(xiàn)有ssh時登錄反應(yīng)慢的情況分飞,可修改關(guān)閉SSH使用DNS查詢。
vi /etc/ssh/sshd_config
# modify: from "#UseDNS yes" to "UseDNS no"

systemctl restart sshd
  • 補充說明睹限。
    1. 新裝的這臺VM(以下簡稱作c7)譬猫,將作為基板系統(tǒng),用于生成所有集群VM羡疗。
    2. 后續(xù)配置中染服,可隨時為VM做快照(Snapshot/Checkpoint)扑庞,方便備份壳坪、恢復(fù)、復(fù)制VM咳秉。
    3. 高階玩法痒钝,可使用Ansible等批量配置秉颗,或制作好CDH安裝鏡像(參考Creating Virtual Images of Cluster HostsCreating a CDH Cluster Using a Cloudera Manager Template)。

3. 通用VM的OS環(huán)境準備

以下內(nèi)容在c7上執(zhí)行送矩,是所有VM都需要的基礎(chǔ)配置蚕甥。

3.1 關(guān)閉防火墻

參考-Disabling the Firewall

systemctl stop firewalld
systemctl disable firewalld
# 驗證一下
systemctl status firewalld

3.2 關(guān)閉SELinux

參考-Setting SELinux mode

vi /etc/selinux/config
# modify: from "SELINUX=enforcing" to "SELINUX=disabled"

setenforce 0
reboot
# 驗證一下
getenforce

3.3 系統(tǒng)配置參數(shù)

參考-nproc Configuration

vi /etc/security/limits.d/20-nproc.conf # 具體文件名中數(shù)字可能不是20
# comment: # * soft nproc 4096

vi /etc/security/limits.conf
# append: * soft  nproc  65536

參考-Optimizing Performance in CDH

# Disable the tuned Service
systemctl start tuned
tuned-adm off
# tuned-adm list
systemctl stop tuned
systemctl disable tuned
# Disabling Transparent Hugepages (THP)
vi /etc/rc.d/rc.local
# append: 
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# to ensure that this script will be executed during boot
chmod +x /etc/rc.d/rc.local

# 在啟動參數(shù)GRUB_CMDLINE_LINUX中添加"transparent_hugepage=never"
vi /etc/default/grub
# modify: GRUB_CMDLINE_LINUX="transparent_hugepage=never ...省略"

grub2-mkconfig -o /boot/grub2/grub.cfg
# Setting the vm.swappiness Linux Kernel Parameter
sysctl -w vm.swappiness=1

# to ensure that this script will be executed during boot
vim /etc/sysctl.conf
# append: vm.swappiness=1

最后最好驗證是否重啟后生效。若有沒生效的參數(shù)栋荸,檢查配置文件拼寫是否正確菇怀。

reboot
ssh root@c7
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
cat /proc/sys/vm/swappiness

3.4 配置hostname

hostnamectl set-hostname centos7.cdh.lionxcat.com
vi /etc/sysconfig/network
# append: 
NETWORKING=YES
HOSTNAME=centos7.cdh.lionxcat.com

systemctl restart network
# 檢查一下
uname -a
hostname
# host -v -t A $(hostname)

3.5 配置hosts

參考-Configure Network Names

vi /etc/hosts
# 注意:一定要把FQDN放在緊跟IP后
# append:
10.10.64.11 master01.cdh.lionxcat.com m01
10.10.64.12 master02.cdh.lionxcat.com m02
10.10.64.13 master03.cdh.lionxcat.com m03
10.10.64.51 utility01.cdh.lionxcat.com ut01
10.10.64.71 gateway01.cdh.lionxcat.com gw01
10.10.64.101 node001.cdh.lionxcat.com n001
10.10.64.102 node002.cdh.lionxcat.com n002
10.10.64.103 node003.cdh.lionxcat.com n003
10.10.64.250 centos7.cdh.lionxcat.com c7

3.6 配置網(wǎng)絡(luò)時間同步

參考-Enable an NTP Service

CDH建議刪除chrony用ntpd代替凭舶,也可以配置CDH使用chrony。以下為ntpd用法爱沟,chrony可自行配置帅霜。

yum list installed chrony
# 如果有安裝chrony則刪除之,換成ntp
systemctl stop chronyd
yum remove -y chrony
yum install -y ntp
# 同步一次
ntpdate ntp.aliyun.com
# 啟動服務(wù)
systemctl start ntpd
systemctl enable ntpd
# 同步硬件CMOS時鐘
hwclock --systohc

4. CM安裝

4.1 創(chuàng)建ut01的VM

在通用VM配置完成后钥顽,將c7關(guān)機并復(fù)制一份命名為ut01义屏,用于承載CDH私有倉庫(以及其他服務(wù),參考角色規(guī)劃部分)蜂大。

# c7中執(zhí)行
poweroff
  • 采用復(fù)制VHD的方式闽铐,復(fù)制c7的磁盤,使用該磁盤文件生成ut01(Hyper-V會生成新MAC地址)奶浦。
# 在宿主機中執(zhí)行
# VM基礎(chǔ)配置
$BasePath = 'D:\VirtualMachines\CDH-Cluster'
$Switch = 'cdh-vmswitch'
# 復(fù)制源
$SourceVM = 'c7'
$SourceVHD = "$BasePath\$SourceVM\$SourceVM.vhdx"
# 復(fù)制目的地
$DestVM = 'ut01'
$DestPath = "$BasePath\$DestVM"
$DestVHD = "$DestPath\$DestVM.vhdx"

# 刪除c7所有快照以自動合并磁盤文件
Remove-VMSnapshot $SourceVM

# 將文件拷貝到新目錄
New-Item $DestPath -ItemType Directory
Copy-Item $SourceVHD $DestVHD

# 使用復(fù)制后的文件創(chuàng)建新VM兄墅,注意自行設(shè)置啟動內(nèi)存大小
$NewVM = @{
    Name = $DestVM
    MemoryStartupBytes = 16GB
    SwitchName = $Switch
    VHDPath = $DestVHD
    Path = $BasePath
    Generation = 1
}
New-VM @NewVM
# 可選,設(shè)置CPU
Set-VMProcessor $DestVM -Count 8
  • 啟動并配置IP和Hostname澳叉。
# 宿主機上執(zhí)行
$VMName = 'ut01'
Start-VM $VMName
VMConnect localhost $VMName
# ut01上執(zhí)行
vi /etc/sysconfig/network-scripts/ifcfg-eth0 # eth0是具VM網(wǎng)卡
# append: IPADDR=10.10.64.51

hostnamectl set-hostname utility01.cdh.lionxcat.com

vi /etc/sysconfig/network
# modify: HOSTNAME=utility01.cdh.lionxcat.com

systemctl restart network
# 外網(wǎng)是否可達
ping www.xxx.com
# 內(nèi)網(wǎng)c7是否可達隙咸,需要先啟動c7
ping c7

4.2 開啟NTP時間同步服務(wù)

可選:如果非生產(chǎn)環(huán)境,所以VM都與公網(wǎng)同步也可以成洗,只不過今后需要關(guān)掉CM的煩人的警告五督。
將ut01作為授時服務(wù)器,其余VM均與ut01同步時間瓶殃。

以下內(nèi)容在ut01上操作充包,配置ut01成為授時服務(wù)器。

vi /etc/ntp.conf
# 開放本機時間同步服務(wù)給指定網(wǎng)段
# append:
# restrict 10.100.64.0 mask 255.255.255.0 nomodify notrap
# 
# 可選:更換時間服務(wù)器
# comment:
# 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
# append:
# server ntp.aliyun.com prefer
# 
# 本機ntpd與本機CMOS同步
# append:
server 127.127.1.0
fudge 127.127.1.0 stratum 10

systemctl restart ntpd

以下內(nèi)容在c7上操作遥椿,配置c7從ut01獲取時間同步基矮。

vi /etc/ntp.conf
# comment: 
# 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
# append:
# server ut01 prefer

# 立即同步一次
systemctl stop ntpd
ntpdate ut01
systemctl start ntpd
ntpq -p

4.3 準備本地私有CDH倉庫

以下內(nèi)容在ut01上執(zhí)行,配置用于安裝CM和CDH的私有Repo冠场。

參考-Configuring a Local Package Repository

  • 安裝HTTP服務(wù)
# 以下操作在ut01上執(zhí)行
yum install -y httpd
systemctl start httpd
systemctl enable httpd

# 創(chuàng)建cm6目錄
mkdir -p /var/www/html/cloudera-repos/cm6
# 創(chuàng)建cdh6目錄
mkdir -p /var/www/html/cloudera-repos/cdh6
  • 將CM和CDH包拷貝到ut01上
# 以下操作在宿主機上執(zhí)行
# 拷貝CM包
scp "D:\cm6.3.1-redhat7.tar.gz" root@ut01:/var/www/html/cloudera-repos/cm6
# 拷貝CDH包
scp "D:\cdh6\*" root@ut01:/var/www/html/cloudera-repos/cdh6
  • 解壓縮文件
# 以下操作在ut01上執(zhí)行
tar xvfz cm6.3.1-redhat7.tar.gz -C /var/www/html/cloudera-repos/cm6 --strip-components=1
# 設(shè)置目錄權(quán)限
chmod -R ugo+rX /var/www/html/cloudera-repos/cm6
chmod -R ugo+rX /var/www/html/cloudera-repos/cdh6
# 在宿主機瀏覽器中檢查文件 http://ut01/cloudera-repos/

4.4 在VM上配置添加使用私有倉庫

以下內(nèi)容在ut01上執(zhí)行家浇,添加本機私有Repo。

vi /etc/yum.repos.d/cloudera-repo.repo
# append:
[cloudera-repo]
name=cloudera-repo
baseurl=http://utility01.cdh.lionxcat.com/cloudera-repos/cm6
enabled=1
gpgcheck=0

# 確認配置正確
yum repolist
# 分發(fā)到c7
scp /etc/yum.repos.d/cloudera-repo.repo root@c7:/etc/yum.repos.d/

4.5 安裝依賴軟件包

以下內(nèi)容在c7和ut01上都執(zhí)行碴裙,安裝必備的軟件包钢悲。

4.5.1 檢查Python

參考-Software Dependencies

# 若CentOS選擇計算節(jié)點安裝則默認都滿足
# CentOS7原裝了python 2.7.*
python --version
# 其他軟件包缺失參考文章自行安裝

4.5.2 安裝JDK

參考-Java Requirements

推薦使用CM包里的JDK版本安裝,或者自行安裝Oracle JDK或OpenJDK舔株。

  • 安裝CM包里的JDK版本
yum install -y oracle-j2sdk1.8

vi /etc/profile
# append:
JAVA_HOME=/usr/java/jdk1.8.0_181-cloudera
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 使之生效并測試
source /etc/profile
java -version
  • 可選:自行安裝Oracle JDK
# 若centos自帶OpenJDK莺琳,刪除之
# java -version
# rpm -qa | grep java
# rpm -e --nodeps java-1.8.0-openjdk-...
# 下載JDK
tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/java/

vi /etc/profile
# append:
JAVA_HOME=/usr/java/jdk1.8.0_202
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 使之生效并測試
source /etc/profile
java -version

4.5.3 安裝MySQL-JDBC

參考-Installing the MySQL JDBC Driver

若使用PG、MariaDB等其他DB自行參考文章安裝督笆。

wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.49.tar.gz
tar zxvf mysql-connector-java-5.1.49.tar.gz
# 最好放置到CM默認的目錄下
mkdir -p /usr/share/java
# 最好更改為CM默認的文件名
cp mysql-connector-java-5.1.49/mysql-connector-java-5.1.49-bin.jar /usr/share/java/mysql-connector-java.jar

4.6 安裝CM軟件包

在ut01上執(zhí)行芦昔,安裝Cloudera Manager Server诱贿,Daemons娃肿,Agent咕缎。

yum install -y cloudera-manager-daemons cloudera-manager-agent cloudera-manager-server

以下操作在c7上執(zhí)行,安裝CM Daemons & Agent料扰。

可選:若現(xiàn)在不安裝凭豪,今后讓CMServer自動安裝也行。

yum install -y cloudera-manager-daemons cloudera-manager-agent

# 修改agent配置文件晒杈,指向CM Server
vi /etc/cloudera-scm-agent/config.ini
# modify:
# server_host=utility01.cdh.lionxcat.com

4.7 數(shù)據(jù)庫準備

以下操作在ut01上執(zhí)行嫂伞,若MySQL使用云SaaS服務(wù)或規(guī)劃在其他VM,依據(jù)實際情況操作拯钻。

參考-Install and Configure MySQL for Cloudera Software

4.7.1 安裝MySQL

參考-MySQL Community Downloads

  • 可以直接從MySQL官方下載帖努,300~500MB,需要網(wǎng)速夠快
# 下載官方y(tǒng)um源
wget https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm
# 安裝yum源
yum localinstall -y mysql80-community-release-el7-3.noarch.rpm
# 更換mysql8.0為mysql5.7
yum-config-manager --disable mysql80-community
yum-config-manager --enable mysql57-community
# 查看更換成功否
yum repolist all | grep mysql | grep enabled
# 安裝mysql
yum install -y mysql-community-server
# 修改mysql配置文件粪般,參考官方文檔配置即可拼余,非生產(chǎn)環(huán)境非必須,略
# vi /etc/my.cnf
# 啟動mysql
systemctl start mysqld
systemctl enable mysqld
# 找到初始密碼
grep 'temporary password' /var/log/mysqld.log
# 執(zhí)行腳本重置
/usr/bin/mysql_secure_installation
# 設(shè)置一個帶有大小寫字母數(shù)字符號的root密碼(可能需要輸入4遍)然后一路y下去即可
  • 可選:可提前下載好包亩歹,直接安裝
# 下載包
wget https://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar
# 解壓縮
tar xvf mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar
# 安裝
rpm -ivh mysql-community-common-*.rpm mysql-community-libs-*.rpm mysql-community-server-*.rpm mysql-community-client-*.rpm
# 配置與啟動等后續(xù)步驟同上

4.7.2 創(chuàng)建各服務(wù)需要的DB

官方文檔中有描述所有需要預(yù)先創(chuàng)建的DB匙监。utf8編碼是必須的。
雖然官方允許配置各服務(wù)使用任意DB名和User名小作,但遵守官方默認規(guī)范也不復(fù)雜亭姥,若圖方便可使用相同User和Password。
新建User密碼均需要滿足密碼復(fù)雜度要求顾稀。也可自行修改配置文件降低要求达罗。

# 在ut01中執(zhí)行
mysql -uroot -p
/* 在MySQL CLI中執(zhí)行 */

CREATE DATABASE scm DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE USER 'scm'@'%' IDENTIFIED BY 'scm_Passw0rd';
GRANT ALL ON scm.* TO 'scm'@'%' IDENTIFIED BY 'scm_Passw0rd';

CREATE DATABASE amon DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE USER 'amon'@'%' IDENTIFIED BY 'amon_Passw0rd';
GRANT ALL ON amon.* TO 'amon'@'%' IDENTIFIED BY 'amon_Passw0rd';

CREATE DATABASE hue DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE USER 'hue'@'%' IDENTIFIED BY 'hue_Passw0rd';
GRANT ALL ON hue.* TO 'hue'@'%' IDENTIFIED BY 'hue_Passw0rd';

CREATE DATABASE metastore DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE USER 'hive'@'%' IDENTIFIED BY 'hive_Passw0rd';
GRANT ALL ON metastore.* TO 'hive'@'%' IDENTIFIED BY 'hive_Passw0rd';

CREATE DATABASE oozie DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE USER 'oozie'@'%' IDENTIFIED BY 'oozie_Passw0rd';
GRANT ALL ON oozie.* TO 'oozie'@'%' IDENTIFIED BY 'oozie_Passw0rd';

FLUSH PRIVILEGES;

4.7.3 生成CMServer的DB配置

參考-Set up the Cloudera Manager Database

# 參數(shù)含義:<databaseType> <databaseName> <databaseUser> <password>
# 依據(jù)實際情況修改參數(shù)
/opt/cloudera/cm/schema/scm_prepare_database.sh mysql scm scm scm_Passw0rd

4.8 啟動CMServer

以下操作在ut01上執(zhí)行。

systemctl start cloudera-scm-server
tail -f /var/log/cloudera-scm-server/cloudera-scm-server.log

systemctl start cloudera-scm-agent
tail -f /var/log/cloudera-scm-agent/cloudera-scm-agent.log

systemctl enable cloudera-scm-server
systemctl enable cloudera-scm-agent

以下操作在c7上執(zhí)行础拨。

systemctl start cloudera-scm-agent
systemctl enable cloudera-scm-agent

在宿主機訪問http://ut01:7180/氮块,用戶名/密碼:admin。
如果ut01和c7上的配置均成功诡宗,就可以在配置頁面看到兩臺VM滔蝉。

注意:
因后續(xù)操作將復(fù)制c7生成其余VM,若在c7上啟動過cloudera-scm-agent塔沃,則必須在復(fù)制c7前刪除agent生成的uuid蝠引,agent會在下次啟動時重新生成。若不重新生成uuid蛀柴,各VM的uuid重復(fù)將導(dǎo)致今后server無法識別各agent螃概。
若沒有在c7上啟動agent則無此需要。

systemctl stop cloudera-scm-agent
rm -f /var/lib/cloudera-scm-agent/uuid
# 不能再啟動Agent鸽疾,讓新的VM各自啟動各自的以生成不同uuid吊洼。

5. 創(chuàng)建CDH集群

操作與創(chuàng)建ut01的VM類似,只不過這次生成的不是ut01制肮,而是其余所有VM冒窍。

5.1 備份VM

先將兩臺VM關(guān)機递沪。并做些備份操作,以免后面操作出錯综液,或方便配置第二套集群款慨。

# 在宿主機上執(zhí)行
# 刪除所有快照以合并磁盤文件
Remove-VMSnapshot c7
Remove-VMSnapshot ut01
# 因為c7本身就是CM-Agent所在VM的備份,因此只需要再備份ut01即可
$BasePath = 'D:\VirtualMachines\CDH-Cluster'
New-Item "$BasePath\backup" -ItemType Directory
Copy-Item "$BasePath\ut01\ut01.vhdx" "$BasePath\backup"

5.2 生成其余VM

下面采用復(fù)制VHD的方式谬莹,復(fù)制c7的VHD用于創(chuàng)建其余VM檩奠。

# VM基礎(chǔ)配置
$BasePath = 'D:\VirtualMachines\CDH-Cluster'
$Switch = 'cdh-vmswitch'
# 復(fù)制源
$SourceVM = 'c7'
$SourceVHD = "$BasePath\$SourceVM\$SourceVM.vhdx"
# 復(fù)制目的地VM名集合
$DestVMColl = ('m01', 'm02', 'm03', 'n001', 'n002', 'n003', 'gw01')

# 刪除c7所有快照以合并磁盤文件
Remove-VMSnapshot $SourceVM

# 循環(huán)創(chuàng)建所有VM
ForEach ($DestVM in $DestVMColl) {
    $DestPath = "$BasePath\$DestVM"
    $DestVHD = "$DestPath\$DestVM.vhdx"
    # 將文件拷貝到新目錄
    New-Item $DestPath -ItemType Directory
    Copy-Item $SourceVHD $DestVHD
    # 創(chuàng)建新VM使用復(fù)制后的文件
    # 注意自行設(shè)定啟動內(nèi)存大小
    $NewVM = @{
        Name = $DestVM
        MemoryStartupBytes = 16GB
        SwitchName = $Switch
        VHDPath = $DestVHD
        Path = $BasePath
        Generation = 1
    }
    New-VM @NewVM
    # 設(shè)置CPU
    Set-VMProcessor $DestVM -Count 4
}

# 確認創(chuàng)建無誤,可以繼續(xù)配置

# 可選:創(chuàng)建一個VMGroup把這些VM都加進去
$GroupName = 'lionxcat-cdh'
New-VMGroup -Name $GroupName -GroupType VMCollectionType
$DestVMColl += (,'ut01')
ForEach ($DestVM in $DestVMColl) {
    $VM = Get-VM $DestVM
    Add-VMGroupMember $GroupName $VM
    # 慎重批量啟動VM
    # Start-VM @VM
}

注意:

  • 建議一個一個手工啟動VM并執(zhí)行后續(xù)配置附帽,以免宿主機內(nèi)存不夠用最后有些VM啟動不起來埠戳。
  • Hyper-V會在VM啟動時為其分配<MemoryStartupBytes>大小的內(nèi)存,在VM運行3~4分鐘后動態(tài)內(nèi)存收縮蕉扮,此時宿主機內(nèi)存占用下降可再啟新VM乞而。
  • 如果最終還是無法啟動所有VM,要么調(diào)小啟動內(nèi)存(可能導(dǎo)致今后有的組件內(nèi)存不足無法啟動)慢显,要么買內(nèi)存條插上爪模。
  • 到此步驟為止,8臺VM運行時內(nèi)存總和約不到17GB荚藻。
  • c7的作用就到此結(jié)束了屋灌,可以和ut01的備份VHD一起放置到其他地方備份。

5.3 配置其余VM

以下操作在新生成的VM上執(zhí)行应狱。

啟動并配置IP和Hostname共郭。啟動VM命令略。

vi /etc/sysconfig/network-scripts/ifcfg-eth0 # eth0是具體VM網(wǎng)卡
# append: IPADDR=10.10.64.xxx

hostnamectl set-hostname xxx.cdh.lionxcat.com

vi /etc/sysconfig/network
# modify: HOSTNAME=xxx.cdh.lionxcat.com

systemctl restart network
# 重啟agent
systemctl restart cloudera-scm-agent
# 這里再提醒一遍疾呻,若復(fù)制VM前啟動過scm-agent除嘹,需要刪除
# /var/lib/cloudera-scm-agent/uuid,并重啟agent才能順利被scm-server識別

5.4 為NameNode和DataNode的VM創(chuàng)建并掛載磁盤VHD

可選:為NN和DN單獨掛載可擴展的虛擬磁盤岸蜗,方便今后隨時增大磁盤空間或挪動磁盤文件到更大的硬盤上尉咕。
若不放在可擴展VHD上,今后空間不夠用了再擴充比較麻煩璃岳。
新掛載的VHD也創(chuàng)建成LVM年缎,方便今后在線擴容。

參考centos7 xfs磁盤管理(格式化铃慷、在線擴容)

創(chuàng)建并向VM添加動態(tài)VHD单芜。

# 在宿主機上執(zhí)行
$BasePath = 'D:\VirtualMachines\CDH-Cluster'
$VMColl = ('m01', 'm02', 'm03', 'n001', 'n002', 'n003')
ForEach ($VM in $VMColl) {
    $NewVHD = "$BasePath\$VM\$VM-data.vhdx"
    New-VHD -Path $NewVHD -Dynamic -SizeBytes 500GB
    # 在VM啟動狀態(tài)下可執(zhí)行,掛載SCSI設(shè)備犁柜,若SCSI-Controller(0,0)被占用洲鸠,自行調(diào)整位置
    Add-VMHardDiskDrive $VM -Path $NewVHD -ControllerNumber 0 -ControllerLocation 0 -ControllerType SCSI
}

在后面安裝CDH時,DN和NN的數(shù)據(jù)目錄(dfs.datanode.data.dir和dfs.namenode.name.dir)默認在/dfs下馋缅。
若更換其它位置扒腕,則下面命令里也應(yīng)該掛載到對應(yīng)目錄下淤齐。

以下操作在m0[1-3]和n00[1-3]上執(zhí)行。

在VM中掛載硬盤到目錄/dfs袜匿。

# 查看新掛載的VHD是否成功,正常情況應(yīng)被掛載到設(shè)備sdb
fdisk -l
# 從物理磁盤創(chuàng)建Physical Volume
pvcreate /dev/sdb
pvs
# 從PV創(chuàng)建Volume Group稚疹,名稱為vg-data
vgcreate vg-data /dev/sdb
vgs
# 從VG創(chuàng)建Logical Volume居灯,名稱為lv-data
lvcreate -l 100%FREE -n lv-data vg-data
lvs
# 格式化成xfs,注意路徑和名稱相對應(yīng)
mkfs.xfs /dev/vg-data/lv-data
# 掛載到/dfs内狗,若非該目錄則需調(diào)整
mkdir /dfs
mount /dev/vg-data/lv-data /dfs
mount -l

# 設(shè)置開機自動掛載怪嫌,注意,一定要添加在文件末尾
vi /etc/fstab
# append:
/dev/vg-data/lv-data /dfs                       xfs     defaults        0 0

# 檢查一下
vgdisplay vg-data

5.5 安裝CDH

如果上述配置無誤柳沙,這是最簡單的一步岩灭,很快就能完成。
在宿主機訪問http://ut01:7180/赂鲤,用戶名/密碼:admin噪径。

安裝注意事項:

  1. 若在"Specify Hosts"中沒有看到“當前管理的主機”中出現(xiàn)某臺VM,請檢查該VM的IP/Hostname配置数初,并查看scm-server的日志排查問題找爱。
  2. 在“選擇存儲庫--使用Parcel(建議)--更多選項”中,添加使用自建的私有倉庫泡孩,地址為:http://utility01.cdh.lionxcat.com/cloudera-repos/cdh6/ 车摄。然后會在“CDH版本”里出現(xiàn)"CDH-6.3.2-xxx"。
  3. 在"Inspect Cluster"中仑鸥,運行兩項測試吮播,若無問題,則說明上述配置一切正常眼俊。
  4. 選擇基本安裝"Essentials"意狠,以免安裝服務(wù)太多了內(nèi)存不足啟動不起來。
  5. 按照規(guī)劃選取各Host對應(yīng)的Service疮胖,輸入創(chuàng)建好的DB名稱摄职、用戶、密碼获列,最后執(zhí)行命令谷市。
  6. 若有服務(wù)啟動失敗,查看是否內(nèi)存不足導(dǎo)致击孩。如果內(nèi)存不足迫悠,可以:
    • 關(guān)停一些暫時不需要的服務(wù),如Oozie巩梢,HUE创泄,甚至把CM都關(guān)了只用Hadoop
    • 修改服務(wù)配置中的Java Heap大小
    • 增大CentOS的Swap
    • 去買內(nèi)存條艺玲。

本人情況,將Hive JVM堆棧默認配置為從4G降為2G鞠抑,客戶端從2G降為1G后饭聚,所有服務(wù)均順利啟動。

啟動后搁拙,各服務(wù)器占用宿主機的內(nèi)存使用情況如下(因角色放置不同秒梳,數(shù)據(jù)量不同,運行時長不同箕速,下面數(shù)據(jù)供參考)酪碘。

FQDN / Contents short name Mem Used Total Disk
master01.cdh.lionxcat.com m01 9.2GB 10.4GB
master02.cdh.lionxcat.com m02 5.9GB 10.4GB
master03.cdh.lionxcat.com m03 3.5GB 9.4GB
utility01.cdh.lionxcat.com ut01 12.2GB 16.8GB
gateway01.cdh.lionxcat.com gw01 6.3GB 9.4GB
node001.cdh.lionxcat.com n001 5.0GB 11.8GB
node002.cdh.lionxcat.com n002 5.0GB 11.8GB
node003.cdh.lionxcat.com n003 5.0GB 11.8GB
c7 & ut01 backup files - - 14.7GB
CDH/CentOS/MySQL/JDK - - 13.5GB
TOTAL 8 hosts 53GB 120GB

5.6 安裝后續(xù)

列舉一些可以拿這套集群玩點什么的想法。

  • 嘗試自己寫MR盐茎,爬點數(shù)據(jù)放入集群內(nèi)玩兴垦,用eCharts做些BI等等。
  • 優(yōu)化各組件的參數(shù)和JVM配置字柠,升高或降低探越。
  • 裝Spark,HBase窑业,Hive on Spark等等扶关,但需要更多內(nèi)存
  • 啟用HDFS的HA数冬,Yarn和Hive的負載均衡等等节槐,只為理解架構(gòu),非生產(chǎn)環(huán)境并無實際意義拐纱。
  • 用HBase做索引铜异,建立自己的照片和媒體庫索引,用Hive+Hue做可視化秸架。
  • Flink揍庄,Hudi ...

6. 回顧

整體花費一周時間,中間臨時買了兩根內(nèi)存條东抹。
前期規(guī)劃和查找各類文章花費50%蚂子,學(xué)習(xí)Hyper-V和PowerShell花費30%,安裝配置花費15%缭黔,整理文檔花費15%食茎。
中間重裝了兩次,只要配置好了c7和ut01兩臺VM馏谨,后面的操作也就是十幾分鐘搞完别渔。拋開Hyper-V其實很簡單。
流程還有可優(yōu)化的地方,但也沒必要浪費時間了哎媚。
內(nèi)存越多越好喇伯,個人認為32GB是最低配,但可能需要花費精力折騰并不劃算拨与。64GB基本夠用稻据,畢竟自己玩不會太多數(shù)據(jù)文件。我選擇了128GB买喧。
后面會將HDP的搭建也整理個文章出來捻悯,再往后有精力再嘗試搭建Apache原生。

如有勘誤岗喉、改進意見或自己搭建過程中的疑問,歡迎聯(lián)系lionxcat或留言炸庞。
轉(zhuǎn)載請注明原文https://github.com/lionxcat/articles-it/blob/main/cdh-setup-guide-using-hyperv-by-yourself.md钱床。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市埠居,隨后出現(xiàn)的幾起案子查牌,更是在濱河造成了極大的恐慌,老刑警劉巖滥壕,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纸颜,死亡現(xiàn)場離奇詭異,居然都是意外死亡绎橘,警方通過查閱死者的電腦和手機胁孙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來称鳞,“玉大人涮较,你說我怎么就攤上這事「灾梗” “怎么了狂票?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長熙暴。 經(jīng)常有香客問我闺属,道長,這世上最難降的妖魔是什么周霉? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任掂器,我火速辦了婚禮,結(jié)果婚禮上俱箱,老公的妹妹穿的比我還像新娘唉匾。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布巍膘。 她就那樣靜靜地躺著厂财,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峡懈。 梳的紋絲不亂的頭發(fā)上璃饱,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音肪康,去河邊找鬼荚恶。 笑死,一個胖子當著我的面吹牛磷支,可吹牛的內(nèi)容都是我干的谒撼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雾狈,長吁一口氣:“原來是場噩夢啊……” “哼廓潜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起善榛,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辩蛋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后移盆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悼院,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年咒循,在試婚紗的時候發(fā)現(xiàn)自己被綠了据途。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡叙甸,死狀恐怖昨凡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚁署,我是刑警寧澤便脊,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站光戈,受9級特大地震影響哪痰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜久妆,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一晌杰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筷弦,春花似錦肋演、人聲如沸抑诸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜕乡。三九已至,卻和暖如春梗夸,著一層夾襖步出監(jiān)牢的瞬間层玲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工反症, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辛块,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓铅碍,卻偏偏與公主長得像润绵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胞谈,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容