例如已经配置好的node1
接下来以node1克隆出三台虚拟机并且配置好ip
1.克隆:
如图,此时创建了一台已经配置好ip的虚拟机。
ip地址为:192.168.60.101
名字为:node01
点击这个按钮进入下图的界面
(图片中已经出现了一个叫basic的快照,因为这个是我之前做的了)
大家直接点击克隆就Ok了
(顺便提一下,快照的作用就是可以让你的系统恢复到basic的状态,比如有时手贱删错东西就可以事先拍摄快照,然后出事就可以恢复了)
点击下一步
选择创建链接克隆
名称:node02
位置尽量和node01的位置放在一起吧
点击完成即可
以此类推,创建其余两台虚拟机;
以上就是克隆的过程
—————————————————————————————————————————————
node01的ip为192.168.60.101;(这只是我自己的举例子,你自己的和我不一样)
node02的ip为192.168.60.102;
node03的ip为192.168.60.103;
node04的ip为192.168.60.104;
配置过程如下:
1.打开虚拟机输入 用户名:root,密码:123456(在这里是我自己的账号密码配置,你就用自己的密码登录即可)
2.切换目录到:cd /etc/sysconfig/network-scripts/
3.编辑文件ifcfg-eth0: vi ifcfg-eth0
打开文件后,按a进入编辑模式,修改ipaddr:192.168.60.102
按esc退出编辑模式
再敲 :wq 表示保存并关闭文件
这就完成了修改ip地址
4.删除文件70-persistent-net.rules,切换目录到:cd /etc/udev/rules.d/
,
然后敲删除文件的命令:rm -f 70-persistent-net.rules
5.改名字:切换目录到:cd /etc/sysconfig/
打开文件:vi network
按a进入编辑模式
将node01 改成node02,按esc退出编辑模式,按 :wq,保存并关闭文件
6.重启虚拟机:init 6
7.ping百度网试试网络是否通畅:ping www.baidu.com
8.以此类推继续配置后面两台机器即可完成 克隆四台虚拟机。
下载jdk,注意:要下载linux版本的,我用的是jdk-7u86-linux-x64.rpm
将位于windows系统磁盘里的jdk安装包上传到虚拟机里
具体步骤:点击新建文件传输,输入账号密码,将安装包从左边拖入右边即可。
配置环境变量
vi /etc/profile
按a进入编辑模式,到最后一行,复制下面两行,粘贴
export JAVA_HOME=/usr/java/jdk1.7.0_67
export PATH=$PATH:$JAVA_HOME/bin
按esc,:wq保存并退出
source /etc/profile
jps
,显示进程即表示安装成功ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
此时输入命令 cd ~/.ssh/
查看此目录下生成了 authorized_keys文件
永久关闭防火墙:
1.service iptables stop
(即时关闭)
2.chkconfig iptables off
(永久关闭)
输入命令: ssh localhost
免密登入,成功登入后,按exit
退出;再输入 ssh node05
免密登入,若两次都成功登陆,即完成免密操作。
上传hadoop安装包到服务器。
先创建一个文件夹单独给hadoop
创建文件夹命令:mkdir -p /opt/sxt
解压hadoop到指定文件夹:tar xf hadoop-2.6.5.tar.gz -C /opt/sxt/
(-C表示解压到指定目录)
可以 cd
一下就看到已经解压到指定目录下了
配置hadoop的环境变量 vi /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_67
export HADOOP_HOME=/opt/sxt/hadoop-2.6.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
生效一下
source /etc/profile
5. 配置文件
配置jdk路径:hadoop-env.sh,mapred-env.sh 和 yarn-env.sh
hadoop-env.sh 必改
mapred-env.sh 和 yarn-env.sh 也改,虽然伪分布式安装不会用到,但是以后会用,所以一起改。
添加 jdk 的安装路径,以告诉hadoop去哪里调用jdk
输入命令 echo $JAVA_HOME
打印安装路径,复制,分别进入这三个文件修改即可
修改后如图:
*hadoop-env.sh
*mapred-env.sh
*yarn-env.sh
—————————————————————————————————————————————
1.配置规定namenode和临时性目录位置的文件:core-site.xml
<property>
<name>fs.defaultFS</name>//主节点的信息
<value>hdfs://node05:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>//临时文件夹位置
<value>/var/sxt/hadoop/pseudo</value>//namenode和DataNode的文件都会放在这
</property>
2.配置规定副本数量和SecondaryNode的文件:hdfs-site.xml
<property>
<name>dfs.replication</name>//副本数量
<value>1</value>//因为是伪分布式,就只有本机,一个就行了
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>//规定第二个主节点的服务器位置
<value>node05:50090</value>//还是本机,因为是伪分布式。
</property>
3.规定谁作为从节点的文件:slaves
localhost 改为 node05
//因为现在是伪分布式,所以主从节点都放在一起了。
—————————————————————————————————————————————
格式化:hdfs namenode -format
生成镜像文件,产生集群ID,(同一集群,同一ID)
成功生成文件到我们规定好的 /var/sxt/hadoop/pseudo/
中
启动集群,生成namenode,DataNode和secondaryNode文件;
jps看进程,发现启动了三个角色进程
浏览器可视化进入Hadoop管理集群
永久关闭防火墙chkconfig iptables off
重启
启动集群,start-dfs.sh
浏览器输入:node05:50070
—————————————————————————————————————————————
—————————————————————————————————————————————
vi /etc/hosts
添加下列ip192.168.60.101 node01
192.168.60.102 node02
192.168.60.103 node03
192.168.60.104 node04
192.168.60.105 node05
node01,node02,node03,node04
上进行免密操作ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
id_dsa_pub
和hosts
分发给node02,node03,node04
scp ~/.ssh/id_dsa.pub root@node02:~/
scp /etc/hosts root@node02:/etc/
scp ~/.ssh/id_dsa.pub root@node03:~/
scp /etc/hosts root@node03:/etc/
scp ~/.ssh/id_dsa.pub root@node04:~/
scp /etc/hosts root@node04:/etc/
注意:期间每次分发都要输入密码
cat ~/id_dsa.pub >> ~/.ssh/authorized_keys
—————————————————————————————————————————————
vi worker
———————————————————————————————————————————
分发Hadoop包到从节点
一个一个节点分发
scp -r /software/opt/sxt/hadoop-3.1.1 node03:/software/opt/sxt/
—————————————————————————————————————————————
Hadoop全分布式启动
—————————————————————————————————————————————
—————————————————————————————————————————————
就是给每个节点布置任务
zk:分布式协调,单独部署和搭建
zkfc:和namenode放在一起,物理进程,监控作用,启动配置即可,和zk关联
jnn:存储编辑日志信息,信息同步作用
—————————————————————————————————————————————
做个保险
复制一下hadoop3.1.1目录下的etc/的hadoop文件
cp -r hadoop hadoop-full
修改 hadoop.env.sh文件
vi hadoop.env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_51
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
#export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_ZKFC_USER=root //故障转移
export HDFS_JOURNALNODE_USER=root
修改 core-site.xml文件
vi core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:9820</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/sxt/hadoop/ha</value>//换一个路径名,改为ha,运行时产生ha文件夹
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
</configuration>
修改 hdfs-site.xml
vi hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>//副本数量
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>//逻辑服务名称,随便改
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>//逻辑名称映射到两个逻辑的node名:nn1,nn2
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>//nn1指代的物理机
<value>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>//nn2指代的物理机
<value>node02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node01:9870</value>//配置浏览器nn1时访问时的ip和端口
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node02:9870</value>//配置浏览器nn2时访问时的ip和端口
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>//规定journal集群位置
</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>//namenode切换状态时隔离方法的设置,保证任何时刻只有一个namenode处于活跃状态,防止脑裂,因此需要免密钥登录,使用私钥
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>//私钥位置
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>//journalnode日志目录存放位置
<value>/var/sxt/hadoop/ha/journalnode</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>//自动故障切换
<value>true</value>
</property>
</configuration>
再次修改core-site.xml文件
vi core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/sxt/hadoop/ha</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
</configuration>
—————————————————————————————————————————————
scp core-site.xml hdfs-site.xml hadoop-env.sh node02:`pwd`
scp core-site.xml hdfs-site.xml hadoop-env.sh node03:`pwd`
scp core-site.xml hdfs-site.xml hadoop-env.sh node04:`pwd`
安装到node02,node03,node04
先将安装包上传到node02,进行安装,安装到/software/opt/sxt/
目录下
配置环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_51
export HADOOP_HOME=/software/opt/sxt/hadoop-3.1.1
export ZOOKEEPER_HOME=/software/opt/sxt/zookeeper-3.4.6
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
分发到node03,04
scp /etc/profile node03:/etc/
scp /etc/profile node04:/etc/
改/software/opt/sxt/zookeeper-3.4.6/conf
目录下的zoo.sample.cfg
文件名 为 zoo.cfg
mv zoo_sample.cfg zoo.cfg
修改 zoo.cfg
文件
vi zoo.cfg
修改dataDir=/var/sxt/zk
添加:
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888
保存。
分发
scp -r zookeeper-3.4.6/ node03:`pwd`
scp -r zookeeper-3.4.6/ node04:`pwd`
创建目录并且添加文件
mkdir -p /var/sxt/zk //在02,03,04上都要创建
echo 1 > /var/sxt/zk/myid//node02对应 1 ,node03对应2
ZooKeeper配置完毕。
zkServer.sh start
在node02,03,04下发布命令。zkServer.sh status
,02,03为follower
,04为leader
表示运行正常zkServer.sh stop
zkCli.sh
hdfs namenode -initializeSharedEdits
即可。hdfs namenode -bootstrapStandby
/var/sxt/hadoop/
里面无ha
文件夹hdfs --daemon start journalnode
/var/sxt/hadoop/
里面出现了ha
文件夹,ha
里有journalnode
文件夹hdfs namenode -format
/var/sxt/hadoop/ha
下出现了dfs
文件夹,进入name,current ,cat Version
,查看集群id(clusterID),此时node02中无dfs文件,因此需要同步hadoop-daemon.sh start namenode
hdfs namenode -bootstrapStandby
,开始同步/var/sxt/hadoop/ha
下出现了dfs
文件夹,进入name,current ,cat Version
,查看集群id(clusterID),发现和node01的集群ID相同
。hdfs zkfc -formatZK
(前提已经启动了ZooKeeper)mycluster
start-dfs.sh
mycluster
文件夹生成了两个文件,用get获取节点信息hdfs --daemon stop namenode
,用浏览器打开集群的管理页面,发现node01将会变为待命状态,node02变为活跃态。eclipse
,我用的是eclipse mars2.0
hadoop-eclipse-plugin-2.6.0.jar
丢进ide
目录下plugins
文件夹内解压目录纯英文
windows版本的hadoop3.1.1的bin文件夹
,并替换
掉原来的linux版本的binHADOOP_HOME
,变量值:(hadoop3.1.1在window系统里的路径
);然后再新建,变量名:HADOOP_USER_NAME
,变量值:root
。然后往下翻双击Path
变量,在里边新建,内容为:%HADOOP_HOME%\bin
。hadoop3.1.1\share\hadoop
,将里面所有文件夹内的jar文件复制hadoop-lib
的文件夹,将刚刚复制的jar包放到这个文件夹内Window
,Preferences
,点击左边Hadoop Map/Reduce
,填写hadoop3.1.1在window下的路径。open Perspective
,找到map/reduce,双击,在下方Map/Reduce Location下鼠标右键,点击New Hadoop Location,不勾选Use M/R master host,host填:node01
(active),port填:8020
。Window
,Preferences
,左侧,Java
,Build Path
, User Libraries
,点击new
,写个名字(hadoop3.1.1)然后 点击Add External jars
(导入已存在的jar包),打开hadoop-lib文件,将里面的所有jar包导入即可。右键项目,New,Folder,文件夹名:conf
,我们有full集群和ha集群,为了方便运用两个集群在conf文件夹下新建一个名叫ha的子文件夹,conf右键New,Folder,文件名ha
,到linux上新建文件传输将hadoop/etc/下的core-site.xml和hdfs-site.xml传输到window系统里,再放到ha文件夹里。右键ha,点击Build Path,点击Use as Source Folder
即可。测试代码:
package first;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.shaded.org.apache.kerby.asn1.util.IOUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class test {
Configuration conf;
FileSystem fs;//文件系统类
@Before
public void conn() throws Exception{//连接
conf = new Configuration(true);//读配置文件,就是ha里面的xml文件
fs = FileSystem.get(conf);//用上了配置信息,客户端对象
}
@After
public void close() throws Exception{//关闭
fs.close();
}
@Test
public void mkdir() throws Exception{//创建文件夹
Path ifile = new Path("/ooxx");
if(fs.exists(ifile))
{
fs.delete(ifile,true);
}
fs.mkdirs(ifile);
}
@Test
public void upload() throws Exception{//上传文件
Path f = new Path("/001/hello.txt");
FSDataOutputStream output = fs.create(f);
InputStream input = new BufferedInputStream(new FileInputStream(new File("F:\\helloworld.txt")));
IOUtils.copyBytes(input, output, conf, true);
}
@Test
public void blks() throws Exception{//查看块信息
Path i = new Path("/user/root/weibo.csv");
FileStatus ifile = fs.getFileLinkStatus(i );
BlockLocation[] blks = fs.getFileBlockLocations(ifile, 0, ifile.getLen());
for(BlockLocation b : blks){
System.out.println(b);
}
FSDataInputStream in = fs.open(i);//读取文件
System.out.println((char)in.readByte());
System.out.println((char)in.readByte());
System.out.println((char)in.readByte());
System.out.println((char)in.readByte());
System.out.println((char)in.readByte());
System.out.println((char)in.readByte());
System.out.println((char)in.readByte());
System.out.println((char)in.readByte());
}
}
RS:ResourceManager(主,核心,集群节点资源管理)
NM:NodeManager(与RM汇报资源情况,管理Container)
mapred-site.xml
文件 <property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*
yarn-site.xml
文件<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<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>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
注意!!注意!!注意!!!!!!!
hadoop3.x版本
配置yarn-env.sh
export YARN_RESOURCEMANAGER_USER=root
export HADOOP_SECURE_DN_USER=yarn
export YARN_NODEMANAGER_USER=root
完事后分发一下
cd /software/opt/sxt/hadoop-3.1.1/etc/hadoop
scp mapred-site.xml yarn-site.xml yarn-env.sh node02:`pwd`
scp mapred-site.xml yarn-site.xml yarn-env.sh node03:`pwd`
scp mapred-site.xml yarn-site.xml yarn-env.sh node04:`pwd`
输入 start-all.sh
启动启动所以,包括dfs.sh
和yarn.sh
打开网址:http://node03:8088
打开网址:http://node04:8088
会自动跳转至http://node03:8088
因为node04处于standby状态
test.txt
(刚刚上面Hadoop API的代码可以实现)test.txt
文件上传到了/001/
里/data/wc/output
内hadoop jar hadoop-mapreduce-examples-3.1.1.jar wordcount /001/test.txt /data/wc/output
打开网址:http://node03:8088
点击Application
可以看进度
成功后:
网址显示:
安装命令:yum install -y mysql-server
启动服务:service mysqld start
配置启动:chkconfig mysqld on
启动:mysql
查看数据:show databases;
配置权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
PRIVILEGES
特权的意思,*.*
所有表的所有权限,'root'
用户名,'%'
所有的ip地址,IDENTIFIED BY '123'
密码是123
select user,host,password from user;
delete from user where host !='%';
flush privileges;
quit
mysql -uroot -p
,然后输入密码:123将mysql-connector-java-5.1.32-bin.jar
和apache-hive-1.2.1-bin.tar.gz
传输到node02上
解压 apache-hive-1.2.1-bin.tar.gz
到/root
下:tar -zxvf apache-hive-1.2.1-bin.tar.gz -C /root/
配置环境变量:vi /etc/profile
export HIVE_HOME=/root/apache-hive-1.2.1-bin
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$HIVE_GOME/bin
:wq
>> source /etc/profile
hive-default.xml.template
mv hive-default.xml.template hive-site.xml
vi hive-site.xml
.,-1d
,粘贴下面的配置信息
hive.metastore.warehouse.dir</name>
/user/hive_remote/warehouse</value>
</property>
hive.metastore.local</name>
false</value>
</property>
javax.jdo.option.ConnectionURL</name>
jdbc:mysql://node01/hive_remote?createDatabaseIfNotExist=true</value>
</property>
javax.jdo.option.ConnectionDriverName</name>
com.mysql.jdbc.Driver</value>
</property>
javax.jdo.option.ConnectionUserName</name>
root</value>
</property>
javax.jdo.option.ConnectionPassword</name>
123</value>
</property>
将mysql-connector-java-5.1.32-bin.jar拷贝到lib下:cp /root/mysql-connector-java-5.1.32-bin.jar /root/apache-hive-1.2.1-bin/lib/