大數(shù)據(jù)的生態(tài)系統(tǒng)
1.存儲
Hadoop hdfs
2.計算引擎
map/reduce v1
map/reduce v2(map/reduce on yarn)
Tez
spark
3.Impala Presto Drill 直接跑在hdfs上
pig(腳本方式)hive(SQL語言)跑在map/reduce上
hive on tez/sparkSQL
4.流式計算-storm
5.kv store cassandra mongodb hbase
6. Tensorflow Mahout
7.Zookeeper Protobuf
8. sqoop kafka flume.....

一、安裝Hadoop
(先在本機上安裝Hadoop ,解壓的即是安裝。)
1、安裝VirtualBox
2、安裝完成后新建虛擬機名稱為master
3、設(shè)定VirtualBox虛擬網(wǎng)卡的IP地址:
先設(shè)置虛擬機中的網(wǎng)絡(luò)設(shè)置
在虛擬機中選用host-only網(wǎng)絡(luò)模式
然后進入Linux界面進行IP地址配置:
vi /etc/sysconfig/network-sripts/ifcfg-enp0s3
TYPE=Ethernet
IPADDR=192.168.56.100
NETMASK=255.255.255.0
修改Linux主機名:(主機名千萬不能有下劃線!)
hostnamectl set-hostname master
4、重啟網(wǎng)絡(luò)(使網(wǎng)卡生效)service network restart
互相ping,看是否測試成功,若不成功,注意防火墻的影響。關(guān)閉windows或虛擬機的防火墻。systemctl stop firewalld system disable firewalld
使用XShell登陸
檢查ssh服務(wù)狀態(tài)
systemctl status sshd (service sshd status)
5、驗證使用XShell是否能登陸成功。
將hadoop和jdk上傳到虛擬機(用xftp5上傳)
在Linux中安裝
JDK rpm -ivh ./xxxxx.jdk
6、驗證
rpm -qa | grep jdk
7、在命令行中敲java命令,確認jdk已經(jīng)安裝完成
(jdk默認安裝在/usr/java目錄下)
8、在Linux中安裝hadoop
cd /usr/local(到存放Hadoop目錄下準備解壓)
tar –xvf ./hadoop-2.7.2.tar.gz
9、把目錄修改為:
hadoop mv hadoop-2.7.2 hadoop(方便今后操作)
10、修改
hadoop-env.sh(配置Hadoop運行環(huán)境)
vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh
11、修改export JAVA_HOME (為了Java能夠找到執(zhí)行的命令)
export JAVA_HOME=/usr/java/default
12、把/usr/hadoop/bin和/usr/hadoop/sbin設(shè)到PATH中
vi /etc/profile
追加
export PATH=$PATH:/usr/hadoop/bin:/usr/hadoop/sbin(為了能讓系統(tǒng)找到并使用Hadoop命令)
source etc/profile(讓配置文件生效)
測試hadoop命令是否可以直接執(zhí)行,任意目錄下敲hadoop
關(guān)閉master虛擬機并復(fù)制3份master虛擬機
分別修改3份虛擬機的ip和hostname,確認互相能夠ping通,用ssh登陸,同時修改所有虛擬機的/etc/hosts,確認使用名字可以ping通
二、Hadoop測試
1、下面搭建Hadoop集群
首先配置core-site文件
cd /usr/local/hadoop/etc/hadoop
vim core-site.xml(配置所有datanode的管理者信息)
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
(然后將上面的配置文件分發(fā)到各個datanode,目的是讓各個datanode知道自己 的管理者是誰)
2、啟動集群
1)在master上啟動
hadoop-daemon.sh start namenode
2)在slave上啟動
hadoop-daemon.sh start datanode
3)用jps指令觀察執(zhí)行結(jié)果
4)用hdfs dfsadmin -report觀察集群配置情況
5)通過http://192.168.56.100:50070到web界面觀察集群運行情況
6)用hadoop-daemon.sh stop ...手工關(guān)閉集群
3、對集群進行集中管理(避免每次對每個機器進行手動啟動)
1)修改master上文件
vi /etc/hadoop/slaves
slave1
slave2
slave3
2)使用start-dfs.sh啟動集群,并觀察結(jié)果
3)使用stop-dfs.sh停止集群
4)配置免密SSH遠程登陸(此時需要密碼才能登陸)
ssh slave1
輸入密碼
exit
修改每次遠程登錄的密碼問題
cd
ls -la
cd .ssh
ssh-keygen -t rsa (四個回車)
會用rsa算法生成私鑰id_rsa和公鑰id_rsa.pub
(id_rsa 標志root的私鑰)
ssh-copy-id slave1/2/3
(把公鑰拷貝到slave上面,以后遠程登錄slave就用公鑰去解開root的私鑰)
再次ssh slave1
(此時已經(jīng)不再需要密碼)
5)重新使用start-dfs.sh啟動集群
5、修改windows機上C:\Windows\System32\drivers\etc\hosts文件,可以通過名字訪問集群web界面
192.168.56.100 master
6、使用hdfs dfs 或者hadoop fs命令對文件進行增刪改查的操作
1)hadoop fs -ls / 查看Hadoop根目錄下的文件
2)hadoop fs -put file / 把Linux本地的file文件丟到Hadoop的根目錄下
3)hadoop fs -mkdir /dirname 在Hadoop下新建dirname目錄
4)hadoop fs -text /filename 查看filename文件內(nèi)容
5)hadoop fs -rm /filename 刪除filename文件
7、通過網(wǎng)頁觀察文件情況
8、將hdfs-site.xml的replication值設(shè)為2,通過網(wǎng)頁觀察分塊情況
vi hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
9、設(shè)定dfs.namenode.heartbeat.recheck-interval為10000,然后停掉其中一臺slave,觀察自動復(fù)制情況
(服務(wù)器會默認5分鐘自動檢測機器的運行情況,如果一臺機器done掉,系統(tǒng)會讓其他機器去替代那個done掉的機器,把那個機器的文件備份到其他的機器上,這里把檢測的時間設(shè)置為10秒。)
10、啟動停掉的slave節(jié)點,通過網(wǎng)頁觀察datanode的動態(tài)添加
11、添加新的節(jié)點,體會hadoop的橫向擴展
1)啟動slave4,關(guān)閉防火墻,修改hostname
2)修改etc/hosts,加入對自己以及其他機器的解析,重啟網(wǎng)絡(luò)
3)在master中設(shè)定對于slave4的解析
4)啟動slave4的datanode,通過網(wǎng)頁進行觀察
5)hdfs dfsadmin –shutdownDatanode slave4:50020
(通過java程序訪問hdfs,就把HDFS集群當(dāng)成一個大的系統(tǒng)磁盤就行了!)
12、使用FileSystem類解決問題
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.56.100:9000");
FileSystem fileSystem = FileSystem.get(conf);
boolean b = fileSystem.exists(new Path("/hello"));
System.out.println(b);
boolean success = fileSystem.mkdirs(new Path("/mashibing"));
System.out.println(success);
success = fileSystem.delete(new Path("/mashibing"), true);
System.out.println(success);
FSDataOutputStream out = fileSystem.create(new Path("/test.data"), true);
FileInputStream fis = new FileInputStream("c:/test/core-site.xml");
IOUtils.copyBytes(fis, out, 4096, true);
FileStatus[] statuses = fileSystem.listStatus(new Path("/"));
//System.out.println(statuses.length);
for(FileStatus status : statuses) {
System.out.println(status.getPath());
System.out.println(status.getPermission());
System.out.println(status.getReplication());
}