hadoop配置大全(hadoop集群,hive,sqoop,ntp集群,hbase集群)

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>&amp;1 &amp;</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列表示分钟159 每分钟用*或者 */1表示
第2列表示小时1230表示0点)
第3列表示日期1314列表示月份1125列标识号星期060表示星期天)
第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
上面的例子表示每月11022日的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 : 0023 : 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的集群的搭建
  1. 时间同步集群

     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命令查看处理结果
    
  2. Hadoop集群

    HDFS集群
    Yarn集群
    
  3. Zookeeper集群

    1. 解压缩
    2. 创建数据文件夹
       zookeeper_home/data
    3. 修改配置文件
       conf/zoo.cfg
       dataDir
       server.0 
    4. 在data文件夹中创建 myid文件 0 1 2 
    5. 启动服务  bin/zkServer.sh start
    
  4. 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>
    
对象作用基本用法
ConfigruationHbase相关的配置文件conf.set(“key”,“value”);
HTableHbase中的表表相关的操作都是HTable完成
PutHBase中插入数据Put put = new Put(rowkey)
put.add
HTable.put(put)
DeleteHBase中的删除操作Delete delete = new Delete(rowkey)
HTable.delete(delete)
GetHBase查询单条数据Get get = net Get(rowkey)
HTable.get(get) —> Result
Result单行数据Result – Cells — Cell —
cloneFamily
cloneQualify
cloneValue
Scan表的扫描ResultScanner —> Result
Hbase中的过滤器

在这里插入图片描述

  1. 行键相关的过滤器

    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);
    
  2. 列簇相关的筛选

    1. 只要base列簇相关的数据
    Filter filter1 = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new
                    BinaryComparator(Bytes.toBytes("base")));
    
    scan.setFilter(filter1);
    
  3. 限定符相关筛选

    Filter filter1 = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new
    BinaryComparator(Bytes.toBytes("age")));
    
    scan.setFilter(filter1);
    
  4. 值的筛选

    Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("1") );
    
    scan.setFilter(filter);
    
  5. 列簇中的数据进行筛选

    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);
    
  6. 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的体系结构
  1. RegionServer 【重点】

在这里插入图片描述

  1. HMaster作用

    1. HRegionServer 集群是否健康 
    2. Region---RegionServer分配
    3. 新Region加入后,负载均衡
    
  2. Zookeeper作用 【重点】

    1. 管理HMaster的高可用
    2. 存储了HBase中非常重要的信息  meta信息
       rowkey 范围  ---- region  ---- RegionServer(健康)
    
  3. 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. 解决热点效应

    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者尽量解决热点问题。
    
  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内部的块数据索引,布隆过滤器
    
  3. 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”
    
    
  4. mslab

    1. 防止内存碎片,内存碎片过多,内存泄露,发生FullGC,导致STW.
    hbase.hregion.memstore.mslab.enabled  true
    hbase.hregion.memstore.mslab.chunksize  2M -->  4,5M 6M 
    
  5. 自动化处理的功能变成手工处理

    结合定时,shell脚本 完成处理
    hbase tools 手工操作 compact split
    
    test.sh
    /opt/install/hbase-0.98.6-hadoop2/bin/hbase shell /root/hbase/test
    
HBase与MapReduce的集成
  1. Hbase为什么需要和MR集成?

    HBase数据的迁移。

  2. MR改如何与HBase集成

    hadoop-env.sh 
    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/install/hbase-0.98.6-hadoop2/lib/*
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值