[TOC]
# 集群簡介
HADOOP集群具體來說包含兩個集群:HDFS集群和YARN集群,兩者邏輯上分離,但物理上常在一起
HDFS集群:
負責海量數據的存儲,集群中的角色主要有 NameNode / DataNode
YARN集群:
負責海量數據運算時的資源調度,集群中的角色主要有 ResourceManager /NodeManager
(那mapreduce是什么呢?它其實是一個應用程序開發包)
本集群搭建案例,以5節點為例進行搭建,角色分配如下
~~~
hdp-node-01 NameNode SecondaryNameNode
hdp-node-02 ResourceManager
hdp-node-03 DataNode NodeManager
hdp-node-04 DataNode NodeManager
hdp-node-05 DataNode NodeManager
~~~

# 安裝
安裝jdk,至少1.8
下載hadoop
~~~
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.0.0/hadoop-3.0.0.tar.gz
~~~
# 注意
把下面的有關ip配置成`/etc/hosts`下面的別名對應ip,不然會報錯
還有hostname不能搞錯
時間同步
# 配置文件
1. 在hadoop-env.sh
hadoop下的`/etc/hadoop/`
里面有個`hadoop-env.sh`
把`export JAVA_HOME=/usr/local/jdk8`這個改下,原來是沒有值的
2. 在core-site.xml中寫
~~~
<configuration>
<!-- 指定hadoop所使用的文件系統schema(URI),HDFS老大(NameNode)的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.33.12:9000</value>
</property>
<!-- 指定hadoop運行時產生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoop3/tmp/hadoop</value>
</property>
</configuration>
~~~
3. 在hdfs-site.xml中寫
~~~
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/root/hadoop3/tmp/namenode</value>
</property>
<!--路徑可以配置多個,掛了的話有多個目錄可以恢復,號隔開-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/root/hadoop3/tmp/datanode</value>
</property>
<!--指定hdfs副本數量,默認是5個,這邊設置為1個-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!--保證數據備份和管理機制-->
<property>
<name>dfs.secondary.http.address</name>
<value>192.168.33.12:50090</value>
</property>
</configuration>
~~~
4. 在mapred-site.xml中寫
如果沒有這個文件`cp mapred-site.xml.template mapred-site.xml`
~~~
<configuration>
<!--指定mr運行在yarn上-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
~~~
5. 在yarn-site.xml中寫
~~~
<configuration>
<!-- Site specific YARN configuration properties -->
<!--指定yarn的老大(ResourceManager)的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.33.12</value>
</property>
<!--reducer獲取數據的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
~~~
6. 將hadoop添加到環境變量`/etc/profile`
~~~
# hadoop
export HADOOP_HOME=/root/hadoop3
export PATH=$PATH:$HADOOP_HOME/sbin
~~~
source下
注意這些文件夾要提前創建
如果報一些錯誤
~~~
file:///data
~~~
試下加`file:///`這種的
# 啟動
首先要namenode格式下,前面是1版本,后面是2版本
~~~
hdfs namenode -format(hadoop namenode -format)
~~~
然后顯示

表示目錄已經被成功初始化了
~~~
[root@12 current]# pwd
/root/hadoop3/tmp/namenode/current
[root@12 current]# ls -lah
total 16K
drwxr-xr-x 2 root root 112 Apr 7 12:31 .
drwxr-xr-x 3 root root 21 Apr 7 12:31 ..
-rw-r--r-- 1 root root 389 Apr 7 12:31 fsimage_0000000000000000000
-rw-r--r-- 1 root root 62 Apr 7 12:31 fsimage_0000000000000000000.md5
-rw-r--r-- 1 root root 2 Apr 7 12:31 seen_txid
-rw-r--r-- 1 root root 212 Apr 7 12:31 VERSION
~~~
里面fsi什么的是鏡像文件
seen_txid是迭代的版本號
然后我們查看下版本號
~~~
[root@12 current]# cat VERSION
#Sat Apr 07 12:31:09 UTC 2018
namespaceID=1413563114
clusterID=CID-6208de96-1ce0-4eea-b3df-f7a81c25f6b3
cTime=1523104269939
storageType=NAME_NODE
blockpoolID=BP-871390616-0.0.0.12-1523104269939
layoutVersion=-64
~~~
比如我namenode的clusterID是這個,其他的datanode的clusterID也是這個值表示是一個集群
## 方式一:每個守護線程逐一啟動
啟動順序如下:
NameNode,DateNode,SecondaryNameNode,JobTracker,TaskTracker
Hadoop-daemon.sh:用于啟動當前節點的進程
例如Hadoop-daemon.sh start namenode 用于啟動當前的名稱節點
Hadoop-daemons.sh:用于啟動所有節點的進程
例如:Hadoop-daemons.sh start datanode 用于啟動所有節點的數據節點
~~~
[root@12 sbin]# hadoop-daemon.sh start namenode
~~~
~~~
[root@12 sbin]# hadoop-daemon.sh start datanode
WARNING: Use of this script to start HDFS daemons is deprecated.
WARNING: Attempting to execute replacement "hdfs --daemon start" instead.
~~~
這種警告意思就是hadoop這個命令被hdfs替代了
這個命令在各個datanode都要執行
~~~
[root@12 sbin]# hadoop-daemon.sh start secondarynamenode
~~~
查看下進程
~~~
[root@12 sbin]# jps
3856 DataNode
4019 Jps
3988 SecondaryNameNode
3515 NameNode
~~~
注意最大文件數打開,不然一啟動就可能等會就退出了
~~~
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
~~~
## 前提
**文件最大打開數限制**
**ssh免密登錄**
注意authorized_keys這個文件里面的東西不要寫錯,前面ssh不要寫成sh,后面也不要少
還有.ssh權限問題
~~~
# mkdir /root/.ssh
# chown -R root:root /home/ansible
# chmod 700 /root
# chmod 700 /root/.ssh
# chmod 644 /root/.ssh/authorized_keys //公鑰文件的所有權限
# chmod 600 /root/.ssh/id_rsa //私鑰文件的所有權限
~~~
其中這兩項`PubkeyAuthentication yes` 和`PasswordAuthentication no`的值都要為yes,即公鑰認證和密碼認證都要為yes,因為我連接的方式是通過這兩種方式來連接的,
重啟sshd服務
`systemctl restart sshd.service`
mac要注意共享設置,允許遠程登錄
## 方法二:全部啟動或者全部停止
**啟動**
~~~
start-all.sh
~~~
啟動順序:`NameNode,DateNode,SecondaryNameNode,JobTracker,TaskTracker`
**停止**
~~~
stop-all.sh
~~~
關閉順序性:`JobTracker,TaskTracker,NameNode,DateNode,SecondaryNameNode`
## 方法三:分別啟動
首先創建slaves這個文件,在hadoop的配置文件
~~~
192.168.33.12
192.169.33.22
192.168.33.3
~~~
把這個slaves這個文件放到其他機器上,寫完最好檢查下
如果是hadoop3的話,這邊是workers,不是slaves
啟動:分別啟動HDFS和yarn
~~~
start-dfs.sh
start-yarn.sh
~~~
這個需要
### 問題
**問題1**
~~~
Starting namenodes on [localhost]
ERROR: Attempting to launch hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting launch.
~~~
解決:
是因為缺少用戶定義造成的,所以分別編輯開始和關閉腳本
~~~
$ vim sbin/start-dfs.sh
$ vim sbin/stop-dfs.sh
~~~
在空白處添加內容:
~~~
HDFS_DATANODE_USER=root
HDFS_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
~~~
**問題2**
~~~
Starting resourcemanager
ERROR: Attempting to launch yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting launch.
Starting nodemanagers
ERROR: Attempting to launch yarn nodemanager as root
ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting launch.
~~~
~~~
解決:
是因為缺少用戶定義造成的,所以分別編輯開始和關閉腳本
$ vim sbin/start-yarn.sh
$ vim sbin/stop-yarn.sh
~~~
在空白處添加內容:
~~~
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
~~~
# web端查看
訪問 `http://192.168.33.12:8088/`

訪問 `http://192.168.33.12:9870`,注意,這里是9870,不是50070了:






## 試用
把這個文件放到文件系統的/下
~~~
hdfs dfs -put anaconda-ks.cfg /
~~~
從本地上傳一個文本文件到hdfs的/wordcount/input目錄下
~~~
[HADOOP@hdp-node-01 ~]$ HADOOP fs -mkdir -p /wordcount/input
[HADOOP@hdp-node-01 ~]$ HADOOP fs -put /home/HADOOP/somewords.txt /wordcount/input
~~~
查看集群狀態
~~~
hdfs dfsadmin –report
~~~
查看HDFS中的目錄信息
~~~
hadoop fs –ls /
~~~
從HDFS下載文件
~~~
hadoop fs -get /yarn-site.xml
~~~
# 例子
~~~
cd /root/hadoop2/share/hadoop/mapreduce
~~~
然后我們計算下圓周率
~~~
hadoop jar hadoop-mapreduce-examples-2.6.4.jar pi 4 8
~~~
任務

- linux
- 常用命令
- 高級文本命令
- 面試題
- redis
- String
- list
- hash
- set
- sortedSet
- 案例-推薦
- java高級特性
- 多線程
- 實現線程的三種方式
- 同步關鍵詞
- 讀寫鎖
- 鎖的相關概念
- 多線程的join
- 有三個線程T1 T2 T3,保證順序執行
- java五種線程池
- 守護線程與普通線程
- ThreadLocal
- BlockingQueue消息隊列
- JMS
- 反射
- volatile
- jvm
- IO
- nio
- netty
- netty簡介
- 案例一發送字符串
- 案例二發送對象
- 輕量級RPC開發
- 簡介
- spring(IOC/AOP)
- spring初始化順序
- 通過ApplicationContextAware加載Spring上下文
- InitializingBean的作用
- 結論
- 自定義注解
- zk在框架中的應用
- hadoop
- 簡介
- hadoop集群搭建
- hadoop單機安裝
- HDFS簡介
- hdfs基本操作
- hdfs環境搭建
- 常見問題匯總
- hdfs客戶端操作
- mapreduce工作機制
- 案列-單詞統計
- 局部聚合Combiner
- 案列-流量統計(分區,排序,比較)
- 案列-倒排索引
- 案例-共同好友
- 案列-join算法實現
- 案例-求topN(分組)
- 自定義inputFormat
- 自定義outputFormat
- 框架運算全流程
- mapreduce的優化方案
- HA機制
- Hive
- 安裝
- DDL操作
- 創建表
- 修改表
- DML操作
- Load
- insert
- select
- join操作
- 嚴格模式
- 數據類型
- shell參數
- 函數
- 內置運算符
- 內置函數
- 自定義函數
- Transform實現
- 特殊分割符處理
- 案例
- 級聯求和accumulate
- flume
- 簡介
- 安裝
- 常用的組件
- 攔截器
- 案例
- 采集目錄到HDFS
- 采集文件到HDFS
- 多個agent串聯
- 日志采集和匯總
- 自定義攔截器
- 高可用配置
- 使用注意
- sqoop
- 安裝
- 數據導入
- 導入數據到HDFS
- 導入關系表到HIVE
- 導入表數據子集
- 增量導入
- 數據導出
- 作業
- 原理
- azkaban
- 簡介
- 安裝
- 案例
- 簡介
- command類型單一job
- command類型多job工作流flow
- HDFS操作任務
- mapreduce任務
- hive腳本任務
- hbase
- 簡介
- 安裝
- 命令行
- 基本CURD
- 過濾器查詢
- 系統架構
- 物理存儲
- 尋址機制
- 讀寫過程
- Region管理
- master工作機制
- 建表高級屬性
- 與mapreduce結合
- 協處理器
- 點擊流平臺開發
- 簡介
- storm
- 簡介
- 安裝
- 集群啟動及任務過程分析
- 單詞統計
- 并行度
- ACK容錯機制
- ACK簡介