一,安装
hadoop集群安装 (非HA)
把hadoop-2.7.3.tar.gz(自行下载)上传到/app目录,解压:
tar -zxvf hadoop-2.7.3.tar.gz |
/app/hadoop-2.7.3/etc/hadoop目录下,修改配置文件
新建目录: |
mkdir -p /app/hadoop-2.7.3/tmp mkdir -p /app/hadoop-2.7.3/tmp/dfs/name mkdir -p /app/hadoop-2.7.3/tmp/dfs/data |
core-site.xml |
<property> <name>fs.defaultFS</name> <value>>hdfs://node1:9000</value> <!-- nnn是master 的 主机名, 9000不固定,只要端口没有被占用就可以 --> </property> <property> <name>fs.default.name</name> <value>hdfs://node1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/app/hadoop-2.7.3/tmp</value> </property> |
hdfs-site.xml |
<property> <name>dfs.replication</name> <!-- 这个数字2 代表你有几台子节点,这个不要错 --> <value>2</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <!-- nnn是master 的 主机名 --> <value>node1:50090</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/app/hadoop-2.7.3/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/app/hadoop-2.7.3/tmp/dfs/data</value> </property> |
拷贝mapred-site.xml.template 模板:cp mapred-site.xml.template mapred-site.xml |
mapred-site.xml |
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.app-submission.cross-platform</name> <value>true</value> </property> |
yarn-site.xml |
<property> <name>yarn.resourcemanager.hostname</name> <value>node1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> |
slaves :#配置所有dn的主机名称 |
node2 node3 |
hadoop-env.sh 修改JAVA_HOME |
export JAVA_HOME=${JAVA_HOME} 改为: export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64 |
将配置好的hadoop文件夹分发到其他两台主机(dataNode)
scp -r hadoop-2.7.3 node2:/app/ scp -r hadoop-2.7.3 node3:/app/ |
配置环境变量(所有节点)
/etc/profile(root用户,普通用户为~/.bashrc) |
#JAVA_HOME export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64 export PATH=$PATH:$JAVA_HOME/bin #HADOOP export HADOOP_HOME=/app/hadoop-2.7.3 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop |
source /etc/profile |
格式化hdfs 文件系统(只需要这第一次,以后启动不需要了,只在node1(master节点上启动,其他的节点不需要启动), )
hadoop namenode -format |
见到这行字,基本就好了: Storage directory /app/hadoop-2.7.3/tmp/dfs/name has been successfully formatted * * * /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at node1/192.168.56.111 ************************************************************/ |
启动服务:
启动HDFS(在集群的任意一台): |
start-dfs.sh (stop-dfs.sh) |
启动YARN(在集群的master) |
start-yarn.sh (stop-yarn.sh) |
验证服务进程(jps查看)
master: |
SecondaryNameNode NameNode ResourceManager |
其他节点: |
DataNode NodeManager |
相关页面:
HDFS : http://192.168.56.111:50070 疑惑: fs.defaultFS = hdfs://node1:9000 解答:客户单访问HDFS集群所使用的URL地址 同时,HDFS提供了一个web管理界面 端口:50070 |
至此,hadoop集群已经建立,可以执行hadoop的相关操作了。
3,安装Hbase
将hbase-1.3.0-bin.tar.gz上传至/app,解压:
tar -zxvf hbase-1.3.0-bin.tar.gz |
/app/hbase-1.3.0/conf 目录下,修改配置文件:
hbase-env.sh |
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64 |
hbase-site.xml |
<property> <!-- 指定 hbase 在 HDFS 上存储的路径 --> <name>hbase.rootdir</name> <value>hdfs://node1:9000/hbase</value> </property> <property> <!-- 指定 hbase 是分布式的 --> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <!-- 指定 zk 的地址,多个用“,”分割 --> <name>hbase.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property> |
regionservers |
node1 node2 node3 |
把 hadoop 的 hdfs-site.xml 和 core-site.xml 放到 hbase的conf 目录下 |
cp /app/hadoop-2.7.3/etc/hadoop/hdfs-site.xml . cp /app/hadoop-2.7.3/etc/hadoop/core-site.xml . |
将配置好的hbase目录分发到其他节点
scp -r hbase-1.3.0 node2:/$PWD scp -r hbase-1.3.0 node3:/$PWD |
配置环境变量(所有节点)
/etc/profile(root用户,普通用户为~/.bashrc) |
#JAVA_HOME export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64 export PATH=$PATH:$JAVA_HOME/bin #HADOOP export HADOOP_HOME=/app/hadoop-2.7.3 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop |
source /etc/profile |
启动集群:
严格顺序执行: |
1,启动zk(所有zk节点) |
zkServer.sh start |
2,启动HDFS集群及YARN集群(如果需要运行MapReduce程序则启动yarn集群,否则不需要启动)在hadoop的master节点执行 |
start-dfs.sh start-yarn.sh |
3,启动hbase(其中一台执行,执行的那台将自动成为master) |
start-hbase.sh (stop-hbase.sh --stop命令需要在hMaster节点执行) |
验证服务进程(jps查看)
master: |
HMaster |
其他节点: |
HRegionServer |
相关页面:
Hbase Master UI: http://192.168.56.113:16010/master-status |
至此,hbase集群已经建立,可以执行hbase的相关操作了。
如果有节点相应的进程没有启动,那么可以手动启动
hbase-daemon.sh start master hbase-daemon.sh start regionserver |
- 主要命令脚本
进shell窗口命令: hbase shell |
帮助提示: help help "get" //具体命令用法提示 |
列出所有的表: list |
列举命名空间 : list_namespace 创建nameSpace: create_namespace 'newns' 列出具体nameSpace下所有的表: list_namespace_tables 'tianjin' 删除命名空间drop_namespace drop_namespace 'newns' |
查看表描述: describe 't_hbase_table_v1' |
查看服务器状态,可以带参( ‘summary’, ‘simple’, ‘detailed’, or ‘replication’. 默认为 ‘summary’) status status 'detailed' |
查看版本号 version |
查看支持的过滤器: show_filters |
创建表: |
命令格式1:create ‘表名’,‘列簇名1’,‘列簇名2’… #创建一张名为Student的表,包含基本信息(baseinfo)、学校信息(schoolinfo)两个列簇 不指定命名空间,默认放default。指定命名空间格式:nameSpaceName:tableName |
#简便写法 create 'student','baseinfo','schoolinfo' #完整写法,可以指定更多属性(VERSIONS意为保留多少个版本) create 'default:student', {NAME => 'baseinfo', VERSIONS => 1, TTL => 36000000000, BLOCKCACHE => true},{NAME => 'schoolinfo', VERSIONS => 1, TTL => 36000000000, BLOCKCACHE => true} |
删除表: |
#删除表前需要先禁用表 disable 'student' #删除表 drop 'student' |
表的启用与禁用 |
#禁用表 disable 'student' #检查表是否被禁用 is_disabled 'student' #启用表 enable 'student' #检查表是否被启用 is_enabled 'student' |
#查看表是否存在 exists 'student' |
查看表中记录数 |
count 'student' |
#增加指定表行或列的值incr incr '表名', '行键', '列族:列名', 步长值 #获取计数器 get_counter '表名', '行键', '列族:列名' |
#重新创建指定表truncate(truncate是disable、drop、create三个动作的自动化集成。) truncate 'fr:test' |
插入数据: |
命令格式:put ‘表名’,‘行键’,‘列簇名:列名’,‘值’[,时间戳] |
put 'student', '1','baseinfo:name','tom' put 'student', '1','baseinfo:birthday','1990-01-09' put 'student', '1','baseinfo:age','29' put 'student', '1','schoolinfo:name','Havard' put 'student', '1','schoolinfo:localtion','Boston' put 'student', '2','baseinfo:name','jack' put 'student', '2','baseinfo:birthday','1998-08-22' put 'student', '2','baseinfo:age','21' put 'student', '2','schoolinfo:name','yale' put 'student', '2','schoolinfo:localtion','New Haven' put 'student', '3','baseinfo:name','maike' put 'student', '3','baseinfo:birthday','1995-01-22' put 'student', '3','baseinfo:age','24' put 'student', '3','schoolinfo:name','yale' put 'student', '3','schoolinfo:localtion','New Haven' put 'student', '4','baseinfo:name','maike-jack' |
获取指定行、指定行中的列族、列的信息: |
# 获取指定行中所有列的数据信息 get 'student','3' # 获取指定行中指定列族下所有列的数据信息 get 'student','3','baseInfo' # 获取指定行中指定列的数据信息 get 'student','3','baseinfo:name' |
删除指定行、指定行中的列 |
# 删除指定行 deleteall 'student','3' # 删除指定行中指定列的数据 delete 'student','3','baseinfo:name' |
scan查询 |
#查询整表数据 scan 'student' #查询指定列簇的数据 scan 'student', {COLUMN=>'baseinfo'} # 查询指定列的数据 scan 'student', {COLUMNS=> 'baseinfo:birthday'} #限制查询结果的条数 scan '表名称', {STARTROW => '开始行', LIMIT => 行数, VERSIONS => 版本号, STOPROW => 结束行, TIMERANGE => '限制时间戳范围'} |
scan的Filter |
#谁的值=yale scan 'student', FILTER=>"ValueFilter(=,'binary:yale')" #谁的值包含ya scan 'student', FILTER=>"ValueFilter(=,'substring:ya')" #列名为'localti'开头,包含osto或者Haven的列记录 scan 'student', FILTER=>"ColumnPrefixFilter('localti') AND ( ValueFilter(=,'substring:osto') OR ValueFilter(=,'substring:Haven') )" #rowKey为1开头,可结合STARTROW,STOPROW scan 'student', FILTER => "PrefixFilter ('1')" #RowFilter,参考ValueFilter,此为过滤rowKey scan 'student', FILTER=>"RowFilter(=,'binary:1')" scan 'student', FILTER=>"RowFilter(=,'substring:1')" |
- 问题
1, fs.defaultFS还是 fs.default.name
使用 fs.default.name 还是 使用 fs.defaultFS ,要首先判断是否开启了 NN 的HA (namenode 的 highavaliable),如果开启了nn ha,那么就用fs.defaultFS,在单一namenode的情况下,就用 fs.default.name