文章目錄
1. linux ssh免密登陸配置
hadoop節點之間的通訊是通過ssh進行的,SSH默認都是需要密碼的,開啓免密鑰登錄會減少很多麻煩。操作很簡單,兩步(三步)就可以完成。
- 首先在本地生成公鑰和私鑰。分別在所有節點上執行:
ssh-keygen -t rsa
#後面都按回車跳過即可(三次)
# 運行結束後在 ~/.ssh/下生成兩個新文件: id_rsa.pub和id_rsa
設置本機ssh免密
#cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
- 將公鑰拷貝到本機和遠程主機.
ssh-copy-id username@host
or
ssh-copy-id node01
ssh-copy-id node02
……
# username是用戶名 host是主機的地址
#遠程主機將用戶的公鑰保存在 ~/.ssh/authorized_keys文件中
-
如果發現. Agent admitted failure to sign using the key 這個錯誤,還要輸入密碼,是ssh本身的問題.
可以使用命令:
ssh-add ~/.ssh/id_rsa 把私鑰加進來即可
測試能否免密登陸:
[root@node01 /]# ssh node02
[root@node02 ~]#
免密登陸設置成功。
2. java環境配置
vi /etc/profile
在profile文件末尾加入:
export JAVA_HOME=/usr/share/jdk1.6.0_14
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
3. Hadoop完全分佈式(full)
- 理論
並行:提升速度的關鍵
分佈式運行
計算與數據在一起——計算向數據移動
Hadoop簡介:
- 分佈式存儲系統HDFS (Hadoop Distributed File System )
分佈式存儲系統
提供了 高可靠性、高擴展性和高吞吐率的數據存儲服務 - 分佈式計算框架MapReduce
分佈式計算框架(計算向數據移動)
具有 易於編程、高容錯性和高擴展性等優點。 - 分佈式資源管理框架YARN(Yet Another Resource Management)
負責集羣資源的管理和調度
本文搭建了4虛擬機部署hadoop,可根據實際機器性能指定,搭建3臺也可以,只需修改下配置即可。
- 修改4臺虛擬機的hosts文件
vi /etc/hosts
加入如下:
192.168.33.101 node01
192.168.33.102 node02
192.168.33.103 node03
192.168.33.104 node04
節點 | 配置 |
---|---|
node01 | namenode |
node02 | secondarynamenode、datanode |
node03 | datanode |
node04 | datanode |
- 進入node01主機,安裝配置hadoop:
將hadoop解壓到/opt/目錄下
tar -zxvf hadoop-3.1.1.tar.gz -C /opt/
然後進入/opt/目錄,刪掉doc文件夾
cd /opt/hadoop-3.1.1/
rm -rf share/doc
修改hadoop配置
cd $HADOOP_HOME/etc/hadoop
vi + hadoop-env.sh
在末尾加入:
export JAVA_HOME=/usr/share/jdk8
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
vi + core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:9820</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/aaron/hadoop/full</value>
</property>
</configuration>
vi + hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node02:9868</value>
</property>
</configuration>
vi workers
刪掉localhost,加入:
node02
node03
node04
- 再把修改配置後的hadoop分發到其他節點的相同目錄下
scp /opt/hadoop-3.1.1 node02:`pwd`
scp /opt/hadoop-3.1.1 node03:`pwd`
scp /opt/hadoop-3.1.1 node04:`pwd`
- 啓動
先在主節點namenode裏進行格式化
~/sbin/hdfs namenode -format
格式化完成後再啓動hadoop hdfs
~/sbin/start-dfs.sh
查看啓動是否成功,分別在各個節點執行:
jps
4. Hadoop HDFS高可用集羣搭建(HA)
hostname | NN-1 | NN-2 | DN | ZK | ZKFC | JNN |
---|---|---|---|---|---|---|
node01 | * | * | * | |||
node02 | * | * | * | * | * | |
node03 | * | * | * | |||
node04 | * | * |
4.1 安裝配置zookeeper
進入主機node02,將zookeeper解壓到/opt/目錄下
tar -zxvf zookeeper-3.4.6.tar.gz -C /opt/
修改zookeeper配置文件
cd conf/
cp zoo_sample.cfg zoo.cfg
vi + zoo.cfg
修改:
dataDir=/var/aaron/zookeeper
並在末尾加入:
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888
創建dataDir文件夾,並新建myid文件,在node02輸入1
mkdir /var/aaron/zookeeper
cd /var/aaron/zookeeper
echo 1 > myid
將zookeeper分發到node03、node04,分別修改其myid文件值爲2、3。
至此初步配置完成,啓動3臺zookeeper服務:
~/bin/zkServer.sh start
~/bin/zkServer.sh status
連接:
~/bin/zkCli.sh
4.2 安裝配置hadoop HA
- 修改 hadoop-env.sh,加入:
export JAVA_HOME=/usr/share/jdk8
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
- 修改 core-site.xml
<configuration>
<!-- 指定hdfs的nameservice -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop臨時目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/var/aaron/hadoop/full</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
</configuration>
- 修改 hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--指定hdfs的nameservice爲mycluster,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- mycluster下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node01:9820</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node02:9820</value>
</property>
<!-- http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node01:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node02:9870</value>
</property>
<!-- 指定NameNode的edits元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/aaron/hadoop/journaldata</value>
</property>
<!-- 開啓NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現方式 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
</value>
</property>
<!-- 使用sshfence隔離機制時需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
- hadoop分發到其他節點
4.3 Hadoop HDFS HA集羣的啓動步驟
注意:嚴格按照下面的啓動步驟
- 按照前面的啓動方式啓動zookeeper集羣(分別node02、node03、node04上啓動zk)
- 啓動journalnode(分別在node01、node02、node03上執行)
sbin/hdfs --daemon start journalnode
[root@node01 /]# jps
2444 JournalNode
2493 Jps
出現JournalNode則表示journalnode啓動成功。
- 格式化 HDFS
在node01上執行命令:
hdfs namenode -format
倒數4行左右的地方,出現這一句就表示成功
common.Storage: Storage directory /home/hadoop/apps/dfs/name has been successfully formatted.
- 複製 hadoop.tmp.dir 配置下的文件到node02中
必須先啓動node01節點上的namenode,在node01上執行:
hdfs --daemon start namenode
jps查看namenode是否已啓動
[root@node01 hadoop]# jps
2710 Jps
2444 JournalNode
2668 NameNode
然後再node02上執行:
hdfs namenode -bootstrapStandby
- 格式化ZKFC(在node01上執行一次即可)
hdfs zkfc -formatZK
在倒數第3行提示如下內容表示成功
ha.ActiveStandbyElector: Successfully created /hadoop-ha/bi in ZK.
此時在zookeeper集羣中可以查看:
[root@node04 hadoop]# zkCli.sh
[zk: localhost:2181(CONNECTED) 4] get /hadoop-ha/mycluster
cZxid = 0x100000006
ctime = Thu Dec 20 22:29:00 CST 2018
mZxid = 0x100000006
mtime = Thu Dec 20 22:29:00 CST 2018
pZxid = 0x100000006
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0
- 啓動HDFS(在node01上執行)
start-dfs.sh
- 訪問192.168.33.101:9870、192.168.33.102:9870
5. Hadoop MapReduce、YARN 高可用集羣搭建
前面搭建好HDFS後,繼續在此基礎上完成MapReduce、YARN的配置。
hostname | NN-1 | NN-2 | DN | ZK | ZKFC | JNN | RS | NM |
---|---|---|---|---|---|---|---|---|
node01 | * | * | * | |||||
node02 | * | * | * | * | * | * | ||
node03 | * | * | * | * | * | |||
node04 | * | * | * | * |
5.1 修改 mapred-site.xml
<configuration>
<!-- 指定mr框架爲yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
5.2 修改yarn-site.xml
<configuration>
<!-- 開啓RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分別指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node03</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node04</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>node03:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>node04:8088</value>
</property>
<!-- 指定zk集羣地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
5.3 修改hadoop-env.sh
在末尾加入:
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
將以上修改文件分發到其他節點相同目錄。
5.4 啓動yarn
- 先啓動zookepper:zkServer.sh start
- 再啓動hdfs:start-dfs.sh
- 啓動yarn:start-yarn.sh
6 windows本地運行調試mapreduce
- 解壓hadoop包到D:/hadoop3.1目錄下;
- 環境變量配置
HADOOP_HOME=C:\hadoop3.1
HADOOP_USER_NAME=root
PATH裏添加%HADOOP_HOME%\bin
-
lib整合
下載bin目錄,將bin下的文件覆蓋到hadoop部署目錄下,再將hadoop.dll 放到 C:/windows/system32下。hadoop-3.1.1對應的bin目錄下載。- 1、 缺少winutils.exe:
Could not locate executable null \bin\winutils.exe in the hadoop binaries - 2、 缺少hadoop.dll:
Unable to load native-hadoop library for your platform… using builtin-Java classes where applicable
- 1、 缺少winutils.exe:
-
創建Configuration時加入如下代碼即可再eclipse或idea裏運行了,而無需打成jar包上傳到linux再通過命令執行。
Configuration conf = new Configuration();
conf.set("mapreduce.app-submission.coress-paltform", "true");
conf.set("mapreduce.framework.name", "local");