##### 初始服务器数量
- 2台centos7
##### 建议配置
- 32G(RAM)
- 24cpu
- 10t(SATA)
### 1.环境
- 系统centos7
- jdk:1.8.0_171(64位)
- zookeeper:3.4.8
- spark-2.1.0-bin-hadoop2.6
- kafka_2.10-0.10.2.1
- hadoop-2.7.0
- hbase-1.2.6
- elasticsearch-6.3.0
### 2.系统准备
对应的安装包文件:
elasticsearch-6.3.0.tar.gz
hadoop-2.7.0.tar.gz
hbase-1.2.6-bin.tar.gz
jdk-8u171-linux-x64.tar.gz
kafka_2.10-0.10.2.1.tgz
mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar
spark2.1.0hadoop2.6.tgz.gz
zookeeper-3.4.8.tar.gz
一、 配置好hosts
```
两台设备的host
ip1 hello1
ip2 hello2
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
二、机器之间做好免密
1. 在hello1服务器中,cd /root/
2. ssh-keygen -trsa (全部按回车,走默认配置)
3. cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
4. chmod 600 ~/.ssh/authorized_keys
5. scp ~/.ssh/authorized_keys root@hello2:~/.ssh/
到此处时可以实现hello1机器上通过root账户登录到hello2中,但从hello2中无法通过免密码登录到hello1服务器。
6. 在hello2服务器中,cd /root/
7. ssh-keygen -trsa (全部按回车,走默认配置)
8. cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
9. scp ~/.ssh/authorized_keys root@hello1:~/.ssh/
到此处时可以实现hello1机器与hello2机器之间免密码互通
三、建立一个用户操作elasticsearch用户,后期所有安装软件放在该目录下(当前使用root账户安装)
1.添加用户:
useradd -m -s /bin/bash es
2.为该用户设置密码:
password es
四、安装JDK
如果系统自带openjdk,先将其卸载掉!
1.创建jdk安装路径(hello1、hello2都执行)
执行: mkdir /usr/java
2.解压缩jdk到安装目录
执行: tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/java/
3.添加环境变量
vi /etc/profile,添加以下语句
export JAVA_HOME=/usr/java/jdk1.8.0_171
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
执行:source /etc/profile
4.复制安装包和数据目录到hello2
scp -r /usr/java/jdk1.8.0_171 hello2:/usr/java/
scp /etc/profile hello2:/etc/
登录到hello2上,进入/home/es目录
执行: source /etc/profile
5、验证:
两台服务器上分别执行: java -version,查看输出的版本是否与安装的版本一致。
五、安装mysql
1.如果centos系统中自带mariadb,先卸载mariadb。
2.解压mysql安装包程序
执行:tar -xvf mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar
3.依次安装里面rpm包组建
rpm -ivh mysql-community-common-5.7.23-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.23-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.23-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.23-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.23-1.el7.x86_64.rpm
4.启动MySQL
执行: systemctl start mysqld
5.登录mysql服务器
这种方式安装好后,会再my.cnf文件中自动生成一个密码,
执行:cat /var/log/mysqld.log | grep password, 出现如下记录:
2017-09-15T01:58:11.863301Z 1 [Note] A temporary password is generated for root@localhost: m-NdrSG4ipuO
其中“m-NdrSG4ipuO”为mysql root账户的初始密码。
登录:
执行: mysql -uroot -p
输入密码: m-NdrSG4ipuO,即可进入mysql服务器。
后续可自行修改root密码,创建新账户等操作。
六、安装zookeeper
1.解压zookeeper安装包到指定目录(/home/es)
tar -zxvf zookeeper-3.4.8.tar.gz -C /home/es
2.创建程序软连接
cd /home/es/
ln -s zookeeper-3.4.8 zookeeper
3.添加执行路径环境
vi /etc/profile
添加
export ZOOKEEPER_HOME=/home/es/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
执行
source /etc/profile
4.修改配置文件
cd /home/es/zookeeper
cp conf/zoo_sample.cfg conf/zoo.cfg
在/home/data下创建对应的zookeeper数据存储目录
mkdir /home/data/zookeeper
mkdir /home/data/zookeeper/data
mkdir /home/data/zookeeper/log
修改配置文件:conf/zoo.cfg,添加以下语句
dataDir=/home/data/zookeeper/data
dataLogDir=/home/data/zookeeper/log
server.1=hello1:2888:3888
server.2=hello2:2888:3888
5.创建server表示符文件
touch /home/data/zookeeper/data/myid
echo echo 1>/home/data/zookeeper/data/myid
6.复制安装包和数据目录到hello2
scp -r /home/es/zookeeper-3.4.8 es@hello2:/home/es
scp -r /home/data/zookeeper es@hello2:/home/data
scp /etc/profile es@hello2:/etc
登录到hello2上
cd /home/es
ln -s zookeeper-3.4.8 zookeeper
echo echo 2>/home/data/zookeeper/data/myid
执行
source /etc/profile
7.两台机器上分别执行
zkServer.sh start
8.验证
jps | grep QuorumPeerMain,查看是否有该进程
zkServer.sh status,查看服务状态
六、安装kafka
1.解压kafka安装包到指定目录(/home/es)
tar -zxvf kafka_2.10-0.10.2.1.tgz -C /home/es
2.创建程序软连接
cd /home/es/
ln -s kafka_2.10-0.10.2.1 kafka
3.修改配置文件
备份:
cp config/server.properties config/server.properties.bak
创建kafka日志目录:
mkdir /home/data/kafka
mkdir /home/data/kafka/kafka-logs
修改:config/server.properties,具体对应字段如下:
broker.id=0
delete.topic.enable=true
num.network.threads=10
num.io.threads=32
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/home/data/kafka/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=hello1:2181,hello2:2181
zookeeper.connection.timeout.ms=6000
6.复制安装包和数据目录到hello2
scp -r /home/es/kafka_2.10-0.10.2.1 es@hello2:/home/es
scp -r /home/data/kafka es@hello2:/home/data
修改hello2中的配置
登录到hello2上,cd /home/es/kafka,修改config/server.properties中broker.id值为2.
7.启动kafka
在两台机器的/home/es/kafka中,创建一个日志存放目录:mkdir start_log,执行以下命令:
nohup bin/kafka-server-start.sh config/server.properties >start_log/kafka_start_log 2>&1 &
8.验证运行情况
jps | grep Kafka,查看进程
通过kafka命令查看topic。
七、安装hadoop
1.解压hadoop安装包到指定目录(/home/es)
tar -zxvf hadoop-2.7.0.tar.gz -C /home/es
2.创建程序软连接
cd /home/es/
ln -s hadoop-2.7.0 hadoop
3.创建数据存放目录
mkdir /home/data/hadoop
mkdir /home/data/hadoop/tmp
mkdir /home/data/hadoop/dfs
mkdir /home/data/hadoop/dfs/data
mkdir /home/data/hadoop/dfs/name
4.修改配置文件
修改/home/es/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hello1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/data/hadoop/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131702</value>
</property>
</configuration>
修改/home/es/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/data/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/data/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hello1:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
修改/home/es/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hello1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hello1:19888</value>
</property>
</configuration>
修改/home/es/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>hello1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hello1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hello1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hello1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hello1:8088</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>768</value>
</property>
</configuration>
配置/home/es/hadoop/etc/hadoop目录下hadoop-env.sh、yarn-env.sh的JAVA_HOME(不设置的话,启动不了)
export JAVA_HOME=/usr/java/jdk1.8.0_171
配置/home/es/hadoop/etc/hadoop目录下的slaves,删除默认的localhost,增加2个从节点,
hello1
hello2
5、将配置好的Hadoop复制到各个节点对应位置上,通过scp传送
scp -r /home/es/hadoop-2.7.0 hello2:/home/es/
scp -r /home/data/hadoop hello2:/home/data/
登录到hello2上,进入/home/es目录
执行: ln -s hadoop-2.7.0 hadoop
6、格式化nameNode及启动hadoop
在主服务器启动hadoop,从节点会自动启动,进入/home/es/hadoop目录
初始化,输入命令,bin/hdfs namenode -format
全部启动sbin/start-all.sh,也可以分开sbin/start-dfs.sh、sbin/start-yarn.sh
输入命令,jps,可以看到相关信息
7、验证hadoop运行情况
浏览器打开http://hello1:8088/
浏览器打开http://hello1:50070/
8、添加hadoop环境变量到/etc/profile
export HADOOP_HOME=/home/es/hadoop export PATH=$PATH:$HADOOP_HOME/sbin
export PATH=$PATH:$HADOOP_HOME/bin
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
执行: source /etc/profile
八、安装Hbase
1.解压hbase安装包到指定目录(/home/es)
tar -zxvf hbase-1.2.6-bin.tar.gz -C /home/es
2.创建程序软连接
cd /home/es/
ln -s hbase-1.2.6 hbase
3.添加hbase环境变量到/etc/profile
export HBASE_HOME=/home/es/hbase
export PATH=$HBASE_HOME/bin:$PATH
执行:source /etc/profile
4.修改HBASE配置文件
vi /home/es/hbase/conf/hbase-env.sh
增加: export JAVA_HOME=/usr/java/jdk1.8.0_171
修改: export HBASE_MANAGES_ZK=false
vi /home/es/hbase/conf/hbase-site.xml
修改类容:
<configuration>
<property>
<name>hbase.rootdir</name><!-- hbase存放数据目录 -->
<value>hdfs://hello1:9000/hbase/hbase_db</value>
<!-- 端口要和Hadoop的fs.defaultFS端口一致-->
</property>
<property>
<name>hbase.cluster.distributed</name><!-- 是否分布式部署 -->
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name><!-- list of zookooper -->
<value>hello1,hello2</value>
</property>
<property><!--zookooper配置、日志等的存储位置 -->
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/es/hbase/zookeeper</value>
</property>
</configuration>
配置regionservers,vi /home/es/hbase/conf/regionservers
去掉默认的localhost,加入hello1、hello2
5、将配置好的hbase复制到各个节点对应位置上,通过scp传送
scp -r /home/es/hbase-1.2.6 hello2:/home/es/
scp /etc/profile hello2:/etc/
登录到hello2上,进入/home/es目录
执行: ln -s hbase-1.2.6 hbase
source /etc/profile
6、hbase的启动
hello1中执行: start-hbase.sh
7、验证hbase运行情况
输入jps命令查看进程是否启动成功,若 hello1上出现HMaster、HRegionServer、HQuormPeer,hello2上出现HRegionServer、HQuorumPeer,就是启动成功了。
输入hbase shell 命令 进入hbase命令模式,输入status命令,查看运行状态。
在浏览器中输入http://hello1:16010就可以在界面上看到hbase的配置
注意事项:
正常安装后,创建普通不带压缩表可以正常读写,当使用snappy进行压缩创建表时,该表无法再regionServer中启动!
解决方法:
1.在hbase-site.xml文件中添加一下属性
<property>
<name>hbase.regionserver.codecs</name>
<value>snappy</value>
</property>
2.每台机器中将hadoop_native.zip解压缩到hbase安装目录的lib下,执行 unzip hadoop_native.zip $HBASE_HOME/lib/
3.在$HBASE_HOME/conf/hbase-env.sh 中添加:export HBASE_LIBRARY_PATH=/home/es/hbase/lib/native
4.重启Hbase服务即可
九、Spark安装
1.解压hbase安装包到指定目录(/home/es)
tar -zxvf spark2.1.0hadoop2.6.tgz.gz -C /home/es
2.创建程序软连接
cd /home/es/
ln -s spark2.1.0hadoop2.6 spark
3.修改配置文件
mv /home/es/spark/conf/spark-env.sh.template /home/es/spark/conf/spark-env.sh
vi /home/es/spark/conf/spark-env.sh
修改对应配置:
export JAVA_HOME=/usr/java/jdk1.8.0_171
export SPARK_MASTER_IP=hello1
export SPARK_MASTER_PORT=7077
export SPARK_LOCAL_IP=hello1
修改slaves文件
mv /home/es/spark/conf/slaves.template /home/es/spark/conf/slaves
vi /home/es/spark/conf/slaves
将localhost修改成:
hello1
hello2
5、将配置好的hbase复制到各个节点对应位置上,通过scp传送
scp -r /home/es/spark2.1.0hadoop2.6 hello2:/home/es/
登录到hello2上,进入/home/es目录
执行: ln -s spark2.1.0hadoop2.6 spark
在hello2中修改/home/es/spark/conf/spark-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_171
export SPARK_MASTER_IP=hello1
export SPARK_MASTER_PORT=7077
export SPARK_LOCAL_IP=hello2
6、启动spark
cd /home/es/spark
执行: sbin/start-all.sh
7、检测执行结果
jps | grep Worker,看是否有相应的进程。
十、安装elasticsearch
由于elasticsearch,用root账户无法启动,故该组件用es账户安装
1、切换到es账户: su es
2、解压hbase安装包到指定目录(/home/es)
tar -zxvf elasticsearch-6.3.0.tar.gz -C /home/es/
创建程序软连接
cd /home/es/
ln -s elasticsearch-6.3.0 elasticsearch
3、修改配置文件
vi /home/es/elasticsearch/config/elasticsearch.yml
# 集群的名字
cluster.name: crrc-health
# 节点名字
node.name: node-1
# 数据存储目录(多个路径用逗号分隔)
path.data: /home/data1/elasticsearch/data
# 日志目录
path.logs: /home/data1/elasticsearch/logs
#本机的ip地址
network.host: hello1
#设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点
discovery.zen.ping.unicast.hosts: ["hello1", "hello2"]
# 设置节点间交互的tcp端口(集群),(默认9300)
transport.tcp.port: 9300
# 监听端口(默认)
http.port: 9200
# 增加参数,使head插件可以访问es
http.cors.enabled: true
http.cors.allow-origin: "*"
4、创建elasticsearch数据和存储目录
mkdir /home/data1/elasticsearch
mkdir /home/data1/elasticsearch/data
mkdir /home/data1/elasticsearch/logs
5、修改linux系统的默认硬限制参数
切换至root用户: su root
vim /etc/security/limits.conf
添加:
es soft nofile 65536
es hard nofile 65536
退出es登录,重新用es账户登录,使用命令:ulimit -Hn查看硬限制参数。
vi /etc/sysctl.conf
添加:
vm.max_map_count=655360
执行:
sysctl -p
6、将配置好的elasticsearch复制到各个节点对应位置上,通过scp传送
scp -r /home/es/elasticsearch-6.3.0 hello2:/home/es/
scp -r /home/data1/elasticsearch hello2:/home/data1/
登录到hello2上,进入/home/es目录
执行: ln -s elasticsearch-6.3.0 elasticsearch-6.3.0
在hello2中修改/home/es/elasticsearch/config/elasticsearch.yml
修改: network.host: hello2
7、启动elasticsearch
使用es账户
执行:
/home/es/elasticsearch/bin/elasticsearch -d
8、验证
控制台中输入:curl http://hello1:9200
所谓的大数据平台不是独立存在的,比如百度是依赖搜索引擎获得大数据并开展业务的,阿里是通过电子商务交易获得大数据并开展业务的,腾讯是通过社交获得大数据并开始业务的,所以说大数据平台不是独立存在的,重点是如何搜集和沉淀数据,如何分析数据并挖掘数据的价值。我可能还不够资格回答这个问题,没有经历过一个公司大数据平台从无到有到复杂的过程。不过说说看法吧,也算是梳理一下想法找找喷。
这是个需求驱动的过程。
曾经听过spotify的分享,印象很深的是,他们分享说,他们的hadoop集群第一次故障是因为,机器放在靠窗的地方,太阳晒了当机了(笑)。从简单的没有机房放在自家窗前的集群到一直到现在复杂的数据平台,这是一个不断演进的过程。
对小公司来说,大概自己找一两台机器架个集群算算,也算是大数据平台了。在初创阶段,数据量会很小,不需要多大的规模。这时候组件选择也很随意,Hadoop一套,任务调度用脚本或者轻量的框架比如luigi之类的,数据分析可能hive还不如导入RMDB快。监控和部署也许都没时间整理,用脚本或者轻量的监控,大约是没有ganglia、nagios,puppet什么的。这个阶段也许算是技术积累,用传统手段还是真大数据平台都是两可的事情,但是为了今后的扩展性,这时候上Hadoop也许是不错的选择。
当进入高速发展期,也许扩容会跟不上计划,不少公司可能会迁移平台到云上,比如AWS阿里云什么的。小规模高速发展的平台,这种方式应该是经济实惠的,省了运维和管理的成本,扩容比较省心。要解决的是选择平台本身提供的服务,计算成本,打通数据出入的通道。整个数据平台本身如果走这条路,可能就已经基本成型了。走这条路的比较有名的应该是netflix。
也有一个阶段,你发现云服务的费用太高,虽然省了你很多事,但是花钱嗖嗖的。几个老板一合计,再玩下去下个月工资发布出来了。然后无奈之下公司开始往私有集群迁移。这时候你大概需要一群靠谱的运维,帮你监管机器,之前两三台机器登录上去看看状态换个磁盘什么的也许就不可能了,你面对的是成百上千台主机,有些关键服务必须保证稳定,有些是数据节点,磁盘三天两头损耗,网络可能被压得不堪重负。你需要一个靠谱的人设计网络布局,设计运维规范,架设监控,值班团队走起7*24小时随时准备出台。然后上面再有平台组真的大数据平台走起。
然后是选型,如果有技术实力,可以直接用社区的一整套,自己管起来,监控部署什么的自己走起。这个阶段部署监控和用户管理什么的都不可能像两三个节点那样人肉搞了,配置管理,部署管理都需要专门的平台和组件;定期Review用户的作业和使用情况,决定是否扩容,清理数据等等。否则等机器和业务进一步增加,团队可能会死的很惨,疲于奔命,每天事故不断,进入恶性循环。
当然有金钱实力的大户可以找Cloudera,Hortonworks,国内可以找华为星环,会省不少事,适合非互联网土豪。当然互联网公司也有用这些东西的,比如Ebay。
接下去你可能需要一些重量的组件帮你做一些事情。
比如你的数据接入,之前可能找个定时脚本或者爬log发包找个服务器接收写入HDFS,现在可能不行了,这些大概没有高性能,没有异常保障,你需要更强壮的解决方案,比如Flume之类的。
你的业务不断壮大,老板需要看的报表越来越多,需要训练的数据也需要清洗,你就需要任务调度,比如oozie或者azkaban之类的,这些系统帮你管理关键任务的调度和监控。
数据分析人员的数据大概可能渐渐从RDBMS搬迁到集群了,因为传统数据库已经完全hold不住了,但他们不会写代码,所以你上马了Hive。然后很多用户用了Hive觉得太慢,你就又上马交互分析系统,比如Presto,Impala或者SparkSQL。
你的数据科学家需要写ML代码,他们跟你说你需要Mahout或者Spark MLLib,于是你也部署了这些。
至此可能数据平台已经是工程师的日常工作场所了,大多数业务都会迁移过来。这时候你可能面临很多不同的问题。
比如各个业务线数据各种数据表多的一塌糊涂,不管是你还是写数据的人大概都不知道数据从哪儿来,接下去到哪儿去。你就自己搞了一套元数据管理的系统。
你分析性能,发现你们的数据都是上百Column,各种复杂的Query,裸存的Text格式即便压缩了也还是慢的要死,于是你主推用户都使用列存,Parquet,ORC之类的。
又或者你发现你们的ETL很长,中间生成好多临时数据,于是你下狠心把pipeline改写成Spark了。
再接下来也许你会想到花时间去维护一个门户,把这些零散的组件都整合到一起,提供统一的用户体验,比如一键就能把数据从数据库chua一下拉到HDFS导入Hive,也能一键就chua一下再搞回去;点几下就能设定一个定时任务,每天跑了给老板自动推送报表;或者点一下就能起一个Storm的topology;或者界面上写几个Query就能查询Hbase的数据。这时候你的数据平台算是成型了。
当然,磕磕碰碰免不了。每天你都有新的问题和挑战,否则你就要失业了不是?
你发现社区不断在解决你遇到过的问题,于是你们架构师每天分出很多时间去看社区的进展,有了什么新工具,有什么公司发布了什么项目解决了什么问题,兴许你就能用上。
上了这些乱七八糟的东西,你以为就安生了?Hadoop平台的一个大特点就是坑多。尤其是新做的功能新起的项目。对于平台组的人,老板如果知道这是天然坑多的平台,那他也许会很高兴,因为跟进社区,帮忙修bug,一起互动其实是很提升公司影响力的实情。当然如果老板不理解,你就自求多福吧,招几个老司机,出了问题能马上带路才是正道。当然团队的技术积累不能不跟上,因为数据平台还是乱世,三天不跟进你就不知道世界是什么样了。任何一个新技术,都是坑啊坑啊修啊修啊才完善的。如果是关键业务换技术,那需要小心再小心,技术主管也要有足够的积累,能够驾驭,知道收益和风险。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)