Hadoop
Hadoop伪分布式
基本环境搭建
0. Vmware中网卡 桥接(bridge),NAT
桥接:宿主机 ,虚拟机 在网络上 ,等同的 ,相互都具有独立的ip地址
NAT模式:宿主机(192.168.0.3)虚拟机 (192.168.0.3)
宿主机 可以与 虚拟机 构建一个 虚拟的网络
便于实验 测试 虚拟的IP地址
1. ifconfig 设置ip地址
1.1 临时ip地址的设置 ifconfig eth0 192.168.111.3 关机 重启 ip将消失
1.2 永久设置linux服务器ip地址:vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.111.3
NETMASK=255.255.255.0
GATEWAY=192.168.111.0
重启网络服务器 service network start|stop|restart
1.3 ifconfig直接执行 显示所有网卡的ip地址
1.4 ifconfig eth0 具体查看某一块网卡的ip信息
1.5 启动关闭某一块网卡 ifconfig eth0 up|down
2. 防火墙 (关闭当前防火墙)
service iptables start|stop|restart|status
3. 关闭防火墙(开机自动启动)
chkconfig iptables off|on
4. 关闭selinux : 红帽子、centos公司定制的一种安全服务
vi /etc/selinux/config
SELINUX=disabled
主机名设置 vi /etc/sysconfig/network
5. linux服务器中双网卡的设置
1.1 虚拟中配置一个新的网络适配器,设置类型为桥接
1.2 /etc/syconfig/nework-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
6. linux软件安装
1.1 yum
yum -y install lrzsz
1.1.1 修改yum源 加速
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
下载163源,并上传/etc/yum.repos.d
yum clean all
yum makecache
1.2 rpm (redhat package management)
rpm -ivh jxxxx.rpm
1.3 tar二进制包 直接解压缩安装
tar -zxvf xxx -C /xxx/xxx
1.4 源码编译安装 tar
1.1 tar -zxvf xxx.tar.gz
1.2 ./configure
1.3 make
1.4 make install
7.创建软件安装目录
/opt/models 原始文件
/opt/install 安装文件放置的位置
8.jdk安装
rpm -ivh jdk-7u71-linux-x64.rpm 默认安装位置 /usr
环境变量的配置
vi /etc/profile 环境变量 linux 所有用户生效
vi ~/.bash_profile 环境变量 当前用户生效
vi ~/.bashrc
JAVA_HOME=/usr/java/jdk1.7.0_71
CLASSPATH=.
PATH=$JAVA_HOME/bin:$PATH:$HOME/bin
export JAVA_HOME
export CLASSPATH
export PATH
source .bash_profile
1.配置文件及分布式搭建
1.hadoop配置文件的配置 etc/hadoop
1.1 hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_71
1.2 core-site.xml
<!--用于设置namenode并且作为Java程序的访问入口-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop.baizhiedu.com:8020</value>
</property>
<!--存储NameNode持久化的数据,DataNode块数据-->
<!--手工创建$HADOOP_HOME/data/tmp-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/install/hadoop-2.5.2/data/tmp</value>
</property>
1.3 hdfs-site.xml
<!--设置副本数量 默认是3 但是单节点测试,改成1-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!--权限设置-->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
1.4 mapred-site.xml
<!--yarn 与 MR相关-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
1.5 yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
1.6 slaves
hadoop2.baizhiedu.com
2. namenode的格式化
bin/hdfs namenode -format
3. 启动hadoop守护进程
注:可以新建文件hadoop-start.sh将启动命令封装,注意修改执行权限-744
sbin/hadoop-daemon.sh start namenode
sbin/hadoop-daemon.sh start datanode
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
sbin/hadoop-daemon.sh stop namenode
sbin/hadoop-daemon.sh stop datanode
sbin/yarn-daemon.sh stop resourcemanager
sbin/yarn-daemon.sh stop nodemanager
7. 测试验证安装成果
ps -ef | grep java
jps 查看相关4个进程
通过网络进行访问测试
浏览器 http://hadoop2.baizhiedu.com:50070 hdfs
http://hadoop2.baizhiedu.com:8088 yarn
2.代码访问pom.xml配置
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.5.2</version>
</dependency>
<!--常用代码-->
private FileSystem getFileSystem() throws Exception{
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://hadoop2.baizhiedu.com:8020");
FileSystem fileSystem = FileSystem.get(conf);
return fileSystem;
}
Hadoop分布式集群(3节点)
1.准备3个节点,修改下列信息
ip地址 防火墙 selinux 主机名 主机映射 jdk ssh免密登陆
ssh免密登录:(namenode需要登录全部datanode)
1. 生成公私钥对
ssh-keygen -t rsa 最终放置到 ~/.ssh目录
2. 如何把client机的公钥,发送给远端主机
ssh-copy-id root@ip
2.配置文件及分布式搭建
1. Hadoop 每个节点都要安装hadoop,并且保证配置文件一致
注意:老机器化 删除 hadoop_home/data/tmp 内容
2. 按照分布式集群的要求,书写配置文件,同步集群的每一个节点
hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_71
core-site.xml
<!--用于设置namenode并且作为Java程序的访问入口-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop.baizhiedu.com:8020</value>
</property>
<!--存储NameNode持久化的数据,DataNode块数据-->
<!--手工创建$HADOOP_HOME/data/tmp-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/install/hadoop-2.5.2/data/tmp</value>
</property>
hdfs-site.xml
<!--可选择保留-->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
yarn-site.xml [一样]
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
mapred-site.xml [一样]
<!--yarn 与 MR相关-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
slaves
hadoop2.baizhiedu.com
hadoop3.baizhiedu.com
hadoop4.baizhiedu.com
4. 格式化【namenode】
bin/hdfs namenode -format
5. 启动集群【namenode】
start-dfs.sh
stop-dfs.sh
#shell命令 执行在 namenode所在节点
HANameNode集群搭建(3个节点)
1.zookeeper集群
1.1 解压缩
tar -zxvf zookeeper-3.4.5.tar.gz -C /opt/install
1.2 创建数据文件夹
mkdir zookeeper安装目录/data
1.3 conf目录修改zookeeper的配置文件
修改zoo_sample.cfg 为 zoo.cfg 命令:mv zoo_sample.cfg zoo.cfg
编辑内容 vim zoo.cfg
dataDir=/opt/install/zookeeper-3.4.5/data
server.0=hadoop2.baizhiedu.com:2888:3888
server.1=hadoop3.baizhiedu.com:2888:3888
server.2=hadoop4.baizhiedu.com:2888:3888
1.4 在每个节点zookeeper安装目录/data目录下创建myid文件(touch myid),并分别修改vim myid
hadoop2.baizhiedu.com节点改为0
hadoop3.baizhiedu.com节点改为1
hadoop4.baizhiedu.com节点改为2
文件内容只有一个数字(0或1或2)
可用scp -r 命令 同步集群中所有节点 并 修改对应的myid文件
1.5 主节点 ssh 其他节点
ssh hadoop3.baizhiedu.com
ssh hadoop4.baizhiedu.com
需要输入yes的节点需要再次ssh
1.6 启动zk服务
bin/zkServer.sh start | stop | restart(对所有zookeeper节点执行)
bin/zkServer.sh status 查看集群状态 【必须集群完整启动完成】
bin/zkCli.sh [leader]
2.HA-HDFS集群
☆☆☆删除 data/tmp
2.1 core-site.xml
<!-- 设置访问hdfs集群的虚拟地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!-- 设置NameNode持久化数据、DataNode块数据的保存目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/install/hadoop-2.5.2/data/tmp</value>
</property>
<!-- 让HDFS集群能够认识zookeeper集群(值为zookeeper集群各个几点信息 ) -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop2.baizhiedu.com:2181,hadoop3.baizhiedu.com:2181,
hadoop4.baizhiedu.com:2181</value>
</property>
2.2 hdfs-site.xml
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>hadoop2.baizhiedu.com:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hadoop2.baizhiedu.com:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hadoop3.baizhiedu.com:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hadoop3.baizhiedu.com:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop2.baizhiedu.com:8485;hadoop3.baizhiedu.com:8485;
hadoop4.baizhiedu.com:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/install/hadoop-2.5.2/journal</value>
</property>
<!-- 开启NameNode故障时自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha
.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可 -->
<!-- 隔离机制指Active的NameNode如果 遇到网络 延时等问题时不能像zookeeper集群发送心跳了,
并不是真的宕机了,zookeeper集群会启动StandBy的NameNode。为避免原Active的NameNode复活而
造成的“脑裂”问题,zookeeper集群会将原Active的NameNode进行隔离-杀死 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
2.3 yarn-env.sh添加如下内容
export JAVA_HOME=/usr/java/jdk1.7.0_71
2.4启动命令
首先启动各个节点的Zookeeper,在各个节点上执行以下命令:(进程名 QuorumPeerMain-zookeeper集群进程)
bin/zkServer.sh start
在某一个namenode节点执行如下命令,创建命名空间
bin/hdfs zkfc -formatZK
在每个journalnode节点用如下命令启动journalnode(进程名JournalNode-同步EditsLog文件进程)
sbin/hadoop-daemon.sh start journalnode
在主namenode节点格式化namenode和journalnode目录
bin/hdfs namenode -format ns
在主namenode节点启动namenode进程(进程名NameNode)
sbin/hadoop-daemon.sh start namenode
在备namenode节点执行第一行命令,这个是把备namenode节点的目录格式化并把元数据从主namenode节点copy过来,并且这个命令不会把journalnode目录再格式化了!然后用第二个命令启动备namenode进程!
bin/hdfs namenode -bootstrapStandby
sbin/hadoop-daemon.sh start namenode(进程名NameNode)
在两个namenode节点都执行以下命令(进程名 DFSZKFailoverController-失败隔离控制进程 )
sbin/hadoop-daemon.sh start zkfc
在所有datanode节点都执行以下命令启动datanode(进程名 DataNode)
sbin/hadoop-daemon.sh start datanode
日常启停命令
sbin/start-dfs.sh
sbin/stop-dfs.sh
Hadoop源码编译
1.源码编译过程
1. hadoop源码
2. maven linux版本
3. 安装相关依赖软件
1. jdk
2. maven 并设置 环境变量 (apache-maven-3.0.5-bin.tar.gz)
/etc/profile
MAVEN_HOME
M2_HOME
PATH
3.linux相关的软件
yum install wget
yum install autoconf automake libtool cmake
yum install ncurses-devel
yum install openssl-devel
yum install lzo-devel zlib-devel gcc gcc-c++
4. 安装protobuf
解压:
tar -zxvf protobuf-2.5.0.tar.gz
编译安装:
进入安装目录,进行配置,执行命令:
./configure
安装命令:
make
make check
make install
5.安装findbugs
下载: findbugs-1.3.9.tar.gz
解压:
tar –zxvf findbugs-1.3.9.tar.gz
设置环境变量(/etc/profile):
export FINDBUGS_HOME=/opt/modules/findbugs-1.3.9
export PATH=$PATH:$ FINDBUGS_HOME/bin
执行命令:source /etc/profile
验证:findbugs -version
4. Hadoop源码编译
export MAVEN_OPTS="-Xms256m -Xmx512m"
mvn package -DskipTests -Pdist,native -Dtar 执行在Hadoop2.5.0的源码包中
5. 编译成功 hadoop_src_home/hadoop-dist/target
2.可能出现的问题
1. maven版本过高
2. 错误
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (dist) on project hadoop-hdfs-httpfs: An Ant BuildException has occured: exec returned: 2
[ERROR] around Ant part ...<exec dir="/home/pory/workplace/hadoop-2.4.1-src/hadoop-hdfs-project/hadoop-hdfs-httpfs/target" executable="sh" failοnerrοr="true">... @ 10:134 in /home/pory/workplace/hadoop-2.4.1-src/hadoop-hdfs-project/hadoop-hdfs-httpfs/target/antrun/build-main.xml
[ERROR] -> [Help 1]
这是因为/home/pory/workplace/hadoop-2.4.1-src/hadoop-hdfs-project/hadoop-hdfs-httpfs/downloads目录下的文件没有下载完全,可以手动下一份匹配版本的文件放在下面,在http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.36/bin/
然后重新执行命令
3.编译完成后使用
需要应用64为的hadoop替换32位hadoop /opt/install/hadoop-2.5.2/lib/native 的内容
# 替换一定在linux系统中直接替换。
Hadoop(伪)分布式集群yarn启动
1. 配置相关的配置文件 etc/hadoop
yarn-site.xml mapred-site.xml
2. 启动yarn
2.1 伪分布式
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
2.2 集群方式
mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定resourcemanager所对应的节点--> 【分布式环境新加】
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop12.baizhiedu.com</value>
</property>
slaves
datanode同时又是nodemanager
同步集群的每一个节点
正常启动hdfs
namenode格式化 bin/hdfs namenode -format
sbin/start-dfs.sh
集群方式的yarn启动
建议 namenode 不要和 resourcemanager放置在同一个点
# ssh相关的机器,避免yes
在集群环境下,yarn启动的命令,需要在resourcemanager所在的节点执行
sbin/start-yarn.sh
sbin/stop-yarn.sh
验证:
jps看进程
http://hadoop12.baizhiedu.com:8088
##Hadoop(伪)分布式集群日志查看
1.yarn集群开启历史日志,日志归档
1. 配置文件
mapred-site.xml 历史服务
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop12.baizhiedu.com:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop12.baizhiedu.com:19888</value>
</property>
yarn-site.xml 日志聚合
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!--秒-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2. 启动进程
sbin/mr-jobhistory-daemon.sh start historyserver
sbin/mr-jobhistory-daemon.sh stop historyserver
2.Shell脚本查看日志
1. 关闭日志聚合
2. etc/hadoop/yarn-env.sh
export YARN_LOG_DIR=~/logs/yarn
export YARN_PID_DIR=~/data/yarn
3.创建脚本
if [ $# -le 0 ]
then
echo 缺少参数
exit 1
fi
logtype=out
if [ $# -ge 1 ]
then
logtype=${2}
fi
for n in `cat /opt/install/hadoop-2.5.2/etc/hadoop/slaves`
do
echo ===========查看节点 $n============
ssh $n "cat ~/logs/yarn/userlogs/${1}/container_*/*${logtype}|grep com.baizhiedu"
done
4.运行脚本
1. 修改脚本权限
2. ./scanMRLog.sh application_1558968514803_0001
MapReduce开发骨架搭建
1.pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.baizhi</groupId>
<artifactId>hadoop-mr-templete</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<modules>
<module>hadoop_05</module>
</modules>
<name>hadoop-mr-templete</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<baizhi-mainClass>com.baizhi.MapReduceJobSubmiter</baizhi-mainClass>
<target-host>192.168.150.102</target-host>
<target-position>/opt/install/hadoop-2.5.2</target-position>
</properties>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-yarn-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-yarn-common</artifactId>
<version>2.5.2</version>
</dependency>
</dependencies>
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>2.8</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<outputDirectory>${basedir}</outputDirectory>
<archive>
<manifest>
<mainClass>${baizhi-mainClass}</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0</version>
<configuration>
<fromFile>${project.build.finalName}.jar</fromFile>
<url>scp://root:111111@${target-host}${target-position}</url>
<commands>
<command>pkill -f ${project.build.finalName}.jar</command>
<command>nohup /opt/install/hadoop-2.5.2/bin/yarn jar ${target-position}/${project.build.finalName}.jar > /root/nohup.out 2>&1 &</command>
</commands>
<!-- 显示运行命令的输出结果 -->
<displayCommandOutputs>true</displayCommandOutputs>
</configuration>
</plugin>
</plugins>
</build>
</project>
Hive环境的搭建
1. linux服务器 ip 映射 主机名 关闭防火墙 关闭selinux ssh免密登陆 jdk
2. 搭建hadoop环境
3. 安装Hive
3.1 解压缩hive
3.2 hive_home/conf/hive-env.sh [改名]
HADOOP_HOME=/opt/install/hadoop-2.5.2
export HIVE_CONF_DIR=/opt/install/apache-hive-0.13.1-bin/conf
3.2 hdfs创建2个目录
/tmp
/user/hive/warehouse
bin/hdfs dfs -mkdir /tmp
bin/hdfs dfs -mkdir /user/hive/warehouse
3.3 启动hive
bin/hive
3.4 jps
runjar
##Hive中元数据库替换
Hive中元数据库Derby替换成MySQL(Oracle)
0. 删除hdfs /user/hive/warehouse目录,并重新建立
1. linux mysql
yum -y install mysql-server
2. 启动mysql服务并设置管理员密码
service mysqld start
/usr/bin/mysqladmin -u root password '123456'
3. 打开mysql远程访问权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
flush privileges;
use mysql
delete from user where host like 'hadoop%';
delete from user where host like 'l%';
delete from user where host like '1%';
service mysqld restart
4. 创建conf/hive-site.xml
cp hive-default.xml.template hive-site.xml
hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop21.baizhiedu.com:3306/metastore?createDatabaseIfNotExist=true</value>
<description>the URL of the MySQL database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
5. hive_home/lib 上传mysql driver jar包
Hive的语法细节
1.HQL
1. 基本查询
select * from table_name # 不启动mr
select id from table_name # 启动mr
2. 条件查询 where
select id,name from t_users where name = 'suns1';
2.1 比较查询 = != >= <=
select id,name from t_users where age > 20;
2.2 逻辑查询 and or not
select id,name,age from t_users where name = 'suns' or age>30;
2.3 谓词运算
between and
select name,salary from t_users where salary between 100 and 300;
in
select name,salary from t_users where salary in (100,300);
is null
select name,salary from t_users where salary is null;
like
select name,salary from t_users where name like 'suns%';
select name,salary from t_users where name like 'suns__';
select name,salary from t_users where name like 'suns%' and length(name) = 6;
3. 排序 order by [底层使用的是 map sort group sort compareto]
select name,salary from t_users order by salary desc;
4. 去重 distinct
select distinct(age) from t_users;
5. 分页 [Mysql可以定义起始的分页条目,但是Hive不可以]
select * from t_users limit 3;
6. 聚合函数(分组函数) count() avg() max() min() sum()
count(*) count(id) 区别
7. group by
select max(salary) from t_users group by age;
规矩: select 后面只能写 分组依据和聚合函数 (Oracle报错,Mysql不报错,结果不对)
8. having
分组后,聚合函数的条件判断用having
select max(salary) from t_users group by age having max(salary) > 800;
9. hive不支持子查询
10. hive内置函数
show functions
length(column_name) 获得列中字符串数据长度
substring(column_name,start_pos,total_count)
concat(col1,col2)
to_data('yyyy-mm-dd')
year(data) 获得年份
month(data)
date_add
....
select year(to_date('1999-10-11')) ;
11. 多表操作
inner join
select e.name,e.salary,d.dname
from t_emp as e
inner join t_dept as d
on e.dept_id = d.id;
select e.name,e.salary,d.dname
from t_emp as e
left join t_dept as d
on e.dept_id = d.id;
select e.name,e.salary,d.dname
from t_emp as e
right join t_dept as d
on e.dept_id = d.id;
select e.name,e.salary,d.dname [mysql 不支持]
from t_emp as e
full join t_dept as d
on e.dept_id = d.id;
2.表相关的操作
2.1管理表相关
1. 基本管理表的创建
create table if not exists table_name(
column_name data_type,
column_name data_type
)row format delimited fields terminated by '\t';
后可加 location 'hdfs_path' 指定位置
2. as 关键字创建管理表
create table if not exists table_name as select id,name from t_users;
表结构 由 查询的列决定,同时会把查询结果的数据 插入新表中
3. like 关键字创建管理表
create table if not exists table_name like t_users;
后可加 location 'hdfs_path' 指定位置
表结构 和 like关键字后面的表 一致,但是没有数据是空表
2.2细节
1. 数据类型 int string varchar char double float boolean
2. location hdfs_path
定制创建表的位置,默认是 /user/hive/warehouse/db_name.db/table_name
create table t_suns(
id int,
name string
)row format delimited fields terminated by '\t' location '/xiaohei' ;
启示:日后先有hdfs目录,文件,在创建表进行操作。
3. 查看hive表结构的命令
desc table_name describe table_name
desc extended table_name
desc formatted table_name
2.3外部表
1. 基本
create external table if not exists table_name(
id int,
name string
) row delimited fields terminated by '\t' [location 'hdfs_path'];
2. as 不能使用
3. like
create external table if not exists table_name like t_users [location 'hdfs_path'];
2.4管理表和外部表区别
1. 管理表和外部表的区别
drop table t_users_as; 删除管理表时,直接删除metastore,同时删除hdfs的目录和数据文件
drop table t_user_ex; 删除外部表时,删除metastore的数据。
2. 外部表与管理表使用方式的区别
2.5分区表(查询优化)
示例代码
create table t_user_part(
id int,
name string,
age int,
salary int)partitioned by (data string) row format delimited fields terminated by '\t';
load data local inpath '/root/data15' into table t_user_part partition (data='15');
load data local inpath '/root/data16' into table t_user_part partition (data='16');
select * from t_user_part 全表数据进行的统计
select id from t_user_part where data='15' and age>20;
3.数据的导入
1.基本导入
load data local inpath 'local_path' into table table_name
2.通过as关键字完成数据的导入(建表的同时,通过查询导入数据)
create table if not exists table_name as select id,name from t_users
3.通过insert的方式导入数据 【重点】(#表格已经建好,通过查询导入数据)
create table t_users_like like t_users;
insert into table t_users_like select id,name,age,salary from t_users;
4.hdfs的导入
load data inpath 'hdfs_path' into table table_name
5.导入数据过程中数据的覆盖
load data inpath 'hdfs_path' overwrite into table table_name
本质 把原有表格目录的文件全部删除,再上传新的
4.数据的导出
1.sqoop
hadoop的一种辅助工具 HDFS/Hive <------> RDB (MySQL,Oracle)
2.insert的方式(#xiaohei一定不能存在,自动创建)
insert overwrite 【local】 directory '/root/xiaohei' select name from t_user;
3.通过HDFS的API完成文件的下载【了解】
bin/hdfs dfsd -get /user/hive/warehouse/db_name.db/table_name /root/xxxx
4.命令行脚本的方式【了解】
bin/hive --database 'baizhi_150' -f /root/hive.sql > /root/result
5.Hive提供导入,导出的工具【了解】
1. export 导出
export table tb_name to 'hdfs_path'
2. import 导入
import table tb_name from 'hdfs_path'
5.Hive相关配置参数
1. hive-default.xml
2. hive-site.xml
javax.jdo.option.ConnectionURL
javax.jdo.option.ConnectionDriverName
javax.jdo.option.ConnectionUserName
javax.jdo.option.ConnectionPassword
hive.cli.print.current.db
hive.cli.print.header
<property>
<name></name>
<value></value>
</property>
3. bin/hive --hiveconf hive.cli.print.current.db=false
4. hive>set hive.cli.print.current.db 查看参数
set hive.cli.print.current.db=true; 设置参数
#与MR相关的参数
Map --> Split ---> Block
#reduce相关个数
mapred-site.xml
<property>
<name>mapreduce.job.reduces</name>
<value>1</value>
</property>
hive-site.xml
<!--1G-->
<property>
<name>hive.exec.reducers.bytes.per.reducer</name>
<value>1000000000</value>
</property>
<property>
<name>hive.exec.reducers.max</name>
<value>999</value>
</property>
<!--在查询中是否启动MR 是如下参数配置决定的 -->
<property>
<name>hive.fetch.task.conversion</name>
<value>minimal</value>
<description>
1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
2. more : SELECT, FILTER, LIMIT only (TABLESAMPLE, virtual columns)
</description>
</property>
6.Hive启动的相关参数
1. 启动hive终端时,临时设置hive的配置参数
bin/hive --hiveconf
2. 启动hive时,指定启动的数据库
bin/hive --database baizhi_150
3. 启动hive时,可以执行sql命令,执行完毕后,退出
bin/hive -e 'sql'
bin/hive --database baizhi_150 -e 'sql'
bin/hive --database baizhi_150 -e 'select * from t_user' > /root/result
bin/hive --database baizhi_150 -e 'select * from t_user' >> /root/result
4. 启动hive是,如果需要执行多条sql可以把sql写在一个独立的文件里,执行。完毕退出
bin/hive -f /root/hive.sql
bin/hive --database baizhi_150 -f /root/hive.sql > /root/result (hive.sql为hql文件)
bin/hive --database baizhi_150 -f /root/hive.sql >> /root/result
Sqoop Hadoop的辅助工具 (CDH)
环境准备
(1)1. ip 主机名 映射 防火墙 selinux jdk ssh
2. hadoop解压缩
3. 修改hadoop相关配置文件
hadoop-env.sh
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
slaves
4. 解压缩cdh5.3.6-snappy-lib-natirve.tar.gz 替换 hadoop中的native文件的内容
解决的是64操作系统兼容的问题
5. 格式化
bin/hdfs namenode -format
6. 启动进程 4个进程
(2)1. 解压缩hive
2. 修改hive_home/conf/hive-env.sh
hadoop_home
hive_conf_dir
hive-site.xml 修改metastore 预先安装mysql
3. 上传mysql驱动jar
4. hdfs 创建2个目录 /tmp /user/hive/warehouse
5. 启动hive
Sqoop安装
1. 解压缩 sqoop
2. 配置 sqoop_home/conf
sqoop-env.sh
export HADOOP_COMMON_HOME=/opt/install/hadoop-2.5.0-cdh5.3.6
export HADOOP_MAPRED_HOME=/opt/install/hadoop-2.5.0-cdh5.3.6
export HIVE_HOME=/opt/install/hive-0.13.1-cdh5.3.6
3. 导入驱动jar
4. 测试
bin/sqoop list-databases -connect jdbc:mysql://hadoop22.baizhiedu.com:3306 -username root -password 123456
Sqoop语法详解
1.
bin/sqoop list-databases -connect jdbc:mysql://hadoop22.baizhiedu.com:3306 -username root -password 123456
2. 推荐
bin/sqoop list-databases \
--connect \
jdbc:mysql://hadoop22.baizhiedu.com:3306 \
--username root \
--password 123456
基本导入hdfs
bin/sqoop import \
--connect \
jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user
#hdfs的位置?默认导入hdfs的位置:/user/root/mysql_user
/user/${username}/${table_name}
#sqoop导数据时,所运行的mapreduce 没有reduce只有map
#为什么sqoop导数据时,split是5 对应5个map?
Text --- TextInputFormat ---- block --- split --- map
DB --- DBInputFormat --- 一行 --- 一个split -- 一个map
#输出的文件内容中,列的分隔符默认是,
# 自定义mysql 导入 hdfs目录 /sqoop
bin/sqoop import \
--connect \
jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--target-dir /sqoop
# 在目标目录存在的情况下,sqoop自动删除
bin/sqoop import \
--connect \
jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--target-dir /sqoop \
--delete-target-dir
# 指定map的个数
bin/sqoop import \
--connect \
jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--target-dir /sqoop \
--num-mappers 1 \
--delete-target-dir
# 指定列分割符
bin/sqoop import \
--connect \
jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--target-dir /sqoop \
--num-mappers 1 \
--delete-target-dir \
--fields-terminated-by '\t'
# 增量导入数据
--check-column <column> Source column to check for incremental id
--last-value <value> Last imported value in the incremental 5
--incremental <import-type> Define an incremental import of type append
'append' or 'lastmodified'
# 一定不要加入 --delete-target-dir
bin/sqoop import \
--connect \
jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--target-dir /sqoop \
--num-mappers 1 \
--fields-terminated-by '\t' \
--check-column id \
--last-value 5 \
--incremental append
# 快速导入模式
bin/sqoop import \
--connect \
jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--target-dir /sqoop \
--num-mappers 1 \
--delete-target-dir \
--direct
--fields-terminated-by '\t'
原理: 非快速模式 数据的导入 jdbc
快速 使用的是mysql提供 export import工具
注意: sqoop如果和mysql 安装在不同的机器中 ,使用快速导入 默认报错。
# import hive表
#--hive-import \
#--hive-database baizhi125 \
#--hive-table t_user \
bin/sqoop import \
--connect \
jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--delete-target-dir \
--hive-import \
--hive-database baizhi_150 \
--hive-table t_user \
--num-mappers 1 \
--fields-terminated-by '\t'
导出
1. hdfs------>mysql
bin/sqoop export \
--connect \
jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \
--username root \
--password 123456 \
--table to_mysql \
--export-dir /sqoop \
--num-mappers 1 \
--input-fields-terminated-by ','
2. hive ------->mysql
bin/sqoop export \
--connect \
jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \
--username root \
--password 123456 \
--table to_mysql \
--export-dir /user/hive/warehouse/baizhi_150.db/t_user \
--num-mappers 1 \
--input-fields-terminated-by ','
脚本化的sqoop
# 脚本化的目的:复用sqoop导入 导出命令
1. file文件
1.1 创建一个Sqoop文件 普通文件 sqoop.file
export
--connect
jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop
--username
root
--password
123456
--table
to_mysql
--export-dir
/sqoop
--num-mappers
1
--input-fields-terminated-by
','
1.2
bin/sqoop --options-file /root/sqoop.file
2. job作业
1.1 创建job作业
bin/sqoop job \
--create test_job1 \
-- \
export \
--connect \
jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \
--username root \
--password 123456 \
--table to_mysql \
--export-dir /sqoop \
--num-mappers 1 \
--input-fields-terminated-by ','
1.2
bin/sqoop job --exec test_job1
1.3 问题 每一次输入密码 不利于自动化处理 所以定密码的存储文件
echo -n "123456" >> /root/password
bin/sqoop job \
--create test_job2 \
-- \
export \
--connect \
jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \
--username root \
--password-file file:///root/password \
--table to_mysql \
--export-dir /sqoop \
--num-mappers 1 \
--input-fields-terminated-by ','
# export_mysql.sh
/opt/install/sqoop-1.4.5-cdh5.3.6/bin/sqoop job --exec test_job2
定是处理
1. 安装crontab
2. crontab -e
编辑配置文件
minute hour day month week command
*/5 * * * * command
*/1 * * * * echo 'suns' >> /root/sunshuai
*/1 * * * * /opt/install/sqoop-1.4.5-cdh5.3.6/bin/sqoop job --exec test_job2
3. 启动关闭服务
/sbin/service crond start
/sbin/service crond stop
ps -ef | grep cron
基本格式 :
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab文件的一些例子:
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启apache。
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache
*/30 * * * * /usr/sbin/ntpdate 210.72.145.44
每半小时同步一下时间
Hbase伪分布式环境的搭建
1. linux服务器 ip 主机名 主机映射 防火墙 selinux ssh免密 jdk
2. hadoop安装
2.1 解压缩
2.2 6个配置文件
2.3 格式化
2.4 启动进程
3. 安装zookeeper
3.1 解压缩
3.2 配置conf/zoo.cfg
3.3 创建临时目录 data ---> myid文件(集群)
3.4 启动服务
4. hbase的安装
4.1 解压缩hbase
4.2 hdfs上创建 /hbase文件夹
linux上 hbase_home/data/tmp文件夹
4.3 修改hbase相关的配置文件
env.sh
export HBASE_MANAGES_ZK=false
export JAVA_HOME=/usr/java/jdk1.7.0_71
hbase-site.xml
<property >
<name>hbase.tmp.dir</name>
<value>/opt/install/hbase-0.98.6-hadoop2/data/tmp</value>
</property>
<property >
<name>hbase.rootdir</name>
<value>hdfs://hadoop31.baizhiedu.com:8020/hbase</value>
</property>
<property >
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop31.baizhiedu.com</value>
</property>
4.4 修改
regionservers文件
hadoop31.baizhiedu.com
4.5 替换hbase相关hadoop的jar
4.6 启动hbase
bin/hbase-daemon.sh start master
bin/hbase-daemon.sh start regionserver
4.7 网络访问
http://hadoop31.baizhiedu.com:60010
bin/hbase shell
Hbase的shell命令
1. help 帮助命令
help '命令名字'
2. hbase中数据库的概念
namespace
2.1 显示所有的数据库
list_namespace
默认 default
hbase
2.2 显示当前数据库中所有的表
list_namespace_tables 'hbase'
2.3 创建一个数据库
create_namespace 'baizhi150'
2.4 描述数据库
describe_namespace 'baizhi150'
2.5 修改数据库
alter_namespace
2.6 删除数据库
drop_namespace 'baizhi150'
3. 创建hbase中的表【重点】
3.1 基本的建表方式 【默认default库中】
create 't1','cf1'
3.2 创建多个列簇【默认default库中】
create 't1','cf1','cf2'
3.3 指定表所属的数据库
create 'baizhi150:t1','cf1'
3.4 详细描述列簇的相关属性
create 'baizhi150:t2',{NAME=>'cf1',VERSIONS=>2},{NAME=>'cf2'}
4. 描述表
describe 'baizhi150:t1'
5. 修改表
alter 'baizhi150:t2',{NAME=>'cf2',VERSIONS=>2}
6. 删除表
disable 'baizhi150:t2'(失效)
drop 'baizhi150:t2'(失效后删除)
7. 失效 生效表相关命令
enable disable
enable_all disable_all
is_enable is_disable
8. 判断表是否存在
exists
9. 表的查找命令
list 'ns:t.*'
10. 插入数据
put 't1',’rowkey‘,'family:qualify','value'
put 'ns:t1',’rowkey‘,'family:qualify','value'
11. 删除数据
delete 'ns:t1' ,'rowkey','family:qualify','timestamp'
12. 全表扫描
scan '表名'
scan 'ns1:tb1', {STARTROW => '20170521_10001',STOPROW => '20170521_10003'}
scan 'baizhi150:user',{STARTROW=>'001',STOPROW=>'004'}
不包括stoprow的值
13. 某条数据的查询
get 'baizhi150:user','001'
get 'baizhi150:user','001','base:name'
Hbase的集群的搭建
时间同步集群
hadoop41.baizhiedu.com 作为时间同步服务器 主节点
1. yum install ntp 三台机器
2. service ntpd start 三台机器
chkconfig ntpd on
3. 服务器节点 主节点
ntpdate -u 202.112.10.36
vi /etc/ntp.conf
restrict 192.168.111.0 mask 255.255.255.0 nomodify notrap
# 中国这边最活跃的时间服务器 : http://www.pool.ntp.org/zone/cn
server 210.72.145.44 perfer # 中国国家受时中心
server 202.112.10.36 # 1.cn.pool.ntp.org
server 59.124.196.83 # 0.asia.pool.ntp.org
# 允许上层时间服务器主动修改本机时间
restrict 210.72.145.44 nomodify notrap noquery
restrict 202.112.10.36 nomodify notrap noquery
restrict 59.124.196.83 nomodify notrap noquery
# 外部时间服务器不可用时,以本地时间作为时间服务
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
service ntpd restart
4. client端
vi /etc/ntp.conf
server 192.168.111.41 #这里指的是ntp服务的ip 192.168.206.130
restrict 192.168.111.41 nomodify notrap noquery
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
5. 三台机器 service ntpd restart
6. 从节点同步主节点时间 ntpdate -u 192.168.184.16
adjust time server 192.168.19.10 offset -0.017552 sec
5. date命令查看处理结果
hbase集群
准备
HDFS集群,Yarn集群,zookeeper集群
1. 准备:hbase_home data/tmp logs目录中的内容清空
hdfs 上面 hbase目录清空
2. 修改hbase_home/conf/hbase-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_71
export HBASE_MANAGES_ZK=false
3. hbase-site.xml
<property >
<name>hbase.tmp.dir</name>
<value>/opt/install/hbase-0.98.6-hadoop2/data/tmp</value>
</property>
<property >
<name>hbase.rootdir</name>
<value>hdfs://hadoop6.baizhiedu.com:8020/hbase</value>
</property>
<property >
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop.baizhiedu.com,hadoop1.baizhiedu.com,hadoop2.baizhiedu.com</value>
</property>
4. regionservers
hadoop.baizhiedu.com
hadoop1.baizhiedu.com
hadoop2.baizhiedu.com
5. 替换jar hadoop jar
6. scp 分发
6. 启动hbase (所有安装hbase的机器都执行)
bin/hbase-daemon.sh start master
bin/hbase-daemon.sh start regionserver
hbase的Java API
# java访问HBase的核心API
Configruation HBase相关的配置
Htable HBase中的表
Put 插入数据
Get 查询数据
Scan 扫描数据
BytesUtil 字节处理
引入jar
<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>0.98.6-hadoop2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-server -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>0.98.6-hadoop2</version>
</dependency>
大数据课程第十二天
Hbase的shell命令
1. help 帮助命令
help '命令名字'
2. hbase中数据库的概念
namespace
2.1 显示所有的数据库
list_namespace
默认 default
hbase
2.2 显示当前数据库中所有的表
list_namespace_tables 'hbase'
2.3 创建一个数据库
create_namespace 'baizhi150'
2.4 描述数据库
describe_namespace 'baizhi150'
2.5 修改数据库
alter_namespace
2.6 删除数据库
drop_namespace 'baizhi150'
3. 创建hbase中的表【重点】
3.1 基本的建表方式 【默认default库中】
create 't1','cf1'
3.2 创建多个列簇【默认default库中】
create 't1','cf1','cf2'
3.3 指定表所属的数据库
create 'baizhi150:t1','cf1'
3.4 详细描述列簇的相关属性
create 'baizhi150:t2',{NAME=>'cf1',VERSIONS=>2},{NAME=>'cf2'}
4. 描述表
describe 'baizhi150:t1'
5. 修改表
alter 'baizhi150:t2',{NAME=>'cf2',VERSIONS=>2}
6. 删除表
disable 'baizhi150:t2'
drop 'baizhi150:t2'
7. 失效 生效表相关命令
enable disable
enable_all disable_all
is_enable is_disable
8. 判断表是否存在
exists
9. 表的查找命令
list 'ns:t.*'
10. 插入数据
put 't1',’rowkey‘,'family:qualify','value'
put 'ns:t1',’rowkey‘,'family:qualify','value'
11. 删除数据
delete 'ns:t1' ,'rowkey','family:qualify','timestamp'
12. 全表扫描
scan '表名'
scan 'ns1:tb1', {STARTROW => '20170521_10001',STOPROW => '20170521_10003'}
scan 'baizhi150:user',{STARTROW=>'001',STOPROW=>'004'}
不包括stoprow的值
13. 某条数据的查询
get 'baizhi150:user','001'
get 'baizhi150:user','001','base:name'
Hbase的集群的搭建
-
时间同步集群
hadoop41.baizhiedu.com 作为时间同步服务器 主节点 1. yum install ntp 三台机器 2. service ntpd start 三台机器 chkconfig ntpd on 3. 服务器节点 主节点 ntpdate -u 202.112.10.36 vi /etc/ntp.conf restrict 192.168.111.0 mask 255.255.255.0 nomodify notrap # 中国这边最活跃的时间服务器 : http://www.pool.ntp.org/zone/cn server 210.72.145.44 perfer # 中国国家受时中心 server 202.112.10.36 # 1.cn.pool.ntp.org server 59.124.196.83 # 0.asia.pool.ntp.org # 允许上层时间服务器主动修改本机时间 restrict 210.72.145.44 nomodify notrap noquery restrict 202.112.10.36 nomodify notrap noquery restrict 59.124.196.83 nomodify notrap noquery # 外部时间服务器不可用时,以本地时间作为时间服务 server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 service ntpd restart 4. client端 vi /etc/ntp.conf server 192.168.111.41 #这里指的是ntp服务的ip 192.168.206.130 restrict 192.168.111.41 nomodify notrap noquery server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 5. 三台机器 service ntpd restart 6. 从节点同步主节点时间 ntpdate -u 192.168.184.16 adjust time server 192.168.19.10 offset -0.017552 sec 5. date命令查看处理结果
-
Hadoop集群
HDFS集群 Yarn集群
-
Zookeeper集群
1. 解压缩 2. 创建数据文件夹 zookeeper_home/data 3. 修改配置文件 conf/zoo.cfg dataDir server.0 4. 在data文件夹中创建 myid文件 0 1 2 5. 启动服务 bin/zkServer.sh start
-
Hbase集群
1. 准备:hbase_home data/tmp logs目录中的内容清空 hdfs 上面 hbase目录清空 2. 修改hbase_home/conf/hbase-env.sh export JAVA_HOME=/usr/java/jdk1.7.0_71 export HBASE_MANAGES_ZK=false 3. hbase-site.xml <property > <name>hbase.tmp.dir</name> <value>/opt/install/hbase-0.98.6-hadoop2/data/tmp</value> </property> <property > <name>hbase.rootdir</name> <value>hdfs://hadoop6.baizhiedu.com:8020/hbase</value> </property> <property > <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop.baizhiedu.com,hadoop1.baizhiedu.com,hadoop2.baizhiedu.com</value> </property> 4. regionservers hadoop.baizhiedu.com hadoop1.baizhiedu.com hadoop2.baizhiedu.com 5. 替换jar hadoop jar 6. scp 分发 6. 启动hbase(所有安装hbase的机器都执行) bin/hbase-daemon.sh start master bin/hbase-daemon.sh start regionserver
HBase的Java API
# java访问HBase的核心API Configruation HBase相关的配置 Htable HBase中的表 Put 插入数据 Get 查询数据 Scan 扫描数据 BytesUtil 字节处理
<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client --> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>0.98.6-hadoop2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-server --> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>0.98.6-hadoop2</version> </dependency>
对象 | 作用 | 基本用法 |
---|---|---|
Configruation | Hbase相关的配置文件 | conf.set(“key”,“value”); |
HTable | Hbase中的表 | 表相关的操作都是HTable完成 |
Put | HBase中插入数据 | Put put = new Put(rowkey) put.add HTable.put(put) |
Delete | HBase中的删除操作 | Delete delete = new Delete(rowkey) HTable.delete(delete) |
Get | HBase查询单条数据 | Get get = net Get(rowkey) HTable.get(get) —> Result |
Result | 单行数据 | Result – Cells — Cell — cloneFamily cloneQualify cloneValue |
Scan | 表的扫描 | ResultScanner —> Result |
Hbase中的过滤器
-
行键相关的过滤器
1.比较行键值的大小 Filter filter1 = new RowFilter(CompareFilter.CompareOp.GREATER, new BinaryComparator(Bytes.toBytes("0003"))); scan.setFilter(filter1); 2. 比较行键按照特定的规则设计 Filter filter1 = new PrefixFilter(Bytes.toBytes("000")); scan.setFilter(filter1);
-
列簇相关的筛选
1. 只要base列簇相关的数据 Filter filter1 = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("base"))); scan.setFilter(filter1);
-
限定符相关筛选
Filter filter1 = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("age"))); scan.setFilter(filter1);
-
值的筛选
Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("1") ); scan.setFilter(filter);
-
列簇中的数据进行筛选
SingleColumnValueFilter filter = new SingleColumnValueFilter( Bytes.toBytes("base"), Bytes.toBytes("sex"), CompareFilter.CompareOp.EQUAL, new SubstringComparator("male")); filter.setFilterIfMissing(true); //filter.setFilterIfMissing(false); //符合要求的数据 password=123456 //column 中不包含password限定符 查询出来 scan.setFilter(filter); 同时要排除password 限定符 SingleColumnValueExcludeFilter filter = new SingleColumnValueExcludeFilter( Bytes.toBytes("base"), Bytes.toBytes("password"), CompareFilter.CompareOp.NOT_EQUAL, new SubstringComparator("66666")); filter.setFilterIfMissing(true); //filter.setFilterIfMissing(false); //符合要求的数据 password=123456 //column 中不包含password限定符 查询出来 scan.setFilter(filter);
-
FilterList
设置多个过滤器 同时生效 FilterList filterList = new FilterList(); Filter filter1 = new PrefixFilter(Bytes.toBytes("000")); SingleColumnValueFilter filter2 = new SingleColumnValueFilter( Bytes.toBytes("base"), Bytes.toBytes("password"), CompareFilter.CompareOp.EQUAL, new SubstringComparator("123456")); filter2.setFilterIfMissing(true); filterList.addFilter(filter1); filterList.addFilter(filter2); scan.setFilter(filterList);
大数据课程第十三天
HBase中列簇的相关属性
1. 创建HBase表
create 'table_name',{NAME=>'',VERSIONS=>''}
2. Hbase列簇的常见属性
# 列簇的名字
NAME='xxxxx'
# 列簇对应限定符 能存几个版本的数据
VERSIONS => '1'
# TTL Time To Live
指定的是cell中的数据,存储在HBase中的存活时间 'FOREVER'
TTL => 100
# 指定HBase上存储的数据 是否 启动压缩
COMPRESSION => 'NONE'
COMPRESSION => 'snappy'
# 列簇中的数据,存储在内存中,提高查询效率 (默认关闭)
IN_MEMORY => 'false’
# 缓存 列簇部分数据,从而提高查询效率
BLOCKCACHE => 'true'
# Block是列簇中存储数据的最小单位
BLOCKSIZE => '65536'
调整大 顺序查询 需求高
调整小 随机查询 需求高
# 提高查询效率
BLOOMFILTER 布隆过滤
HBase的体系结构
- RegionServer 【重点】
-
HMaster作用
1. HRegionServer 集群是否健康 2. Region---RegionServer分配 3. 新Region加入后,负载均衡
-
Zookeeper作用 【重点】
1. 管理HMaster的高可用 2. 存储了HBase中非常重要的信息 meta信息 rowkey 范围 ---- region ---- RegionServer(健康)
-
HBase compact 和 split
RowKey设计
1. HBase相关的查询操作,95%上都是对RowKey查询。
2. 设计过程
2.1 复合
2.2 查询内容作为rowkey组成
3. rowkey 64K 10--100字节唯一
4. rowkey结合自己的实际需求
4.1 区域查询多,建议 rowkey 连续
4.4 区域查询少,散列 hash ---> 加密、UUID
System.out.println(UUID.randomUUID().toString());
String rowkey = "suns_male_130";
String result = DigestUtils.md5Hex(rowkey);
System.out.println(result);
大数据课程第十四天
HBase优化策略
-
解决热点效应
1. 预分区 在创建表时,不按照默认的策略,为表只创建一个Region,而是根据需要,为一张表创建多个Region,从而避免热点效应 2. 预分区的依据 基于Rowkey进行预分区 3. 语法: 3.1 create 't1', 'f1', SPLITS => ['10', '20', '30', '40'] 3.2 create 't1', 'f1', SPLITS_FILE => 'splits.txt' splits.txt 10 20 30 40 3.3 create 't2', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'} 4. 根本上解决热点问题需要注意如下几点 1. 预分区 2. rowkey设置 综上2者尽量解决热点问题。
-
如何提高检索效率
1. rowkey 相对连续 那么检索效率一定高 (顺序查询 scan操作) 2. 设置Memstore大小 , Block Cache大小 hbase-site.xml 设置 hbase.hregion.memstore.flush.size 128M 每一个memstore达到128M flush hbase.regionserver.global.memstore.size 0.4 堆空间的40% (regionserver占用JVM 对空间) 1. 让数据尽可能多的放置在内存中,提高检索效率 2. 避免flush memstore 阻塞client操作 hbase.regionserver.global.memstore.size.lower.limit 当全局flush到 memstore用量达95%不在flush hfile.block.cache.size 0.4 3. hbase内部的块数据索引,布隆过滤器
-
JVM参数配置
1. JVM Java进程 2. JVM (堆空间) HBase 新生代 1/3 老年代 2/3 永久代(静态,常量) eden survivor(from) survivor(to) 8 1 1 ParNewGC ConcMarkSweepGC ”-Xmx8g -Xms8G -Xmn128m -XX:UseParNewGC -XX:UseConcMarkSweepGC - XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:$HBASE_HOME/logs/gc-${hostname}-hbase.log” hbase-env.sh export HBASE_REGIONSERVER_OPTS=”-Xmx8g -Xms8G -Xmn128m -XX:UseParNewGC -XX:UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:$HBASE_HOME/logs/gc-${hostname}-hbase.log”
-
mslab
1. 防止内存碎片,内存碎片过多,内存泄露,发生FullGC,导致STW. hbase.hregion.memstore.mslab.enabled true hbase.hregion.memstore.mslab.chunksize 2M --> 4,5M 6M
-
自动化处理的功能变成手工处理
结合定时,shell脚本 完成处理 hbase tools 手工操作 compact split test.sh /opt/install/hbase-0.98.6-hadoop2/bin/hbase shell /root/hbase/test
HBase与MapReduce的集成
-
Hbase为什么需要和MR集成?
HBase数据的迁移。
-
MR改如何与HBase集成
hadoop-env.sh export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/install/hbase-0.98.6-hadoop2/lib/*