设置网卡:桥接网卡
桥接方式下,VMware模拟一个虚拟的网卡给客户系统,主系统对于客户系统来说相当于是一个桥接器。客户系统好像是有自己的网卡一样,自己直接连上网络,也就是说客户系统对于外部直接可见。
简单地说,虚拟主机和物理主机在同一个网段,就相当于局域网里多出来了一台电脑在上网,而这台电脑就是虚拟机里的系统。物理主机和虚拟主机的IP处于同一网段,DNS和网关是一样的,这样就实现了物理主机和虚拟主机,虚拟主机和外网的相互通信。
**在/etc/hosts文件中配置本地ip到host的映射`
192.168.1.110 sparkproject1
配置IP
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.110
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
TYPE:配置文件接口类型。在/etc/sysconfig/network-scripts/目录有多种网络配置文件,有Etherne 、IPsec等类型,网络接口类型为Ethernet。
DEVICE:网络接口名称
ONBOOT:系统启动时是否激活 。yes:系统启动时激活该网络接口 。no:系统启动时不激活该网络接口
BOOTPROTO:系统启动地址协议 。none:不使用启动地址协议;bootp:BOOTP协议;dhcp:DHCP动态地址协议;static:静态地址协议
IPADDR:IP地址
NETMASK:子网掩码
GATEWAY:网关地址
BROADCAST:广播地址
重启网卡以及关闭防火墙:
service network restart
service iptables stop
service ip6tables stop
service iptables status
service ip6tables status
chkconfig iptables off
chkconfig ip6tablesoff
vi /etc/selinux/config
SELINUX=disabled
配置DNS服务器、替换repo文件、配置yum
DNS服务器:域名系统/域名服务。域名系统为Internet上的主机分配域名地址和IP地址。用户使用域名地址,该系统会自动把域名地址转换为IP地址。域名服务是运行域名系统的Internet工具。执行域名服务的服务器称为DNS服务器。
文件/etc/resolv.conf配置DNS客户,它包含了主机的域名搜索顺序和DNS服务器的地址,每一行应包含一个关键字和一个或多个的由空格隔开的参数。
1、配置DNS服务器
vi /etc/resolv.conf
nameserver 61.139.2.69
nameserver 表明DNS服务器的IP地址。可以有很多行的nameserver,每一个带一个IP地址。在查询时就按nameserver在本文件中的顺序进行,且只有当第一个nameserver没有反应时才查询下面的nameserver。61.139.2.69是四川省成都市 电信IP地址, 就是DNS域名解析服务器的地址。
ping www.baidu.com 进行测试是否可以连接外网
2、修改repo文件
repo文件是Fedora中yum源(软件仓库)的配置文件,通常一个repo文件定义了一个或者多个软件仓库的细节内容,例如我们将从哪里下载需要安装或者升级的软件包,repo文件中的设置内容将被yum读取和应用!
YUM的工作原理并不复杂,每一个 RPM软件的头(header)里面都会纪录该软件的依赖关系,那么如果可以将该头的内容纪录下来并且进行分析,可以知道每个软件在安装之前需要额外安装 哪些基础软件。也就是说,在服务器上面先以分析工具将所有的RPM档案进行分析,然后将该分析纪录下来,只要在进行安装或升级时先查询该纪录的文件,就可 以知道所有相关联的软件。所以YUM的基本工作流程如下:
服务器端:在服务器上面存放了所有的RPM软件包,然后以相关的功能去分析每个RPM文件的依赖性关系,将这些数据记录成文件存放在服务器的某特定目录内。
客户端:如果需要安装某个软件时,先下载服务器上面记录的依赖性关系文件(可通过WWW或FTP方式),通过对服务器端下载的纪录数据进行分析,然后取得所有相关的软件,一次全部下载下来进行安装。
将CentOS6-Base-163.repo上传到CentOS中的/usr/local目录下
cd /etc/yum.repos.d/
rm -rf *
mv 自己的repo文件移动到/etc/yum.repos.d/目录中:cp /usr/local/CentOS6-Base-163.repo .
修改repo文件,把所有gpgcheck属性修改为0
gpgchkeck= 有1和0两个选择,分别代表是否是否进行gpg校验,如果没有这一项,默认是检查的。
3、配置yum
yum clean all
yum makecache
yum install telnet
1、将jdk-7u60-linux-i586.rpm上传到虚拟机中
2、安装JDK:rpm -ivh jdk-7u65-linux-i586.rpm
3、配置jdk相关的环境变量
vi ~/.bashrc
export JAVA_HOME=/usr/java/latest
export PATH= PATH: JAVA_HOME/bin
source ~/.bashrc
4、测试jdk安装是否成功:java -version
5、rm -f /etc/udev/rules.d/70-persistent-net.rules
1、安装上述步骤,再安装两台一模一样环境的虚拟机。
2、(另外两台机器的hostname分别设置为sparkproject2和sparkproject3即可)(省略)
3、在安装的时候,另外两台虚拟机的centos镜像文件必须重新拷贝一份,放在新的目录里,使用各自自己的镜像文件。
4、虚拟机的硬盘文件也必须重新选择一个新的目录,以更好的区分。
5、安装好之后,记得要在三台机器的/etc/hosts文件中,配置全三台机器的ip地址到hostname的映射,而不能只配置本机,这个很重要!
6、在windows的hosts文件中也要配置全三台机器的ip地址到hostname的映射
1、在三台机器的/etc/hosts文件中,都配置对三台机器的ip-hostname的映射
192.168.1.105 sparkproject1
192.168.1.106 sparkproject2
192.168.1.107 sparkproject3
2、首先在三台机器上配置对本机的ssh免密码登录
生成本机的公钥,过程中不断敲回车即可,ssh-keygen命令默认会将公钥放在/root/.ssh目录下
ssh-keygen -t rsa
将公钥复制为authorized_keys文件,此时使用ssh连接本机就不需要输入密码了
cd /root/.ssh
cp id_rsa.pub authorized_keys
3、接着配置三台机器互相之间的ssh免密码登录
使用
ssh-copy-id -i sparkproject2/3
命令将本机的公钥拷贝到指定机器的authorized_keys文件中(方便好用)
1、使用课程提供的hadoop-2.5.0-cdh5.3.6.tar.gz,上传到虚拟机的/usr/local目录下。
2、将hadoop包进行解压缩:
tar -zxvf hadoop-2.5.0-cdh5.3.6.tar.gz
3、对hadoop目录进行重命名:
mv hadoop-2.5.0-cdh5.3.6 hadoop
4、配置hadoop相关环境变量
vi ~/.bashrc
export HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source ~/.bashrc
5、创建/usr/local/data目录
配置hadoop
主要是配置core-site.xml,hdfs-site.xml,mapred-site.xml三个配置文件。core-site.xml是全局配置,hdfs-site.xml和mapred-site.xml分别是hdfs和mapred的局部配置。
1、修改core-site.xml:相当于配置hdfs的地址
<property>
<name>fs.default.namename>
<value>hdfs://sparkproject1:9000value>
property>
2、修改hdfs-site.xml:hdfs的属性
<property>
<name>dfs.name.dirname>
<value>/usr/local/data/namenodevalue>
property>
<property>
<name>dfs.data.dirname>
<value>/usr/local/data/datanodevalue>
property>
<property>
<name>dfs.tmp.dirname>
<value>/usr/local/data/tmpvalue>
property>
<property>
<name>dfs.replicationname>
<value>2value>
property>
3、修改mapred-site.xml :mapreduce相关配置:框架用yarn
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
4、配置yarn-site.xml:资源调度相关属性
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
5、配置slaves文件:
vi slaves
sparkproject2
sparkproject3
在另外两台机器上搭建hadoop
1、使用如上配置在另外两台机器上搭建hadoop,可以使用scp命令将sparkproject1上面的hadoop安装包和~/.bashrc配置文件都拷贝过去。
scp -r hadoop root@sparkproject2:/usr/local
2、要记得对.bashrc文件进行source,以让它生效。
3、记得在sparkproject2和sparkproject3的/usr/local目录下创建data目录。
启动hdfs集群
1、格式化namenode:在sparkproject1上执行以下命令:
hdfs namenode -format
2、启动hdfs集群:
start-dfs.sh
3、验证启动是否成功:jps、50070端口(主机端)
sparkproject1:namenode、secondarynamenode
sparkproject2:datanode
sparkproject3:datanode
4、测试文件
hdfs dfs -put hello.txt /hello.txt
启动yarn集群
1、在sparkproject1上启动yarn集群:
start-yarn.sh
2、验证启动是否成功:jps、8088端口
sparkproject1:resourcemanager、nodemanager
sparkproject2:nodemanager
sparkproject3:nodemanager
安装hive
tar -zxvf hive-0.13.1-cdh5.3.6.tar.gz
mv hive-0.13.1-cdh5.3.6 hive
vi ~/.bashrc
export HIVE_HOME=/usr/local/hive
export PATH=$HIVE_HOME/bin
source ~/.bashrc
安装mysql
yum install -y mysql-server
service mysqld start
chkconfig mysqld on
yum install -y mysql-connector-java
将mysql connector拷贝到hive的lib包中
cp /usr/share/java/mysql-connector-java-5.1.17.jar /usr/local/hive/lib
在mysql上创建hive元数据库,创建hive账号,并进行授权
create database if not exists hive_metadata;
grant all privileges on hive_metadata.* to 'hive'@'%' identified by 'hive';
grant all privileges on hive_metadata.* to 'hive'@'localhost' identified by 'hive’;
grant all privileges on hive_metadata.* to 'hive'@'spark1project' identified by 'hive’;
Delete FROM user Where User= ‘spark1 ‘and Host='localhost';
use hive_metadata;
配置hive-site.xml
mv hive-default.xml.template hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://sparkproject1:3306/hive_metadata?createDatabaseIfNotExist=truevalue>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>hivevalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>hivevalue>
property>
配置hive-env.sh和hive-config.sh
mv hive-env.sh.template hive-env.sh
vi /usr/local/hive/bin/hive-config.sh
export JAVA_HOME=/usr/java/latest
export HIVE_HOME=/usr/local/hive
export HADOOP_HOME=/usr/local/hadoop
验证hive是否安装成功
直接输入hive命令,可以进入hive命令行
create table users(id int, name string)
load data local inpath '/usr/local/users.txt' into table users
select name from users
Drop table users
我们知道要写一个分布式应用是非常困难的,主要原因就是局部故障。一个消息通过网络在两个节点之间传递时,网络如果发生故障,发送方并不知道接收方是否接收到了这个消息。他可能在网络故障迁就收到了此消息,也坑没有收到,又或者可能接收方的进程死了。发送方了解情况的唯一方法就是再次连接发送方,并向他进行询问。这就是局部故障:根本不知道操作是否失败。因此,大部分分布式应用需要一个主控、协调控制器来管理物理分布的子进程。目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制。协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器。协调服务非常容易出错,并很难从故障中恢复。例如:协调服务很容易处于竞态1甚至死锁2。Zookeeper的设计目的,是为了减轻分布式应用程序所承担的协调任务。
Zookeeper并不能阻止局部故障的发生,因为它们的本质是分布式系统。他当然也不会隐藏局部故障。ZooKeeper的目的就是提供一些工具集,用来建立安全处理局部故障的分布式应用。
ZooKeeper是一个分布式小文件系统,并且被设计为高可用性。通过选举算法和集群复制可以避免单点故障3,由于是文件系统,所以即使所有的ZooKeeper节点全部挂掉,数据也不会丢失,重启服务器之后,数据即可恢复。另外ZooKeeper的节点更新是原子的,也就是说更新不是成功就是失败。通过版本号,ZooKeeper实现了更新的乐观锁4,当版本号不相符时,则表示待更新的节点已经被其他客户端提前更新了,而当前的整个更新操作将全部失败。当然所有的一切ZooKeeper已经为开发者提供了保障,我们需要做的只是调用API。与此同时,随着分布式应用的的不断深入,需要对集群管理逐步透明化监控集群和作业状态,可以充分利ZK的独有特性
tar -zxvf zookeeper-3.4.5-cdh5.3.6.tar.gz。
mv zookeeper-3.4.5-cdh5.3.6 zk。
vi ~/.bashrc
export ZOOKEEPER_HOME=/usr/local/zk
export PATH=$ZOOKEEPER_HOME/bin
source ~/.bashrc
配置zoo.cfg
cd zk/conf
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改:dataDir=/usr/local/zk/data((存储数据的地址)
server.0=sparkproject1:2888:3888
server.1=sparkproject2:2888:3888
server.2=sparkproject3:2888:3888
(新增:server.X代表组成整个服务的机器,当服务启动时,会在数据目录下查找这个文件myid,这个文件中存有服务器的号码。 )
server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
设置zk节点标识
除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。
cd zk
mkdir data
cd data
vi myid
0
搭建zookeeper集群
1、在另外两个节点上按照上述步骤配置ZooKeeper,使用scp将zk和.bashrc拷贝到spark2和spark3上即可。
2、唯一的区别是spark2和spark3的标识号分别设置为1和2。
启动zookeeper集群
1、分别在三台机器上执行:zkServer.sh start。
2、检查ZooKeeper状态:zkServer.sh status,应该是一个leader,两个follower
3、jps:检查三个节点是否都有QuromPeerMain进程。
安装scala
tar -zxvf scala-2.11.4.tgz。
mv scala-2.11.4 scala
vi ~/.bashrc
export SCALA_HOME=/usr/local/scala
export PATH=$SCALA_HOME/bin
source ~/.bashrc
查看scala是否安装成功:
scala -version
按照上述步骤在sparkproject2和sparkproject3机器上都安装好scala。使用scp将scala和.bashrc拷贝到另外两台机器上即可。
安装kafka包
tar -zxvf kafka_2.9.2-0.8.1.tgz。
mv kafka_2.9.2-0.8.1 kafka
配置kafka
vi /usr/local/kafka/config/server.properties
broker.id:依次增长的整数,0、1、2,集群中Broker的唯一id
zookeeper.connect=192.168.1.105:2181,192.168.1.106:2181,192.168.1.107:2181
安装slf4j(Simple logging facade for Java 日志库)
unzip slf4j-1.7.6.zip 把slf4j中的slf4j-nop-1.7.6.jar复制到kafka的libs目录下面
搭建kafka集群
按照上述步骤在另外两台机器分别安装kafka。用scp把kafka拷贝到sparkproject2和sparkproject3即可。
唯一区别的,就是server.properties中的broker.id,要设置为1和2
启动kafka集群
1、解决kafka Unrecognized VM option ‘UseCompressedOops’问题
vi /usr/local/kafka/bin/kafka-run-class.sh
if [ -z "$KAFKA_JVM_PERFORMANCE_OPTS" ]; then
KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseCompressedOops -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -Djava.awt.headless=true"
fi
去掉-XX:+UseCompressedOops即可
2、在三台机器上的kafka目录下,分别执行以下命令:
nohup bin/kafka-server-start.sh config/server.properties & (后台执行)
3、使用jps检查启动是否成功
Flume是Cloudera提供的日志收集系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
Flume是一个分布式、可靠和高可用的海量日志采集、聚合和传输的系统。
tar -zxvf flume-ng-1.5.0-cdh5.3.6.tar.gz
mv apache-flume-1.5.0-cdh5.3.6-bin flume
vi ~/.bashrc
export FLUME_HOME=/usr/local/flume
export FLUME_CONF_DIR=$FLUME_HOME/conf
export PATH=$FLUME_HOME/bin
source ~/.bashrc
修改配置flume-ng配置文件
vi /usr/local/flume/conf/flume-conf.properties
#agent1表示代理名称
agent1.sources=source1
agent1.sinks=sink1
agent1.channels=channel1
#配置source1
agent1.sources.source1.type=spooldir
agent1.sources.source1.spoolDir=/usr/local/logs
agent1.sources.source1.channels=channel1
agent1.sources.source1.fileHeader = false
agent1.sources.source1.interceptors = i1
agent1.sources.source1.interceptors.i1.type = timestamp
#配置channel1
agent1.channels.channel1.type=file
agent1.channels.channel1.checkpointDir=/usr/local/logs_tmp_cp
agent1.channels.channel1.dataDirs=/usr/local/logs_tmp
#配置sink1
agent1.sinks.sink1.type=hdfs
agent1.sinks.sink1.hdfs.path=hdfs://sparkproject1:9000/logs
agent1.sinks.sink1.hdfs.fileType=DataStream
agent1.sinks.sink1.hdfs.writeFormat=TEXT
agent1.sinks.sink1.hdfs.rollInterval=1
agent1.sinks.sink1.channel=channel1
agent1.sinks.sink1.hdfs.filePrefix=%Y-%m-%d
创建需要的文件夹
本地文件夹:mkdir /usr/local/logs
HDFS文件夹:hdfs dfs -mkdir /logs
启动flume-agent
flume-ng agent -n agent1 -c conf -f /usr/local/flume/conf/flume-conf.properties -Dflume.root.logger=DEBUG,console
测试
新建一份文件,移动到/usr/local/logs目录下,flume就会自动上传到HDFS的/logs目录中
tar -zxvf spark-1.5.1-bin-hadoop2.4.tgz。
mv spark-1.5.1-bin-hadoop2.4 spark
vi ~/.bashrc
export SPARK_HOME=/usr/local/spark
export PATH=$SPARK_HOME/bin
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
source ~/.bashrc
修改spark-env.sh
cd /usr/local/spark/conf
cp spark-env.sh.template spark-env.sh
vi spark-env.sh
export JAVA_HOME=/usr/java/latest
export SCALA_HOME=/usr/local/scala
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
此时即可以用yarn提交任务了
mkdir spark_study
cd spark_study
vi spark_pi.sh
/usr/local/spark/bin/spark-submit \
--class org.apache.spark.example.JavaSparkPi \
--master yarn-client \
--num-executors 1 \
--driver-memory 1m \
--executor-memory 1 m \
--executor-cores 1 \
/usr/local/spark/lib/spark-examples-1.5.1-hadoop2.4.0.jar \
chmod 777 spark_pi.sh
./spark_pi.sh