写在前头
本文就是一些个人安装 Apache Hadoop集群(包括其一些生态组件)时的一些过程。
集群安装部署
Hadoop
-
确定集群数,最好为奇数台
-
修改hosts文件映射(最好保证机器的ip为静态ip)
-
上传Hadoop,jdk压缩包,并解压
-
配置环境变量
-
关闭防火墙
# 查看防火墙状态 chkconfig iptables --list # 永久关闭防火墙 chkconfig iptables off
-
安装ssh,并设置无秘登录
-
修改Hadoop的配置文件($HADOOP_HOME/etc/hadoop/)
-
修改Hadoop-env.sh文件
export JAVA_HOME=${JAVA_HOME} # 将文件中的此行换成下一行 export JAVA_HOME=/home/phoenix/apps/jdk
-
修改hdfs-site.xml文件
<property> <!--配置系统的数据自动备份的数量,默认三份--> <name>dfs.replication</name> <value>2</value> </property> <property> <!--设置namenode的ip及端口号,hadoop2.0之前默认9000.之后默认8020端口--> <name>dfs.namenode.rpc-address</name> <value></value> </property> <property> <!--设置namenode的文件目录,默认为${hadoop.tmp.dir}/dfs/name--> <name>dfs.namenode.name.dir</name> <value></value> </property> <property> <!--HDFS的datanode的文件存储目录,默认为${hadoop.tmp.dir}/dfs/data--> <name>dfs.datanode.data.dir</name> <value></value> </property> <property> <!--HDFS的权限,默认为true,即用户连接时需要检查其权限--> <name>dfs.permissions.enabled</name> <value>false</value> </property>
-
修改core-site.xml文件
<property> <!--设置hdfs所存放的文件目录。默认在/tmp/hadoop-${user.name}文件中--> <name>hadoop.tmp.dir</name> <value></value> </property>
-
将mapred-site.xml.template文件更名为mapred-site.xml,并修改配置
<property> <!--设置mr的执行框架,默认为local本地执行--> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
-
修改yarn-site.xml文件
<property> <name>yarn.nodemanager.aux-services</name> <value></value> <!--<value>mapreduce_shuffle</value>--> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property>
-
修改slaves文件
添加要作为从节点的主机名(要保证该主机名能够映射成ip地址)或者ip slave1 slave2 ...
-
-
为slave设置配置信息(此处为了简略,将主机的配置信息发送到从节点)
-
格式化集群
hdfs namenode -format
-
启动/停止集群
#开启集群 start-dfs.sh #开启yarn start-yarn.sh #关闭集群 stop-dfs.sh
HA与ZOOKEEPER
作为一个集群,当其namenode节点无效时是最为致命的,因而我们需要使其高可用。
-
上传zookeeper安装包,解压并配置环境变量
-
修改zookeeper配置${zookeeper_home}/conf下的文件
- 将zoo_example.cfg文件改为zoo.cfg
- 修改datadir属性,即zookeeper的数据文件所在的位置(如果你觉得有必要的话),默认为/tmp/zookeeper文件夹
- 添加集群信息 server.N=YYY:A:B,其中N代表服务器编号,即myid的值;YYY代表主机ip;A代表LF通信端口,一般使用2888;B代表选举端口,一般为3888。
- 在上面datadir属性指定的目录下创建名为 myid 的文件,其内容为所对应的myid的值。保证集群中每个节点的myid是不一致的。
-
修改配置文件
-
修改core-site.xml
<property> <name>ha.zookeeper.quorum</name> <description> A list of ZooKeeper server addresses, separated by commas, that are to be used by the ZKFailoverController in automatic failover. </description> <value>master:2181,slave1:2181,slave2:2181</value> </property>
-
修改hdfs-site.xml
<!--配置namenode节点,主备--> <property> <name>dfs.nameservices</name> <value></value> </property> <property> <!--EXAMPLENAMESERVICE为${dfs.nameservices}属性值,此项配置为指定主节点与主备节点--> <name>dfs.ha.namenodes.EXAMPLENAMESERVICE</name> <value></value> <description> The prefix for a given nameservice, contains a comma-separated list of namenodes for a given nameservice (eg EXAMPLENAMESERVICE). </description> </property> <property> <!--当集群为HA或者联邦集群时,我们必须指定多个主节点--> <name>dfs.namenode.rpc-address</name> <value></value> <description> RPC address that handles all clients requests. In the case of HA/Federation where multiple namenodes exist, the name service id is added to the name e.g. dfs.namenode.rpc-address.ns1 dfs.namenode.rpc-address.EXAMPLENAMESERVICE The value of this property will take the form of nn-host1:rpc-port. </description> </property> <!--设置共享日志--> <property> <!-- namenode间用于共享编辑 日志的journal节点列表 --> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;slave1:8485;slave2:8485/ns1</value> </property> <property> <!-- journalnode 上用于存放edits日志 的目录 --> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/phoenix/hadoop/tmp/data/dfs/jn</value> </property> <!--开启故障转移--> <property> <!-- 是否开启自动故障转移。建议开启,true --> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!--防止脑裂--> <property> <!-- HDFS的HA 功能的防脑裂方法。可以是内建的方法(例如shell和sshfence)或者用户定义的方法。 建议使用sshfence(hadoop:9922),括号内的是用户名和 端口,注意,这需要NN的2台机器之间能够免密码登陆 fences是防止脑裂的方法,保证NN中仅一个是Active的,如果2者都是Active的,新的会 把旧的强制Kill。 --> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <!-- 密钥认证文件--> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/phoenix/.ssh/id_rsa</value> </property>
-
-
开启zkServer
zkServer.sh start
-
开启journalNode
hadoop-daemon.sh start journalNode
-
格式化集群(只有当第一次格式化时采用):
hdfs namenode -format
-
将第一个结点的与第二个节点同步,有两种实现方法(建议使用第二种):
- 在第二个节点使用 hdfs namenode -bootstrapStandby
- 将第一个节点的namenode的文件远程拷贝到第二个节点的多对应位置
-
在namenode节点上格式化zkfc
hdfs zkfc -foormatZK
-
启动集群
# 启动hdfs start-dfs.sh # 启动yarn start-yarn.sh # hdfs和yarn 一起启动(不建议使用) start-all.sh
HBASE
-
解压缩hbase的压缩包,并配置相关环境变量
-
修改hbase-env.sh,增加java_home
-
修改 regionservers文件,添加regionserver的节点
-
配置备份主机:在conf文件中创建一个名为backup-master的文件,
-
修改 hbase-site.xml 文件
<property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.rootdir</name> <value>hdfs://ns1/hbase</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>master,slave1,slave2,slave3,slave4</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/phoenix/apps/zookeeper/tmp</value> </property>
-
将Hadoop的配置信息与hbase连接
- 将Hadoop_conf_dir添加到hbase的classpath环境变量中 hbase-env.sh
- 在conf下创建软连接,指向那些配置文件
- 如只要用到小部分的Hadoop的配置信息时,可直接将那些信息写入到hbase-site.xml文件中
-
开启hbase
- 首先开启zkServer
- 开启dfs
- 开启yarn
- 开启hbase
HIVE
-
解压hive的压缩包,并配置相关的环境变量
-
上传mysql的连接jar包至hive的lib目录中
-
安装mysql
-
修改配置文件
-
修改hive-env.sh
export HADOOP_HOME = /home/phoenix/apps/hadoop export HIVE_CONF_DIR = /home/phoenix/apps/hive/conf export HIVE_AUX_JARS_PATH = /home/phoenix/apps/hive/lib
-
修改hive-site.xml
<!--主要将其默认数据库改为mysql--> <property> <name>javax.jdo.option.Multithreaded</name> <value>true</value> <description>Set this to true if multiple threads access metastore through JDO concurrently.</description> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <!--<value>jdbc:derby:;databaseName=metastore_db;create=true</value>--> <value>JDBC:mysql://localhost:3306/hivedb?createDatabaseIfNotExist=true</value> <description> JDBC connect string for a JDBC metastore. To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL. For example, jdbc:postgresql://myhost/db?ssl=true for postgres database. </description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <!--<value>org.apache.derby.jdbc.EmbeddedDriver</value>--> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <!--<value>APP</value>--> <value>hive</value> <description>Username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <!--<value>mine</value>--> <value>hivepwd</value> <description>password to use against metastore database</description> </property>
-
修改core-site.xml
<property> <!--任意节点使用 hadoop 集群的代理用户 hadoop 都能访问 hdfs 集群--> <name>hadoop.proxyuser.hadoop.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hadoop.groups</name> <value>*</value> </property>
-
修改hdfs-site.xml
<property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property>
-
FLUME
暂放
KAFKA
暂放
SPARK
- 上传并解压Spark的二进制压缩包。
- 配置Spark的环境变量
- 修改$SPARK_HOME/conf/slaves文件,添加spark集群模式中的从节点的IP或者是主机名(需修改映射信息)
- 拷贝或者创建core-site.xml、hdfs-site.xml文件或者软链接至$SPARK_HOME/conf/下
- 修改$SPARK_HOME/conf/spark_env.sh,添加java、hadoop、scala等环境
Kylin
-
下载上传Kylin压缩包
-
解压
-
检查环境变量(Hadoop、Hive、HBase)
-
配置环境变量
-
修改时区
conf/kelin.properties
kylin.web.timezone=GTM+8
Kafka-eagel
Kafka的可视化工具
-
下载上传Kafka-eagle压缩包
-
解压压缩包(该压缩包中含有一个压缩包,也得压缩,建议将里面的那个压缩包拿出)
-
配置环境变量
KE_HOME=.... PATH=$PATH:$KE_HOME/bin
-
修改配置文件
system-config.properties
kafka.eagle.zk.cluster.alias=cluster1,cluster2 cluster1.zk.list=tdn1:2181,tdn2:2181,tdn3:2181 # 修改offset存储位置kafka1.5之前默认在zk中,之后在kafka的offset主题中 cluster1.kafka.eagle.offset.storage=kafka cluster2.kafka.eagle.offset.storage=zk # 修改db kafka.eagle.driver=org.sqlite.JDBC kafka.eagle.url=jdbc:sqlite:/hadoop/kafka-eagle/db/ke.db kafka.eagle.username=root kafka.eagle.password=smartloli
问题排查
-
ERROR namenode.NameNode: Failed to start namenode.
java.lang.IllegalArgumentException: Does not contain a valid host:port authority: master- dfs.namenode.rpc-address属性配置问题
-
格式化没有问题,开启集群的时候连接不上其他节点(连接超时)
- 防火墙未关闭,或关闭后未重启配置
- 配置错误
-
当启动zkServer时,显示连接8485端口错误
- journalnode的数据文件位置权限不足