1 总体说明
笔记本:i5第六代,16G内存,256G固态硬盘
使用VirtualBox 5.0.22建立3台虚拟机,实现完全分布式安装。
建立纯hadoop的集群环境,实现所有hadoop集群的各种基本功能,包括分布式存储(HDFS)和分布式计算(MR)。
2 主机规化
主机名 | IP | 用途 |
master | 192.168.56.105 | Namenode,jobtracker |
slave1 | 192.168.56.106 | Secondrynamenode,datanode,tasktracker |
slave2 | 192.168.56.107 | Datanode,tasktracker |
3 目录规化
组件 | 目录 | 说明 |
JDK | /usr/java/jdk1.8.0_92 | ln -s /usr/java/jdk1.8.0_92 /usr/java/default |
集群各组件安装根目录 | /hadoop | Hadoop,Hbase,Zookeeper等根目录 |
Hadoop | /hadoop/hadoop-2.6.4 | ln -s /hadoop/hadoop-2.6.4 /Hadoop/hadoop |
Hadoop各输出目录的根 | /var/hadoop | 建立name(namenode),data(datanoe),logs(运行日志) |
|
|
|
4 端口规化
端口 | 说明 |
9000 | fs.defaultFS,如:hdfs://master:9000 |
9000 | dfs.namenode.rpc-address,DataNode会连接这个端口。可以不设置 |
50070 | dfs.namenode.http-address |
50470 | dfs.namenode.https-address |
50100 | dfs.namenode.backup.address |
50105 | dfs.namenode.backup.http-address |
50090 | dfs.namenode.secondary.http-address,如:hdfs://slave1:50090 |
50091 | dfs.namenode.secondary.https-address,如:hdfs://slave1:50091 |
50020 | dfs.datanode.ipc.address |
50075 | dfs.datanode.http.address |
50475 | dfs.datanode.https.address |
50010 | dfs.datanode.address,DataNode的数据传输端口 |
8480 | dfs.journalnode.rpc-address |
8481 | dfs.journalnode.https-address |
8032 | yarn.resourcemanager.address |
8088 | yarn.resourcemanager.webapp.address,YARN的http端口 |
8090 | yarn.resourcemanager.webapp.https.address |
8030 | yarn.resourcemanager.scheduler.address |
8031 | yarn.resourcemanager.resource-tracker.address |
8033 | yarn.resourcemanager.admin.address |
8042 | yarn.nodemanager.webapp.address |
8040 | yarn.nodemanager.localizer.address |
8188 | yarn.timeline-service.webapp.address |
10020 | mapreduce.jobhistory.address |
19888 | mapreduce.jobhistory.webapp.address |
2888 | ZooKeeper,如果是Leader,用来监听Follower的连接 |
3888 | ZooKeeper,用于Leader选举 |
2181 | ZooKeeper,用来监听客户端的连接 |
60010 | hbase.master.info.port,HMaster的http端口 |
60000 | hbase.master.port,HMaster的RPC端口 |
60030 | hbase.regionserver.info.port,HRegionServer的http端口 |
60020 | hbase.regionserver.port,HRegionServer的RPC端口 |
8080 | hbase.rest.port,HBaseRESTserver的端口 |
10000 | hive.server2.thrift.port |
9083 | hive.metastore.uris |
5 操作系统配置
5.1 OS安装
l 使用CentOS mini版
l 磁盘划分:
/boot 500MB ext4 boot partition # 迫使主分区
swap 2GB swap # 与物理内存一样大
/ 剩余空间 ext4 # 迫使主分区
/data1 sda所有空间 ext4
/data2 sdb所有空间 ext4
l 安装软件:sysstat , httpd, tftp-server, ntp
启动sysstat :/etc/init.d/sysstat start
设置sysstat自启动:checkfig sysstat on
l 安装pssh:
wget https://pypi.python.org/packages/source/p/pssh/pssh-2.3.1.tar.gz
tar zxf pssh-2.3.1.tar.gz
cd pssh-2.3.1
python setup.py install
pssh 多主机并行运行命令
pscp 传输文件到多个hosts,他的特性和scp差不多
pslurp 从多台远程机器拷贝文件
pnuke kill远程机器的进程
pslurp 从远程主机考本文件到本地
prsync 使用rsync协议从本地计算机同步到远程主机
5.2 配置SSH免密登陆
原理:就是我把我的公钥放到你的authorized_keys里面,然后我就可以ssh无密码登录你了
5.2.1 配置规则
u NameNode 能免密码登录所有的 DataNode
u SecondaryNameNode 能免密码登录所有的 DataNode
u NameNode 能免密码登录自己
u SecondaryNameNode 能免密码登录自己
u NameNode 能免密码登录 SecondaryNameNode
u SecondaryNameNode 能免密码登录 NameNode
u DataNode 能免密码登录自己
u DataNode 不需要配置免密码登录 NameNode、SecondaryNameNode和其它 DataNode。
5.2.2 配置步骤
l 在master(NameNode)上执行:
cd ~
ssh-keygen -t rsa # 一路回车。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh localhost # 验证本机无密码登陆
ssh master # 验证本机无密码登陆
for ip in `seq 1 2`; do scp ~/.ssh/authorized_keys root@slave$ip:~/keys.master;done
l 在slave1(SecondaryNameNode, DataNode)上执行:
cd ~
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh localhost # 验证本机无密码登陆
ssh slave1 # 验证本机无密码登陆
cat ~/keys.master >> ~/.ssh/authorized_keys # 实现master免密码登陆slave1
scp ~/.ssh/id_rsa.pub root@slave2:~/keys.slave1
scp ~/.ssh/id_rsa.pub root@master:~/keys.slave1
到master主机上执行:cat ~/keys.slave1 >> ~/.ssh/authorized_keys
l 在slave2(DataNode)上执行:
cd ~
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh localhost # 验证本机无密码登陆
ssh slave2 # 验证本机无密码登陆
cat ~/keys.master >> ~/.ssh/authorized_keys
cat ~/keys.slave1 >> ~/.ssh/authorized_keys
l 免密码登陆验证
master(NN)登录所有节点
slave1(SNN)登录所有的 DataNode(slave2)
slave1(SNN)登录NameNode(master)
5.3 系统配置
每台主机执行以下操作:
1. 修改hosts,增加各个主机
echo "# cluster hosts" >> /etc/hosts
echo "192.168.56.105 master" >>/etc/hosts
echo "192.168.56.106 slave1" >>/etc/hosts
echo "192.168.56.107 slave2" >>/etc/hosts
cat /etc/hosts
for ip in `seq 1 2`; do scp /etc/hostsroot@slave$ip:/etc; done
2. 定义其他节点主机列表文件
cd ~
vi hdp-other-hosts
slave1
slave2
该文件是为了使用pssh进行批量操作用。文件内容为每行一个主机名字。
之后,可使用类似如下命令从master主机上批量在其他主机上执行命令:
例如:pssh -h hdp-other-hosts "mkdir -p /hadoop /test"
3. 修改OS参数,如关闭防火墙,增加打开文件数等
l 修改主机名
cat /etc/sysconfig/network #看看主机名字是否正确,不对则修改
service network restart
l # 关闭iptables.
service iptables stop
service iptables status
chkconfig iptables off
chkconfig --list | grep iptables
pssh -h hdp-other-hosts "service iptables stop;chkconfig iptables off"
# 两个命令中间用分号;以实现连续执行,即使有错也会继续。
# 如果每个命令被 && 号分隔,那么这些命令会一直执行下去,如果中间有错误的命令存在,则不再执行后面的命令。
l # 关闭selinux.
vi /etc/selinux/config
SELINUX=disabled
l # 关闭透明大页
vi /etc/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled;then
echo never> /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag;then
echo never> /sys/kernel/mm/transparent_hugepage/defrag
fi
l # 让机器尽量使用物理内存。如果设置成0,则意味着只使用物理内存。
echo "vm.swappiness=10" >>/etc/sysctl.conf
l # 最大打开文件数据和最大进程数 limits.conf 每台机器都修改
vi /etc/security/limits.conf # 添加下面的内容
* - nofile 65535
* - nproc 65535
l # 禁用IPV6
l 屏蔽文件访问时间,优化/etc/fstab参数
l 每台机器重启:reboot
l 检查修改效果:
/usr/sbin/sestatus -v # 如果SELinux status参数为enabled即为开启状态
或者使用:getenforce,也可检查SELinux的状态
# 如果输出结果为[always]表示透明大页启用了。[never]表示禁用、[madvise]表示
cat /sys/kernel/mm/transparent_hugepage/enabled, defrag
cat /proc/sys/vm/swappiness #应该是10
ulimit -a #应该是65535
lsmod | grep -i ipv6 # for check ipv6 off
ifconfig | grep -i inet6 # for check ipv6 off
如果上述2个命令执行的结果没有任何显示,那么说明ipv6已经被完全禁止了。
5.4 建立本地YUM仓库
5.5 NTP配置
l NTP服务器(master)配置
vi /etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 10
restrict 192.168.56.0 255.255.255.0 nomodifynotrap
chkconfig ntpd on
service ntpd start
ntpstat # show : synchronised to local net at stratum 11
l 其他主机配置
vi /etc/ntp.conf
server master
service ntpd start
chkconfig ntpd on
crontab -e
*/10 * * * * /usr/sbin/ntpdate -u master&>/var/log/ntpdate-cron.log
# 每10分钟同步一次,'&'开始是为了调试用
10分钟后,各主机上执行:ntpstat,看是否同步了
如果机器重启了,slave上执行ntpstat,显示未同步,运行一次:service ntpd restart,再执行ntpstat,就显示同步了。不知道这个怎么搞好
6 JAVA安装
l 在master上安装JAVA
rpm -ivh jdk8.rpm
echo "export JAVA_HOME=/usr/java/default">> /etc/profile
echo "exportCLASSPATH=.:$JAVA_HOME/lib/tools.jar" >> /etc/profile
echo "export PATH=$JAVA_HOME/bin:$PATH">> /etc/profile
source /etc/profile
gtar cf java.gz /usr/java/
for ip in `seq 1 2`; do scp java.gz root@slave$ip:/usr;done
for ip in `seq 1 2`; do scp /etc/profileroot@slave$ip:/etc; done
rm java.gz
java -version # 检验
l 在其他各主机上安装JAVA
cd /usr
gtar xf java.gz
rm java.gz
java -version # 检验
7 Hadoop安装
7.1 软件安装
mkdir -p /hadoop
gtar xvfhadoop-2.6.4.tar.gz
mv hadoop-2.6.4/hadoop
ln -s/hadoop/hadoop-2.6.4 /hadoop/hadoop
# 解决:util.NativeCodeLoader: Unable toload native-hadoop library for your platform
tar -xvfhadoop-native-64-2.6.0.tar -C /hadoop/hadoop/lib/native
vi ~/.bash_profile
exportHADOOP_HOME=/hadoop/hadoop
exportHADOOP_PREFIX=$HADOOP_HOME
exportHADOOP_MAPRED_HOME=${HADOOP_PREFIX}
exportHADOOP_COMMON_HOME=${HADOOP_PREFIX}
exportHADOOP_HDFS_HOME=${HADOOP_PREFIX}
exportYARN_HOME=${HADOOP_PREFIX}
# Native Path
exportHADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native
exportHADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib/native"
exportPATH=$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin:$JAVA_HOME/bin:$PATH
source~/.bash_profile
# 检查hadoop安装是否成功
hadoop version
hadoop checknative-a
for ip in `seq 1 2`;do scp ~/.bash_profile root@slave$ip:~; done
7.2 配置文件修改
l 使用 master 中的配置文件更新到各主机上
for ip in `seq 1 2`; do scp /hadoop/hadoop/etc/hadoop/*.xml root@slave$ip:/hadoop/hadoop/etc/hadoop/; done |
7.2.1 配置 hadoop-env.sh
# 明确指定JAVA_HOME
export JAVA_HOME=/usr/java/default
# 明确指定log的存放目录,默认位置是安装目录下的logs文件夹
export HADOOP_LOG_DIR=/var/hadoop/logs
7.2.2 配置 yarn-env.sh
# 明确指定JAVA_HOME
export JAVA_HOME=/usr/java/default
7.2.3 配置 slaves
修改NameNode和SecondaryNameNode上的slaves文件。
把每个slave主机名写进去,每行一个
7.2.4 配置 core-site.xml
属性 | 值 | 涉及范围 |
fs.defaultFS | hdfs://master:9000 | 所有节点 |
hadoop.tmp.dir | /var/hadoop/tmp | 所有节点 |
Ø fs.defaultFS
对于一个新集群来说,唯一必须修改的项是:fs.defaultFS,该项指明了文件系统的访问入口。目的是告知所有的datanode它们的namenode是哪一个从而建立起namenode与各datanode之间的通信
Ø hadoop.tmp.dir
默认是在${hadoop.tmp.dir}
mkdir -p /var/hadoop/tmp
pssh -h ~/hdp-other-hosts "mkdir -p /var/hadoop/tmp"
7.2.5 配置 hdfs-site.xml
属性 | 值 | 涉及范围 |
dfs.namenode.rpc-address | master:9000 | 所有节点 |
dfs.namenode.secondary.http-address | slave1:50090 | NameNode SecondaryNameNode |
dfs.namenode.name.dir | /var/hadoop/name | NameNode SecondaryNameNode |
dfs.datanode.data.dir | /var/hadoop/data | 所有DataNode |
dfs.replication | 2 |
|
dfs.blocksize | 67108864 |
|
mkdir -p /var/hadoop/name /var/hadoop/data
pssh -h ~/hdp-other-hosts "mkdir -p /var/hadoop/name/var/hadoop/data"
各属性说明:
ü dfs.namenode.rpc-address// 如果不配置,执行hdfs dfs -ls等任何命令,好像会报 “failed on connection exception”ConnectException Connection refused
ü dfs.namenode.secondary.http-address //指定secondary namenode结点,若不指定,在使用start-dfs.sh启动时,当前节点将自动成为secondary namenode
ü dfs.replication //每一个block的复制份数,默认是3,如果集群datanode结点数量小于3应将该值设置小于或等于datanode的结点数量
ü dfs.blocksize //默认是268435456(256M)
ü dfs.namenode.handler.count // 默认是100:MoreNameNode server threads to handle RPCs from large number of DataNodes.
ü dfs.namenode.name.dir // NameNode 元数据存储目录,可多个,逗号分隔
ü dfs.datanode.data.dir // DataNode 元数据存储目录,可多个,逗号分隔
ü dfs.namenode.checkpoint.dir //存放secondary namenode相关数据的文件夹
对于后三项来说,它们的默认值也都是在${hadoop.tmp.dir}之下的子文件夹,可以根据集群的实际情况修改这三个值。比如:把它们改到一个挂载到NFS上的文件夹。
7.2.6 配置 mapred-site.xml
属性 | 值 | 涉及范围 |
mapreduce.framework.name | yarn | 所有节点 |
mapreduce.jobhistory.address | master:10020 |
|
mapreduce.jobhistory.webapp.address | master:19888 |
|
唯一一个必须要修改的项是mapreduce.framework.name,该项告诉hadoop使用何种框架执行map-reduce任务
7.2.7 配置 yarn-site.xml
属性 | 值 | 涉及范围 |
yarn.nodemanager.aux-services | mapreduce_shuffle | 所有的 NodeManager |
services.mapreduce_shuffle.class | org.apache.hadoop.mapred .ShuffleHandler |
|
yarn.resourcemanager.address | master:8032 |
|
yarn.resourcemanager .scheduler.address | master:8030 |
|
yarn.resourcemanager. resource-tracker.address | master:8031 |
|
yarn.resourcemanager.admin.address | master:8033 |
|
yarn.resourcemanager.webapp.address | master:8088 |
|
yarn.resourcemanager.hostname | master | ResourceManager NodeManager |
yarn.nodemanager.hostname | 0.0.0.0(可不配置) | 所有的 NodeManager |
yarn.nodemanager.resource.memory-mb | 不设置(默认:8192) |
|
yarn.nodemanager.local-dirs | 中间结果存放位置。 应配置多个目录以分摊磁盘IO负载。 默认: ${hadoop.tmp.dir}/nm-local-dir |
|
yarn.nodemanager.log-dirs | 日志存放地址。配多目录分摊磁盘IO 默认: ${yarn.log.dir}/userlogs |
|
yarn.scheduler.minimum-allocation-mb | 不设置(默认:1024) |
|
yarn.scheduler.maximum-allocation-mb | 不设置(默认:8192) |
|
注意:对于resourcemanager,可以只设置一个属性:yarn.resourcemanager.hostname。它将代替所有resourcemanager* address的设置,并使用各个默认的端口提供服务
7.2.8 配置各节点
gtar cf hadoop.gz /hadoop/hadoop /hadoop/hadoop-2.6.4
for ip in `seq 1 2`; do scp /hadoop/hadoop.gzroot@slave$ip:/hadoop; done
pssh -h ~/hdp-other-hosts "cd /hadoop; gtar xfhadoop.gz"
pssh -h ~/hdp-other-hosts "rm -f /hadoop/hadoop.gz"
7.2.9 启动
l 格式化namenode
hdfs namenode -format
如果完成有,输出包含“INFO util.ExitUtil: Exiting with status 0” ,则表示格式化成功。
l 启动hadoop
start-dfs.sh
# 该命令可以任意结点上执行。如果配置文件中没有指明secondary namenode(即在hdfs-site.xml中没有配置dfs.namenode.secondary.http-address),那么在哪个结点上执行该命令,该点将自动成为secondary namenode.
# 以下单独启动某项服务的命令:
hadoop-daemon.sh start namenode # 在namenode主机上执行
hadoop-daemon.sh start secondarynamenode # 在secondarynamenode主机上执行
hadoop-daemon.sh start datanode # 在每个datanode主机上分别执行
l 启动yarn
start-yarn.sh
l 启动history server
mr-jobhistory-daemon.sh start historyserver
如果不启动,mapreduce运行成功后报拒绝链接错误
7.3 可用性校验
7.3.1 各种基本验证
l 在各个主机上执行jps,应该分别看到:
ü Master:
1936 NameNode
2174 Jps
6634 ResourceManager (执行start-yarn.sh后出现)
ü Slave1:
1874 Jps
1813 SecondaryNameNode
1738 DataNode
2954 NodeManager (执行start-yarn.sh后出现)
ü Slave2:
1845 Jps
1765 DataNode
6954 NodeManager (执行start-yarn.sh后出现)
l 访问:http://master:50070
# 检查HDFS各结点情况,如都能访问表示HDFS已无问题,如无法访问或缺少节点,可分析log的中的信息找出问题原因。
l 执行hadoop命令
hdfs dfs -put /hadoop/hadoop/LICENSE.txthdfs://master:9000/ # 上传文件
hdfs dfs -ls hdfs://master:9000/ # 浏览目录
# 9000 后面的斜杠/是和必须的,否则被当作文件。
# 由此看出“hdfs dfs -ls”可以操作不同的 HDFS 集群,只需要指定不同的 URI。
# 文件上传后, 被存储在 DataNode 的 data 目录下
文件上传后被存到DataNode的上,位置是:
/var/hadoop/dfs/data/current/BP-1980762416-192.168.56.105-1465484331968/current/finalized/subdir0/subdir0/
l 执行yarn命令
yarn node -list #列举 YARN 集群中的所有 NodeManager
Total Nodes:2 Node-Id Node-State Node-Http-Address Number-of-Running-Containers slave1:48021 RUNNING slave1:8042 0 slave2:33378 RUNNING slave2:8042 0 |
yarn node -status slave1:48021 # 查看指定 NodeManager 的状态
l 运行MapReduce程序
在安装目录的 share/hadoop/mapreduce 子目录下,有现存的示例程序。
运行wordcount示例程序试试:
hdfs dfs -mkdir -p hdfs://master:9000/app/wordcount/in hdfs dfs -put /hadoop/hadoop/LICENSE.txt hdfs://master:9000/app/wordcount/in hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar wordcount /app/wordcount/in /app/wordcount/out hdfs dfs -text hdfs://master:9000/app/wordcount/out/part-r-00000 # 看结果 |
wordcount 运行完成后,结果会保存在 out 目录下,保存结果的文件名类似于“part-r-00000” 。另外,跑这个示例程序有两个需求注意的点:
1) in 目录下要有文本文件,或 in 即为被统计的文本文件,可以为 HDFS 上的文件或目录,
也可以为本地文件或目录
2) out 目录不能存在,程序会自动去创建它,如果已经存在则会报错。
包hadoop-mapreduce-examples-2.4.0.jar 中含有多个示例程序,不带参数运行,即可看
到用法。
http://master:8088/ # 观察MR运行状况
mapred job -kill jobid # 杀掉一个作业
【坑1】
按照网上的文章,在hdfs-site.xml中设置了:
<property> <name>dfs.namenode.rpc-address</name> <value>master:9001</value> </property> |
结果总是报Connection refused。而且发现9000端口没有被监听。
后来,据说要把这个端口设置成和dfs.defaultFS的端口一样,试了一下,果然。
之后,把这个属性去掉了,集群也可以正常启动。
不知道是为什么。
【坑2】
考虑到用的是虚拟机,于是就把yarn-site.xml中的几个内存参数调低了:
<property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>64</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>512</value> </property> |
wordcount启动后,程序停在“mapreduce.Job: Running job: job_1465649032027_0001”这里就不继续了,网上说的修改主机名等各种办法都试了一遍,没用。最后,去掉这两个参数,瞬间跑通了。
7.3.2 查看集群各种信息
ü 集群总体状况:http://master:50070/
ü ResourceManager运行在主节点master上
查看状态: http://master:8088/
8088这个端口是yarn-site.xml中的属性:yarn.resourcemanager.webapp.address
ü NodeManager运行在从节点上,可以通过Web控制台查看对应节点的资源状态。
例如节点slave1:http://slave1:8042/
ü JobHistory Server:http://master:19888/
ü hdfs dfs -df -h # 查看还剩多少hdfs空间。-h自动决定以K或M或G来显示大小
7.4 性能校验
考虑使用dfsio等手段做测试,不过,对于虚拟机,就算了。
8 Hive安装
在master主机上安装Hive。
8.1 安装mysql
1. 卸载系统自带的mysql
rpm -qa|grepMySQL(或者是rpm-qa|grep mysql)
rpm -e --nodepsmysql-libs-5.1.73-7.el6.x86_64
2. 下载:http://dev.mysql.com/downloads/mysql/5.5.html#downloads
mysql-client-5.5.50-1.linux2.6.x86_64.rpm
mysql-devel-5.5.50-1.linux2.6.x86_64.rpm
mysql-server-5.5.50-1.linux2.6.x86_64.rpm
mysql-shared-5.5.50-1.linux2.6.x86_64.rpm
mysql-shared-compat-5.5.50-1.linux2.6.x86_64.rpm
3. 安装:rpm -ivh mysql-*
4. 配置
cp/usr/share/mysql/my-large.cnf /etc/my.cnf
启动mysql服务:servicemysql start
设置为开机自启动:chkconfig mysql on
# 设置root用户:/usr/bin/mysqladmin -u root password '111111' 懒得设置也行
登录:mysql -uroot # 设置了密码的话,加上-p111111
创建hive用户、hive数据库等
insert intomysql.user(Host,User,Password)values("localhost","hive",password("hive"));
create databasehive;
grant all onhive.* to hive@'%' identified by 'hive';
grant all onhive.* to hive@'localhost' identified by 'hive';
flushprivileges;
以hive用户登录mysql,看看是否可用。
8.2 安装hive
8.2.1 安装
1. 解压安装包
tar -zxvf apache-hive-1.2.1-bin.tar.gz
ln -s apache-hive-1.2.1-bin hive
2. 设置连接mysql
拷贝mysql-connector-java-5.1.39-bin.jar 到hive 的lib下面
3. 设置jline
把jline-2.12.jar拷贝到hadoop相应的目录下,替代jline-0.9.94.jar,否则启动会报错
cp /hive/lib/jline-2.12.jar /hadoop/hadoop-2.6.4/share/hadoop/yarn/lib/
否则会报异常:
Terminal initialization failed; falling back tounsupported
java.lang.IncompatibleClassChangeError: Found classjline.Terminal, but interface was expected
4. 创建hive临时文件夹
mkdir /hadoop/hive/tmp
8.2.2 配置
添加环境变量
vi ~/.bash_profile
导入下面的环境变量
export HIVE_HOME=/hadoop/hive
export PATH=$PATH:$HIVE_HOME/bin
使其有效:source.bash_profile
8.2.2.1 配置全局参数
设定在hive-site.xml中
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hive</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> <description>Username to use against metastore database</description> </property> <property> <name>hive.exec.local.scratchdir</name> <value>/hadoop/hive/iotmp/scratchdir</value> <description>Local scratch space for Hive jobs</description> </property> <property> <name>hive.downloaded.resources.dir</name> <value>/hadoop/hive/iotmp/ <description>Temporary local directory for added resources in the remote file system.</description> </property> <property> <name>hive.querylog.location</name> <value>/hadoop/hive/iotmp/querylog</value> <description>Location of Hive run time structured log file</description> </property> <property> <name>hive.server2.logging.operation.log.location</name> <value>/hadoop/hive/iotmp/operation_logs</value> <description>Top level directory where operation logs are stored if logging functionality is enabled</description> </property> |
n 创建对应的目录
mkdir /hadoop/hive/iotmp/operation_logs /hadoop/hive/iotmp/scratchdir/hadoop/hive/iotmp/querylog
n 除以上参数外,其他参数根据情况进行修改:
1) hive.hwi.listen.host/ hive.hwi.listen.port:Hive Web的监听。默认是0.0.0.0/9999
2) autoCreateSchema:启动时创建SCHEMA,一旦创建后,应该把这个参数设置成false。??
3) hive.metastore.warehouse.dir:存储每个表的根目录,是HDFS上的目录。表的数据都存放在这个文件夹里面
8.2.2.2 临时设置参数
在启动Hive cli的时候进行配置,可以在命令行添加-hiveconf param=value来设定参数,例如:
$ hive--hiveconf mapreduce.job.queuename=queue1
这样在Hive中所有MapReduce作业都提交到队列queue1中。这一设定对本次启动的会话有效,下次启动需要重新配置。
8.2.2.3 在CLI中设置参数
在已经进入cli时进行参数声明,可以在HQL中使用SET关键字设定参数,例如:
|
这样也能达到方法二的效果。
这种配置也是对本次启动的会话有效,下次启动需要重新配置。在HQL中使用SET关键字还可以查看配置的值,如下:
hive> set mapreduce.job.queuename; |
mapreduce.job.queuename=queue1 |
如果set后面什么都不添加,这样可以查到Hive的所有属性配置
8.3 启动
启动hadoop后,执行hive命令:hive
测试输入 show database;
hive> show databases;
OK
default
hive> show tables;
OK
8.4 日志
默认情况,hive的日志存放在/tmp/<user.name>文件夹的hive.log文件中。
在默认的日志级别情况下,是不能将DEBUG信息输出,这样一来出现的各种详细的错误信息都是不能数错的。但是我们可以通过以下两种方式修改log4j输出的日志级别,从而利用这些调试日志进行错误定位,具体做法如下:
l 方法一:
启动指定日志:hive --hiveconf hive.root.logger=DEBUG,console
本方式只是对本次会话有效。
也可以使用自用的配置文件:
-hiveconfhive.log4j.file=/home/iteblog/hive-log4j.properties
l 方法二:
在${HIVE_HOME}/conf/hive-log4j.properties文件中找到hive.root.logger属性,并将其修改为下面的设置
hive.root.logger=DEBUG,console
8.5 可能碰到的问题
l Unable to instantiate …… SessionHiveMetaStoreClient
如果碰到:java.lang.RuntimeException: Unable to instantiateorg.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
不要急于去搜索这个异常,要仔细看后面的错误堆栈。因为没有正确拷贝mysql-conector.jar或不能连接MYSQL数据库(比如用户名密码不对)等等各种问题都可能会报以上异常。
9 Zookeeper安装
9.1 安装ZK
9.1.1 安装
1. 解压安装包
tar zxvf zookeeper-3.4.6.tar.gz
ln -s /hadoop/zookeeper-3.4.6 zookeeper
9.1.2 配置
1. cpzookeeper/conf/zoo_sample.cfg zookeeper/conf/zoo.cfg
2. 编辑zoo.cfg
ü 修改:dataDir=/var/hadoop/zookeeper/datadir
ü 添加:dataLogDir=/var/hadoop/zookeeper/logsdir
ü 添加:
n server.1=master:2888:3888
n server.2=slave1:2888:3888
n server.3=slave2:2888:3888
3. 分发到其他节点
tar cf zookeeper-done.tar zookeeper-3.4.6
for ip in `seq 1 2`; do scp /hadoop/zookeeper-done.tarroot@slave$ip:/hadoop; done
pssh -h ~/hdp-other-hosts "cd /hadoop; tar xfzookeeper-done.tar"
pssh -h ~/hdp-other-hosts "cd /hadoop; ln -s/hadoop/zookeeper-3.4.6 zookeeper"
4. 在各节点上创建ZK的目录:数据文件和日志存放目录
1) mkdir -p/var/hadoop/zookeeper/datadir /var/hadoop/zookeeper/logsdir
2) pssh -h~/hdp-other-hosts "mkdir -p /var/hadoop/zookeeper/datadir/var/hadoop/zookeeper/logsdir"
5. 编辑各节点的myid值
echo 1 > /var/hadoop/zookeeper/datadir/myid
pssh -H root@192.168.0.106 "echo 2 >/var/hadoop/zookeeper/datadir/myid"
pssh -H root@slave2 "echo 3 >/var/hadoop/zookeeper/datadir/myid"
或者使用下面循环代替上面的两句:
for ip in `seq 1 2`; do pssh -H root@slave$ip "echo$[$ip + 1] > /var/hadoop/zookeeper/datadir/myid"; done
10 Hbase安装
在master主机上安装Hbase。
10.1 安装Hbase
10.1.1 安装
6. 解压安装包
tar -zxvf hbase-1.1.5-bin.tar.gz
ln -s /hadoop/hbase-1.1.5 hbase
10.1.2 配置
10.1.2.1 HBASE规划
节点主机名 | Master | ZooKeeper | RegionServer |
master | yes | yes | no |
slave1 | backup | yes | yes |
slave2 | no | yes | yes |
10.1.2.2 配置参数
修改conf目录下的相应文件。
1. 配置regionservers文件
增加各个主机名:
slave1
slave2
2. 设定在hbase-site.xml中
<property> <name>hbase.rootdir</name> <value>hdfs://master:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> |
3. 分发到其他机器上
tar cf hbase-done.tar hbase-1.1.5
for ip in `seq 1 2`; do scp /hadoop/hbase-done.tarroot@slave$ip:/hadoop; done
pssh -h ~/hdp-other-hosts "cd /hadoop; tar xf hbase-done.tar"
pssh -h ~/hdp-other-hosts "cd /hadoop; ln -s/hadoop/hbase-1.1.5 hbase"
10.2 启动
启动:./bin/start-hbase.sh
停止:./bin/stop-hbase.sh # 这个命令执行后可能过几秒才能完全把HBASE停止掉。
进入HBASE的CLI:./bin/hbase shell
启动后,HBASE将在HDFS上创建相应的目录(hbase-site.xml中hbase.rootdir设定的目录)
可通过命令查看其内容:
$ ./bin/hadoop fs -ls /hbase 或者:hdfs dfs -ls hdfs://master:9000/hbase Found 7 items drwxr-xr-x - hbase users 0 2014-06-25 18:58 /hbase/.tmp drwxr-xr-x - hbase users 0 2014-06-25 21:49 /hbase/WALs drwxr-xr-x - hbase users 0 2014-06-25 18:48 /hbase/corrupt drwxr-xr-x - hbase users 0 2014-06-25 18:58 /hbase/data -rw-r--r-- 3 hbase users 42 2014-06-25 18:41 /hbase/hbase.id -rw-r--r-- 3 hbase users 7 2014-06-25 18:41 /hbase/hbase.version drwxr-xr-x - hbase users 0 2014-06-25 21:49 /hbase/oldWALs |
10.3 日志
启动后,HBASE会在其主目录下创建logs目录,其日志被输出到该目录中。