基础环境 & 软件包
- CentOS6.8 64bit
- Cloudera Manager5.7.0
- jdk1.7.0_75
- MySQL5.6
- cloudera-manager-el6-cm5.7.0
- CDH-5.7.0-1.cdh5.7.0.p0.45-el6.parcel
- CDH-5.7.0-1.cdh5.7.0.p0.45-el6.parcel.sha1
- manifest.json
- mysql-connector-java-5.1.38-bin.jar
系统环境设置
配置JDK
下载jdk,环境变量配置/etc/profile
,所有节点均需要配置。1
2
3
4
5
6JAVA_HOME=/usr/java/jdk1.7
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
配置hostname
/etc/sysconfig/network
1
2NETWORKING=yes
HOSTNAME=master-node/etc/hosts
所有节点的IP及hostname
ssh免密
主节点ssh免密登录所有节点1
2ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
ssh-copy-id all_nodes
关闭iptables/selinux
1 | $> /etc/init.d/iptables stop |
NTP配置
主节点
/etc/ntp.conf
1
2
3
4
5
6
7driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict -6 ::1
restrict default nomodify notrap
server pool.ntp.org prefer
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys启动NTP
1
2$> /etc/init.d/ntpd start
$> chkconfig ntpd on
从节点
/etc/ntp.conf
1
2
3
4
5
6
7
8
9driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict -6 ::1
restrict default kod nomodify notrap nopeer noquery
#restrict -6 default kod nomodify notrapnopeer noquery
server master-node perfer
server pool.ntp.org
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys启动NTP & 同步时间
1
2
3$> ntpdate -u master-node
$> /etc/init.d/ntpd start
$> chkconfig ntpd on
优化项
安装集群时会检测基础环境,需要对以下两项进行优化设置并添加到开机启动/etc/rc.local
1
2$> echo 1 > /proc/sys/vm/swappiness
$> echo never > /sys/kernel/mm/transparent_hugepage/defrag
主节点安装配置MySQL
MySQL只需要在主节点(cloudera-scm-server)上安装即可
安装MySQL
1 | $> wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm |
配置MySQL
/etc/my.cnf
由于要将数据全部都存放在大容量的/data分区下,所以需要对MySQL做些简单配置1
2
3
4
5
6
7
8
9[mysqld]
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server=utf8
log-error=/data/log/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysqld_safe]启动
1
2
3
4$> chkconfig mysqld on
$> mkdir -p /data/log/mysql
$> /etc/init.d/mysqld start
$> mysqladmin -u root password 'your_root_password'建表及授权
1
2
3
4
5
6$> mysql -uroot -p
mysql> create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql> create database amon DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql> create database oozie DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql> grant all privileges on *.* to 'root'@'master-node' identified by 'your_root_password' with grant option;
mysql> flush privileges;
安装Cloudera Manager Server
在主节点上安装Cloudera Manager Server
创建cloudera-scm用户
1
useradd --system --home=/opt/cm-5.7.0/run/cloudera-scm-server/ --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
安装配置Cloudera Manager Server
由于要将数据都放到/data分区,所以才需要创建软连接,否则不需要。1
2
3
4
5$> tar -zxf cloudera-manager-el6-cm5.7.0_x86_64.tar.gz
$> cp -a cm-5.7.0/ /data
$> cp -a cloudera /data
$> ln -s /data/cm-5.7.0 /opt/cm-5.7.0
$> ln -s /data/cloudera /opt/cloudera初始化Cloudera Manager Server数据库
1
2
3$> cp mysql-connector-java-5.1.38-bin.jar /opt/cm-5.7.0/share/cmf/lib/mysql-connector-java.jar
$> mkdir -p /usr/share/java/ && cp mysql-connector-java-5.1.38-bin.jar /usr/share/java/mysql-connector-java.jar
$> /opt/cm-5.7.0/share/cmf/schema/scm_prepare_database.sh mysql cm -hmaster-node -uroot -p --scm-host master-node scm scm scm离线Parcels
在集群安装过程中需要下载parcels,由于国内网络原因需要先离线下载文件,再将以下文件放到/opt/cloudera/parcel-repo/
- CDH-5.7.0-1.cdh5.7.0.p0.45-el6.parcel
- CDH-5.7.0-1.cdh5.7.0.p0.45-el6.parcel.sha1 (必须将下载的原文件
CDH-5.7.0-1.cdh5.7.0.p0.45-el6.parcel.sha1
重命名成CDH-5.7.0-1.cdh5.7.0.p0.45-el6.parcel.sha
,否则会重新下载) - manifest.json
启动Cloudera Manager Server
1
$> /opt/cm-5.7.0/etc/init.d/cloudera-scm-server start
安装Cloudera Manager Agent
Cloudera Manager Agent在所有节点都需要安装,包括主节点。
创建cloudera-scm用户
1
$> useradd --system --home=/opt/cm-5.7.0/run/cloudera-scm-server/ --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
配置cloudera-scm-agent
修改cm-5.7.0目录下文件cm-5.7.0/etc/cloudera-scm-agent/config.ini
,将server_host修改成cloudera manager server地址
可自定义log_file
路径1
2server_host=master-node
log_file=/data/cm-5.7.0/log/cloudera-scm-agent/cloudera-scm-agent.log同步cloudera-scm-agent
将修改好配置的cm-5.7.0
文件夹同步到剩余所有节点。
这里需要特别注意一点:绝对不能先启动cloudera-scm-agent再同步文件夹。因为cloudera-scm-agent
启动后会在/opt/cm-5.7.0/lib/cloudera-scm-agent/
目录下生成uuid
,如果启动agent后再同步文件夹则会使得集群所有agent的uuid
都相同,而uuid
是用来标识集群中的每个节点的,必须唯一。假若先启动后同步的话,想要修复问题则需要删除/opt/cm-5.7.0/lib/cloudera-scm-agent/
目录下所有文件,若问题仍旧没有修复则需要清空主节点Cloudera Manager的数据库。1
2
3$> scp -r /opt/cm-5.7.0 root@bj1-200-centos12:/data/
$> ln -s /data/cm-5.7.0 /opt/cm-5.7.0
$> ln -s /data/cloudera /opt/cloudera启动cloudera-scm-agent
cloudera-scm-agent有个bug,pid会放在/opt/cm-5.7.0/run/cloudera-scm-agent/
目录下,但这个目录不会自动创建,于是启动时会报错,故需要手动创建该目录。1
2$> mkdir -p /opt/cm-5.7.0/run/cloudera-scm-agent/
$> /opt/cm-5.7.0/etc/init.d/cloudera-scm-agent start
安装CDH5.7
当cloudera-scm-server
和cloudera-scm-agent
都成功启动后就可以通过Cloudera Manager的Web界面安装CDH5.7及相关服务。直接访问http://master-node:7180/cmf/login
,默认初始用户及密码是:admin/admin
。由于安装过程截图太多懒得一张张放上来了,只要安装提示一步步安装。
选择安装其他服务时,若服务需要连接MySQL则可能需要将JDBC驱动文件放到相应服务的目录下。比如安装Hive,如果日志中提示连接MySQL错误则JDBC驱动文件放到/opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/lib/hive/lib/
目录下。
如果安装Impala的话,需要在daemon节点安装perl:yum install -y perl
如果安装Hue的话,需要安装python-lxml
:yum install -y python-lxml
如果启动某些服务提示libxslt.so.1
错误,需要安装yum install -y libxml2 libxslt
在安装不同服务时可能会遇到各种各样的问题,需要到/var/log/<server_name>
下查看日志逐个排查。
Hadoop生态圈简介
围绕Hadoop有一系列的服务和组件简单记录一下它们的用途。我所使用的是Cloudera的CDH集群,基本都是Cloudera的生态,故Ambari涉及的都没怎么了解。
Hadoop
Hadoop是Apache开发的一套分布式软件框架,目前是2.x
版本,主要有以下三部分构成:- HDFS
HDFS(Hadoop分布式文件系统)是Hadoop的分布式存储系统,HDFS主要又由以下三个部分组成:- NameNode
管理文件系统的元数据(metadata),元数据(metadata)包括命名空间(namespace)、块信息等。 - Secondary NameNode
Secondary NameNode不是NameNode的备份。需要弄明白Secondary NameNode的作用先了解NameNode是如何保存元数据(metadata)的。
NameNode会维护fsimage和edits两个文件,fsimage是NameNode启动时对整个文件系统的快照,edits是NameNode启动后文件系统改动的记录(类似MySQL的binlog)。当NameNode重启时才将edits里的内容合并到fsimage中得到整个文件系统最新的快照。这样就会有个问题,当NameNode长时间没有重启时,edits文件会变得非常大,要将edits中的内容合并到fsimage将会耗费很多时间。于是有了Secondary NameNode来解决此类问题。
Secondary NameNode定期向NameNode获取edits文件的内容并更新到自己维护的fsimage中,合并完后再将最新的fsimage复制给NameNode。这样NameNode重启是用的fsimage就会是最新的。 - DataNode
存储数据
- NameNode
- MapReduce
分布式计算框架 - Yarn
新一代Hadoop引入的资源管理器,新一代的MapReduce(MRv2)。主要解决上一代Hadoop扩展性问题。
- HDFS
Spark
Spark是另一个分布式计算框架,基于内存计算所以能提供更快的数据处理速度,由Scala语言编写提供更通用的API。其实Spark与MapReduce对应,都是计算框架。此外还有Flink和流计算框架Storm等等。不同的计算框架各有优缺点,根据不同场景选择不同的计算框架。Hive
Hive是Hadoop的数据仓库系统。使用HQL(HiveQL,类似SQL)的查询语言,将SQL转化为MapReduce任务在Hadoop上执行。其实就是MapReduce程序写起来麻烦,于是为了简化和方便查询开发出能使用类似SQL进行查询的组件,这就是Hive。Pig
Pig是基于Hadoop的数据分析平台。如果说Hive是SQL在Hadoop上的实现,那么Pig就是脚本方式的实现。Pig定义一种数据流语言——Pig Latin,将脚本语言转化为MapReduce任务在Hadoop上执行。Hbase
分布式、可伸缩的面向列的数据库,支持随机、实时读写访问,来源与Google的BigTable。个人感觉如果应要和MySQL数据库对应的话,Hbase算是类似于NoSQL的KV数据库吧。Hbase提供Web UI:http://Hbase_master:60010
Phoenix
Phoenix简单说就是SQL On Hbase,使SQL查询转换成Hbase的查询。Impala
Impala是Cloudera公司开放,提供批量和实时查询的工具。Impala不需要使用到MapReduce计算模型,依赖Hive并可直接对HDFS和Hbase中的数据进行SQL(HiveSQL)查询,查询是速度是Hive的数倍。之所以会有Impala是因为Hive这种需要将SQL转成MapReduce的方式查询速度实在太慢,改用直接使用SQL(HiveSQL)在HDFS/Hbase中进行查询以提高速度。Oozie
Oozie是一个工作流调度管理工具,协调数据接收、存储、转换和分析等工作。当需要将多个MapReduce任务连接在一起完成整个工作时,就需要使用到Oozie来协调多个MapReduce任务。Hue
Hue是Cloudera开发的Web UI工具,用Pyhton的Django框架编写的。Hue UI
、Hue Server
和Hue DB
三部分组成,http://Hue_Server:8000
Solr
Solr是个企业级搜索引擎。Sqoop
Sqoop是数据迁移工具,全称是Sql-To-Hadoop,主要用于传统关系型数据库(MySQL/Oracle/Postgres)和Hadoop之间的数据转换。Mahout
Hadoop的机器学习库。