Hadoop 簡介
Hadoop是開源的分布式的并行計算平臺挣饥,以MapReduce除师、HDFS為核心的計算框架,HDFS為海量的數(shù)據(jù)提供了存儲扔枫,則MapReduce為海量的數(shù)據(jù)提供了計算汛聚。
Hadoop 架構
20140222160856375.png
(1)Pig是一個基于Hadoop的大規(guī)模數(shù)據(jù)分析平臺,Pig為復雜的海量數(shù)據(jù)并行計算提供了一個簡單的操作和編程接口短荐;
(2)Hive是基于Hadoop的一個工具倚舀,提供完整的SQL查詢叹哭,可以將sql語句轉換為MapReduce任務進行運行;
(3)ZooKeeper:高效的痕貌,可拓展的協(xié)調(diào)系統(tǒng)话速,存儲和協(xié)調(diào)關鍵共享狀態(tài);
(4)HBase是一個開源的芯侥,基于列存儲模型的分布式數(shù)據(jù)庫泊交;
(5)HDFS是一個分布式文件系統(tǒng),有著高容錯性的特點柱查,適合那些超大數(shù)據(jù)集的應用程序廓俭;
(6)MapReduce是一種編程模型,用于大規(guī)模數(shù)據(jù)集(大于1TB)的并行運算唉工。
Hadoop特點
- 高可靠性研乒。Hadoop按位存儲和處理數(shù)據(jù)的能力值得人們信賴。
- 高擴展性淋硝。Hadoop是在可用的計算機集簇間分配數(shù)據(jù)并完成計算任務的雹熬,這些集簇可以方便地擴展到數(shù)以千計的節(jié)點中。
- 高效性谣膳。Hadoop能夠在節(jié)點之間動態(tài)地移動數(shù)據(jù)竿报,并保證各個節(jié)點的動態(tài)平衡,因此處理速度非臣萄瑁快烈菌。
- 高容錯性。Hadoop能夠自動保存數(shù)據(jù)的多個副本花履,并且能夠自動將失敗的任務重新分配芽世。
- 低成本。與一體機诡壁、商用數(shù)據(jù)倉庫以及QlikView济瓢、Yonghong Z-Suite等數(shù)據(jù)集市相比,hadoop是開源的妹卿,項目的軟件成本因此會大大降低旺矾。
Hadoop集群有三種啟動模式:
- 單機模式:默認情況下運行為一個單獨機器上的獨立Java進程,主要用于調(diào)試環(huán)境
- 偽分布模式:在單個機器上模擬成分布式多節(jié)點環(huán)境纽帖,每一個Hadoop守護進程都作為一個獨立的Java進程運行
- 完全分布式模式:真實的生產(chǎn)環(huán)境宠漩,搭建在完全分布式的集群環(huán)境
環(huán)境安裝
(1)創(chuàng)建Hadoop用戶举反、用戶組
$ sudo adduser hadoop
$ sudo usermod -G sudo hadoop
(2) 安裝以及配置以來的軟件
- JDK 安裝
- SSH免密碼登錄
$ ssh-keygen -t rsa #一路回車
$ cat .ssh/id_rsa.pub >> .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
- 下載安裝Hadoop
$ vim /home/hadoop/.bashrc
#添加如下內(nèi)容
#HADOOP START
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export HADOOP_INSTALL=/usr/local/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_INSTALL/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
#HADOOP END
$ source ~/.bashrc
- 偽分布式環(huán)境安裝
(1)修改core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
</configuration>
- fs.default.name這是一個描述集群中NameNode結點的URI(包括協(xié)議懊直、主機名稱、端口號)火鼻,集群里面的每一臺機器都需要知道NameNode的地址室囊。DataNode結點會先在NameNode上注冊雕崩,這樣它們的數(shù)據(jù)才可以被使用。獨立的客戶端程序通過這個URI跟DataNode交互融撞,以取得文件的塊列表盼铁。
- hadoop.tmp.dir 是hadoop文件系統(tǒng)依賴的基礎配置,很多路徑都依賴它尝偎。如果hdfs-site.xml中不配置namenode和datanode的存放位置饶火,默認就放在/tmp/hadoop-${user.name}這個路徑中
(2)hfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
- dfs.replication它決定著系統(tǒng)里面的文件塊的數(shù)據(jù)備份個數(shù)。對于一個實際的應用致扯,它應該被設為3(這個數(shù)字并沒有上限肤寝,但更多的備份可能并沒有作用,而且會占用更多的空間)抖僵。少于三個的備份鲤看,可能會影響到數(shù)據(jù)的可靠性(系統(tǒng)故障時,也許會造成數(shù)據(jù)丟失)
- dfs.data.dir這是DataNode結點被指定要存儲數(shù)據(jù)的本地文件系統(tǒng)路徑耍群。DataNode結點上的這個路徑?jīng)]有必要完全相同义桂,因為每臺機器的環(huán)境很可能是不一樣的。但如果每臺機器上的這個路徑都是統(tǒng)一配置的話蹈垢,會使工作變得簡單一些慷吊。默認的情況下,它的值為file://${hadoop.tmp.dir}/dfs/data這個路徑只能用于測試的目的曹抬,因為它很可能會丟失掉一些數(shù)據(jù)罢浇。所以這個值最好還是被覆蓋。
- dfs.name.dir這是NameNode結點存儲hadoop文件系統(tǒng)信息的本地系統(tǒng)路徑沐祷。這個值只對NameNode有效嚷闭,DataNode并不需要使用到它。上面對于/temp類型的警告赖临,同樣也適用于這里胞锰。在實際應用中,它最好被覆蓋掉兢榨。
(3)mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- mapred.job.trackerJobTracker的主機(或者IP)和端口嗅榕。
(4)yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
- yarn.nodemanager.aux-services通過該配置,用戶可以自定義一些服務
(5)hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
Hadoop基本操作
# 格式化Hadoop文件系統(tǒng)
hadoop namenode -format
# 啟動hdfs守護進程(NN吵聪、DN)
start-dfs.sh
# 啟動YARN(NodeManager凌那、ResourceManager)
start-yarn.sh
#瀏覽器進入:http://localhost:8088進入ResourceManager管理頁面
#瀏覽器進入:http://localhost:50070進入HDFS頁面
Hadoop測試用例
# 在hdfs上創(chuàng)建文件夾
hdfs dfs -mkdir -p /user/hadoop/input
# 上傳本地文件到hdfs
hdfs dfs -put xxx.json /user/hadoop/input
# 詞頻統(tǒng)計
hadoop jar hadoop-mapreduce-examples-2.6.0-sources.jar wordcount /user/hadoop/input output
# 查看結果
hdfs dfs -cat /user/hadoop/output/*