1. 程式人生 > >從零開始構建 Hadoop 集群

從零開始構建 Hadoop 集群

mod ase 壓縮 memory ssh-key frame In 文件 cor

一、簡介 當今只要談到大數據,自然想到Hadoop,以前Hadoop還只是個軟件、系統,而如今更多代表的是一個大數據生態圈。 本文談的 Hadoop 特指一個軟件,它是 Apache 基金會的頂級項目之一,它本身主要解決了大數據領域的兩大核心問題,如何存儲(hdfs)、如何計算(mapreduce)。 官方文檔:http://hadoop.apache.org 閑言少敘,下面進入正題。 二、部署環境的準備工作 1、服務器 本次選擇使用4臺物理機來搭建Hadoop集群,配置如下 Master CPU(24核) MEM(48G) DISK(2T*1 -> RAID10) Slave01 CPU(24核) MEM(12G) DISK(1T*4) Slave02 CPU(12核) MEM(24G) DISK(1T*4) Slave03 CPU(24核) MEM(16G) DISK(1T*4) # 還是挺慘的~ 2、系統選擇的是 CentOS 6.9 x86_64 三、系統初始化 1、配置主機名、停用多余的服務、關閉SELinux、Iptables 2、修改最大打開文件描述符 shell > tail -4 /etc/security/limits.conf * - nofile 65536 # End of file 3、關閉透明大頁 shell > tail -1 /etc/rc.local echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag 4、創建 Unix 用戶賬號 shell > useradd hadoop | echo hadoop | passwd --stdin hadoop # 所有服務器都需要創建 5、格式化硬盤 shell > mkdir /dfs && chown -R hadoop.hadoop /dfs # Master 執行 shell > mkdir -p /dfs/{disk1,disk2,disk3} shell > mkfs.ext4 /dev/sdb、/dev/sdc、/dev/sdd shell > tail -3 /etc/fstab /dev/sdb /dfs/disk1 ext4 defaults,noatime 0 0 /dev/sdc /dfs/disk2 ext4 defaults,noatime 0 0 /dev/sdd /dfs/disk3 ext4 defaults,noatime 0 0 shell > mount -a shell > chown -R hadoop.hadoop /dfs # 所有 Slave 都需要執行 6、時間同步 shell > crontab -l 0 */2 * * * /usr/sbin/ntpdate us.pool.ntp.org | /sbin/hwclock -w > /dev/null # 時間同步挺重要的, 上次遇到過由於時間不同步導致 HBase 的 RegionServer 無法啟動 # init 6 四、搭建 Hadoop 集群 1、配置用戶免密登陸 root shell > ssh-keygen # 生成密鑰 root shell > ssh-copy-id -i ~/.ssh/id_rsa.pub slave01 root shell > ssh-copy-id -i ~/.ssh/id_rsa.pub slave02 root shell > ssh-copy-id -i ~/.ssh/id_rsa.pub slave03 hadoop shell > ssh-keygen # 生成密鑰 hadoop shell > ssh-copy-id -i ~/.ssh/id_rsa.pub master hadoop shell > ssh-copy-id -i ~/.ssh/id_rsa.pub slave01 hadoop shell > ssh-copy-id -i ~/.ssh/id_rsa.pub slave02 hadoop shell > ssh-copy-id -i ~/.ssh/id_rsa.pub slave03 # Hadoop 控制腳本(不是 Hadoop 守護進程)依賴 SSH 來管理服務的啟停。 # Tips: ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@slave01 2、安裝 jdk shell > rpm -ivh jdk-8u161-linux-x64.rpm shell > ansible slave -m shell -a 'rpm -ivh jdk-8u161-linux-x64.rpm' shell > vim /etc/profile export JAVA_HOME=/usr/java/default shell > source /etc/profile shell > java -version java version "1.8.0_161" Java(TM) SE Runtime Environment (build 1.8.0_161-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode) # jdk 是需要所有機器都安裝的, 且配置環境變量 3、下載、安裝 Hadoop shell > wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.9.1/hadoop-2.9.1.tar.gz shell > tar xf hadoop-2.9.1.tar.gz -C /usr/local shell > chown -R hadoop.hadoop /usr/local/hadoop-2.9.1 shell > tail -2 /etc/profile export HADOOP_HOME=/usr/local/hadoop-2.9.1 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin shell > source /etc/profile 4、配置 Hadoop 1> hadoop-env.sh 一個全局環境變量控制文件, 該文件中的值會被 yarn-env.sh、mapred-env.sh 覆蓋 shell > vim /usr/local/hadoop-2.9.1/etc/hadoop/hadoop-env.sh export JAVA_HOME=/usr/java/default # JAVA_HOME export HADOOP_HEAPSIZE=1000 # 內存堆大小 # Hadoop 默認為每個守護進程分配1000MB內存, 資料顯示, 以 NameNode 進程來說, 保守計算每100萬個數據塊需要1000MB內存, # 我們集群為3個節點, 每個節點有3T硬盤, 數據塊大小為256MB, 每個數據塊有3個復本, 大概有12000個數據塊 -> 3*3000000MB/(256MB*3), 默認值足夠了。 # Tips: 可以單獨為每個進程設置不同的內存大小 2> core-site.xml shell > vim /usr/local/hadoop-2.9.1/etc/hadoop/core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://192.168.10.50</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:///dfs/tmp/hadoop-${user.name}</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> <property> <name>fs.trash.interval</name> <value>1440</value> </property> </configuration> # 模板文件:HADOOP_HOME/share/doc/hadoop/hadoop-project-dist/hadoop-common/core-default.xml 3> hdfs-site.xml shell > vim /usr/local/hadoop-2.9.1/etc/hadoop/hdfs-site.xml <configuration> <property> <name>dfs.blocksize</name> <value>134217728</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.handler.count</name> <value>100</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///dfs/disk1/data,/dfs/disk2/data,/dfs/disk3/data</value> </property> <property> <name>dfs.namenode.checkpoint.dir</name> <value>file:///dfs/namesecondary</value> </property> </configuration> # 模板文件:HADOOP_HOME/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml 4> yarn-site.xml shell > vim /usr/local/hadoop-2.9.1/etc/hadoop/yarn-site.xml <configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>192.168.10.50</value> </property> <property> <name>yarn.nodemanager.local-dirs</name> <value>file:///dfs/disk1/nm-local-dir,/dfs/disk2/nm-local-dir,/dfs/disk3/nm-local-dir</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>10240</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>10</value> </property> </configuration> # 模板文件:HADOOP_HOME/share/doc/hadoop/hadoop-yarn/hadoop-yarn-common/yarn-default.xml 5> mapred-site.xml shell > vim /usr/local/hadoop-2.9.1/etc/hadoop/mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.map.memory.mb</name> <value>2048</value> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>2048</value> </property> <property> <name>mapred.child.java.opts</name> <value>-Xmx1024m</value> </property> </configuration> # 模板文件:HADOOP_HOME/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml 6> slaves shell > tail /usr/local/hadoop-2.9.1/etc/hadoop/slaves 192.168.10.51 192.168.10.52 192.168.10.53 5、同步配置文件 shell > ansible slave -m synchronize -a 'src=/usr/local/hadoop-2.9.1 dest=/usr/local/' 6、啟動 Hadoop shell > su - hadoop -c "hdfs namenode -format" # 格式化文件系統 18/06/03 16:24:39 INFO common.Storage: Storage directory /dfs/name has been successfully formatted. # 表示成功 shell > su - hadoop hadoop shell > start-dfs.sh # 啟動 hdfs hadoop shell > start-yarn.sh # 啟動 yarn hadoop shell > jps # Master 節點服務啟動成功 14032 ResourceManager 13745 SecondaryNameNode 14364 Jps 13406 NameNode hadoop shell > ansible slave -m shell -a 'jps' # Slave 節點服務啟動成功 slave02 | SUCCESS | rc=0 >> 4324 DataNode 4936 Jps 4572 NodeManager slave01 | SUCCESS | rc=0 >> 4807 DataNode 5065 NodeManager 5455 Jps slave03 | SUCCESS | rc=0 >> 4720 DataNode 5365 Jps 4975 NodeManager 五、附加 1、hdfs dfs -ls # 列出當前用戶家目錄 18/06/03 17:16:30 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable ls: `.': No such file or directory 解決方法: 1> 根據你 hadoop 的版本,來 http://dl.bintray.com/sequenceiq/sequenceiq-bin 下載一個對應版本的 hadoop-native-64 包 2> 解壓壓縮包,覆蓋到 HADOOP_HOME/lib/native/ 目錄下即可! shell > tar xf hadoop-native-64-2.7.0.tar -C /usr/local/hadoop-2.9.1/lib/native/ hadoop shell > hdfs dfs -ls ls: `.': No such file or directory # 創建用戶家目錄即可 hdfs -mkdir -p /user/hadoop # 如果沒有對應版本就下載個最接近的也行,我的環境 hadoop 2.9.1,下載 2.7.0 沒有問題。


從零開始構建 Hadoop 集群