一:安装环境
#selinux 关闭 1、临时关闭(不用重启机器): setenforce 0 2、修改配置文件需要重启机器: 修改/etc/selinux/config 文件 将SELINUX=enforcing改为SELINUX=disabled 重启机器即可#关闭防火墙
2.1) 重启后生效 开启: chkconfig iptables on 关闭: chkconfig iptables off 2) 即时生效,重启后失效 开启: service iptables start 关闭: service iptables stop 需要说明的是对于Linux下的其它服务都可以用以上命令执行开启和关闭操作。 在开启了防火墙时,做如下设置,开启相关端口, 修改/etc/sysconfig/iptables 文件,添加以下内容: 搜索 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT#添加 ip和域
3.vim /etc/hosts eg: 172.16.100.210 dev1.hadoop.feidai.com dev1 #修改别名 vim /etc/sysconfig/network eg: NETWORKING=yes HOSTNAME=uat1.hadoop.feidai.com #临时生效 hostname 别名 #查看显卡,绑定固定ip eg: DEVICE=em1 HWADDR=24:6E:96:58:7D:34 TYPE=Ethernet UUID=43bf8c93-9bbc-42f8-820a-9477d4951298 ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=172.16.100.217 NETMASK=255.255.255.0 GATEWAY=172.16.100.2524.ssh免密码登陆
cd ssh-keygen -t rsa --------------------然后一直按回车键,就会按照默认的选项将生成的密钥保存在.ssh/id_rsa文件中。 ls -a #默认在 ~/.ssh目录生成两个文件: #id_rsa :私钥 #id_rsa.pub :公钥 cd ~/.ssh cp id_rsa.pub authorized_keys #或者cat ~/.ssh/id_rsa.pub >> .ssh/authorized_keys #可以实现本机免密码登陆,把其它pc的公钥添加到authorized_keys可实现免密码访问 ssh uat2 date #检查ssh免密码是否成功5.安装jdk
#set java environment #卸载已经 安装的jdk rpm -qa |grep java |xargs rpm -e --nodeps #jdk-7u79-linux-x64.tar.gz vim /etc/profile #jdk1.7.0_79 JAVA_HOME=/usr/java/jdk1.7.0_79 JRE_HOME=/usr/java/jdk1.7.0_79/jre CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export JAVA_HOME JRE_HOME CLASS_PATH PATH #让修改生效: [root java]# source /etc/profile #验证JDK有效性 [root java]# java -version#查看个版本兼容问题
hbase.apache.org/book.html#arch.overview一.zookeeper-3.4.6 安装
vim /etc/profile #zookeeper-3.4.6 export ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bintar -zxvf /usr/local/zookeeper-3.4.6.tar.gz
mv /usr/local/zookeeper-3.4.6 /usr/local/zookeeper cd /usr/local/zookeeper/conf/ cp zoo_sample.cfg zoo.cfg vim zoo.cfg #----- 修改以下内容 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/usr/local/zookeeper/zk_data dataLogDir=/usr/local/zookeeper/zk_logs clientPort=2181 maxClientCnxns=2000 server.1=master:2888:3888 server.2=slave1:2888:3888 server.3=slave2:2888:3888 保存退出 #----- #然后创建一个tmp文件夹 mkdir -pv /usr/local/zookeeper/zk_data #然后创建一个logs文件夹 mkdir -pv /usr/local/zookeeper/zk_logs scp -r zookeeper root@slave1:/usr/local/ #最后向该文件写入ID,填入myid文件里 192.168.1.112机器: echo "1" >> /usr/local/zookeeper/zk_data/myid 192.168.1.113机器: echo "2" > /usr/local/zookeeper/zk_data/myid 192.168.1.114机器: echo "3" > /usr/local/zookeeper/zk_data/myidsource /etc/profile
#启动 zkServer.sh start JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@slave2 local]# zkServer.sh status JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: follower [root@slave1 zookeeper]# zkServer.sh status JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: leader [root@master local]# zkServer.sh status JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: follower#数据清理文件
vim zkslCleanup.sh #!/bin/bash #Cleanup snapshots and transaction logs #snapshot file dir dataDir=/usr/local/zookeeper/zk_data/version-2 #tran log dir dataLogDir=/usr/local/zookeeper/zk_logs/version-2 #zk log dir logDir=/usr/local/zookeeper/zk_logs #Leave 60 files count=60 count=$[$count+1] ls -t $dataLogDir/log.* | tail -n +$count | xargs rm -f ls -t $dataDir/snapshot.* | tail -n +$count | xargs rm -f ls -t $logDir/zookeeper.log.* | tail -n +$count | xargs rm -fchmod +x zkslCleanup.sh
二.hadoop的HA配置
#统一时间
date -s "2017-08-03 17:18:00" #hadoop-2.6.4 export HADOOP_HOME=/usr/local/hadoop export HADOOP_BIN=/usr/local/hadoop/bin export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib" export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin二.hadoop的HA配置(安装环境就不在此细说)
mv hadoop-2.6.4 hadoopcd /usr/local/hadoop/etc/hadoop
1.vim hadoop-env.shexport HADOOP_LOG_DIR=/root/data/hadoop/log
export JAVA_HOME=/usr/java/jdk1.7.0_792.vim core-site.xml
<configuration> /*这里的值指的是默认的HDFS路径。当有多个HDFS集群同时工作时,集群名称在这里指定!该值来自于hdfs-site.xml中的配*/ <property> <name>fs.defaultFS</name> <value>hdfs://nameservice</value> </property> /*缓冲区大小:io.file.buffer.size默认是4KB*/ <property> <name>io.file.buffer.size</name> <value>131072</value> </property> /*这里的路径默认是NameNode、DataNode、JournalNode等存放数据的公共目录。用户也可以自己单独指定这三类节点的目录。*/ <property> <name>hadoop.tmp.dir</name> <value>/root/data/hadoop/tmp</value> <description>Abase for other temporary directories. </description> </property> <property> <name>hadoop.proxyuser.hduser.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hduser.groups</name> <value>*</value> </property> <!--这里是ZooKeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点--> <property> <name>ha.zookeeper.quorum</name> <value>master:2181,slave1:2181,slave2:2181</value> </property> </configuration> 3.vim hdfs-site.xml<configuration>
<!--指定DataNode存储block的副本数量。默认值是3个,不要大于DataNode的数量 --> <property> <name>dfs.replication</name> <value>3</value> </property> <!--使用federation时,HDFS集群别名。名字可以随便起,多个集群时相互不重复即可--> <property> <name>dfs.nameservices</name> <value>nameservice</value> </property> <!-- 指定该集群的namenode的机器 --> <property> <name>dfs.ha.namenodes.nameservice</name> <value>master,slave1</value> </property> <!-- master的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.nameservice.master</name> <value>master:8020</value> </property> <!-- master的http通信地址 --> <property> <name>dfs.namenode.http-address.nameservice.master</name> <value>master:50070</value> </property> <!-- slave的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.nameservice.slave1</name> <value>slave1:8020</value> </property> <!-- slave的http通信地址 --> <property> <name>dfs.namenode.http-address.nameservice.slave1</name> <value>slave1:50070</value> </property> <!-- 指定NameNode的元数据edits在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;slave2:8485;slave1:8485/nameservice</value> </property> <!-- 开启NameNode故障时自动切换到另一台NameNode --> <property> <name>dfs.ha.automatic-failover.enabled.nameservice</name> <value>true</value> </property> <!-- 指定该集群出故障时,哪个实现类负责执行故障切换 --> <property> <name>dfs.client.failover.proxy.provider.nameservice</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 一旦需要NameNode切换,使用ssh方式进行操作 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- 如果使用ssh进行故障切换,使用ssh通信时用的密钥存储的位置 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_dsa</value> </property> <!-- connect-timeout连接超时 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/root/data/hadoop/journal</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/root/data/hadoop/hdfs/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/root/data/hadoop/hdfs/datanode</value> </property> <!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 --> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>4.vim mapred-site.xml
<configuration> <!--hadoop对map-reduce运行框架一共提供了3种实现,在mapred-site.xml中通过"mapreduce.framework.name"个属性来设置为"classic"、 "yarn"或者"local"--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!--MapReduce JobHistory Server地址--> <property> <name>mapreduce.jobhistory.address</name> <value>0.0.0.0:10020</value> </property> <!--MapReduce JobHistory Server Web UI地址--> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>0.0.0.0:19888</value> </property> </configuration> 5.vim yarn-site.xml<configuration>
<!-- Site specific YARN configuration properties -->
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property><property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property><!--resourcemanager的地址 -->
<property> <name>yarn.resourcemanager.zk-address</name> <value>slave2:2181,master:2181,slave1:2181</value> </property><!--r启动HA高可用性 -->
<property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!--指定resourcemanager的名字--> <property> <name>yarn.resourcemanager.cluster-id</name> <value>fd</value> </property><!--使用了2个resourcemanager,分别指定Resourcemanager的地址-->
<property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!--自定ResourceManager1的地址--> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>slaver1</value> </property> <!--自定ResourceManager2的地址--> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>slaver2</value> </property> </configuration>6. vim slaves
master slave1 slave27. vim yarn-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_79 #指定日志存放目录 export YARN_LOG_DIR=/root/data/hadoop/log mkdir -pv /root/data/hadoop/tmp; mkdir -pv /root/data/hadoop/journal; mkdir -pv /root/data/hadoop/log; mkdir -pv /root/data/hadoop/hdfs2.启动journalnode(分别在在主机名slave2,master,slave1; 或者在master启动全部)
/usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode jps显示进程 8058 Jps 8012 JournalNode 7794 QuorumPeerMain3.格式化namenode(master,查看日志是否成功)
hdfs namenode -format4.格式化ZKFC(master)
hdfs zkfc -formatZK5.NameNode从master同步到slave1(slave1,或者 scp -r /root/data/hadoop/hdfs root@slave1:/root/data/hadoop/)
hdfs namenode bootstrapstandby(查看是否生成hdfs/namenode 目录) 6.启动NameNode和DataNode start-dfs.sh 8899 NameNode 8581 JournalNode 9305 Jps 7978 QuorumPeerMain 9034 DataNode7.启动ZookeeperFailoverController(master和slave1)
hadoop-daemon.sh start zkfc8.启动yarn(master或者slave1)
start-yarn.shhttp://192.168.19.129:50070/dfshealth.html#tab-overview
http://192.168.19.128:50070/dfshealth.html#tab-overview(一个active,一个standby)
[root@master hadoop]# jps
8293 QuorumPeerMain 66803 DFSZKFailoverController 66408 NameNode 66060 JournalNode 67120 Jps 66534 DataNode[root@slave1 hdfs]# jps
63317 DFSZKFailoverController 62838 JournalNode 63167 DataNode 63074 NameNode 7988 QuorumPeerMain 63537 Jps[root@slave2 data]# jps
58483 Jps 7794 QuorumPeerMain 58192 JournalNode 58303 DataNodehive2.1.0安装
#(hive历史版本) http://archive.apache.org/dist/hive/ (hbase 兼容) http://hbase.apache.org/book.html#hive mysql> create user 'hive'@'%' identified by 'hive';//创建用户名和密码mysql> GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%' WITH GRANT OPTION;//赋予hive用户所有权限,'%'表示任何地址都可以通过hive用户连接mysql,如果你想限制可以加入你的ip
mysql> flush privileges;//刷新权限列表 mysql> create database hive;//创建数据库 mysql> show grants for hive;//查看用户权限 #重启mysql服务 service mysqld restart;#apache-hive-2.1.0-bin
export HIVE_HOME=/usr/local/hive export PATH=$HIVE_HOME/bin:$PATH#在hdfs上创建hive存储数据的相关目录
hdfs dfs -mkdir -p /user/hive/warehouse hdfs dfs -mkdir -p /user/hive/log#修改hive-site.xml文件
vim hive-site.xml<configuration>
<property> <name>hive.metastore.warehouse.dir</name> <!--对应以上在hdfs创建的文件目录--> <value>/usr/hive/warehouse</value> <description>location of default database for the warehouse</description> </property> <property> <name>hive.metastore.local</name> <value>true</value> <description>Use false if a production metastore server is used</description> </property> <property> <name>hive.exec.scratchdir</name> <value>/root/data/hive/tmp</value> <description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/<username> is created, with ${hive.scratch.dir.permission}.</description> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <!--mysql的链接地址,这里的hivedb是我已经在mysql中创建的数据库,如果不写就是default--> <value>jdbc:mysql://192.168.19.130:3306/hive?createDatabaseIfNoExist=true</value> <description> Roy JDBC connect string for a JDBC metastore. To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL. For example, jdbc:postgresql://myhost/db?ssl=true for postgres database. </description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <!--mysql的驱动--> <value>com.mysql.jdbc.Driver</value> <description>User-Defined(Roy) Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <!--链接mysql的用户名--> <value>hive</value> <description>User-defined(Roy)Username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <!--链接mysql的密码--> <value>hive</value> <description>User-defined(Roy)password to use against metastore database</description> </property> <property> <name>hive.metastore.uris</name> <value>thrift://192.168.19.130:9083</value> <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description> </property> <property> <name>hive.querylog.location</name> <value>/root/data/hive/tmp</value> <description>Location of Hive run time structured log file</description> </property> </configuration>//hive的日志文件 cp hive-log4j2.properties.template hive-log4j2.properties cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties #hive初始化(保证hadoop集群已经启动) schematool -dbType mysql -initSchema
#启动hive服务
hive --service metastore#打开一个终端 输入
hivehbase1.2.1安装
1.下载安装包
http://archive.apache.org/dist/hbase/ 解包 tar -zxvf hbase-1.2.1.tar.gz rm -rf hbase-1.2.1.tar.gz #重命名 mv hbase-1.2.1 hbase 2.配置环境变量 vim /etc/profile #hbase-1.2.1 export HBASE_HOME=/usr/local/hbase export HBASE_BIN=/usr/local/hbase/bin export PATH=$PATH:$HBASE_HOME/bin export CLASSPATH=$CLASSPATH:$HBASE_HOME/lib #使环境变量生效 source /etc/profile3.修改配置文件
vim conf/hbase-env.sh export JAVA_HOME=/usr/java/jdk1.7.0_79 export HBASE_CLASSPATH=/usr/local/hadoop/conf export HBASE_PID_DIR=/root/data/hbase/pids export HBASE_MANAGES_ZK=falsehbase-site.xml
<property> <name>hbase.rootdir</name> <value>hdfs://nameservice:8020/user/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.master</name> <value>hdfs://nameservice:60000</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>master,slave1,slave2</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/root/data/hbase/data</value> </property> <property> <name>hbase.tmp.dir</name> <value>/root/data/hbase/tmp</value> </property>vim conf/regionservers
master slave1 slave2scp -r hbase root@slave1:/usr/local/
scp -r hbase root@slave2:/usr/local/4.启动
start-hbase.sh[root@master local]# jps
8293 QuorumPeerMain 73399 HMaster 73744 Jps 66803 DFSZKFailoverController 66408 NameNode 66060 JournalNode 73527 HRegionServer 66534 DataNodevim /etc/hosts
192.168.19.128 master nameservice 192.168.19.129 slave1 nameservice 192.168.19.130 slave2nameservice:16030
hive 和hbase 整合
<property>
<name>hive.aux.jars.path</name> <value> $HIVE_HOME/lib/hive-hbase-handler-2.1.0.jar, $HIVE_HOME/lib/hbase-client-1.1.1.jar, $HIVE_HOME/lib/zookeeper-3.4.6.jar, $HIVE_HOME/lib/guava-14.0.1.jar </value> </property>hive --auxpath $HIVE_HOME/lib/hive-hbase-handler-2.1.0.jar,$HIVE_HOME/lib/hbase-client-1.1.1.jar,$HIVE_HOME/lib/zookeeper-3.4.6.jar,$HIVE_HOME/lib/guava-14.0.1.jar --hiveconf hbase.zookeeper.quorum=master:2181,slave1:2181,slave2:2181
四。spark1.6.0 HA
cd /root/spark/conf
spark-env.sh.template spark-env.sh vim spark-env.shHADOOP_HOME=/home/hadoop/hadoop
HADOOP_CONF_DIR=/home/hadoop/hadoop/etc/hadoop/ SPARK_HOME=/root/spark export SPARK_WORKER_DIR=/root/spark/master export SCALA_HOME=/usr/local/scala/scala-2.11.8 export JAVA_HOME=/usr/local/java/jdk1.8.0_111 #export SPARK_MASTER_IP=pmaster export SPARK_WORKER_MEMORY=10g export SPARK_MASTER_WEBUI_PORT=8888 #export MASTER=spark://pmaster:7077 export SPARK_CLASSPATH=$SPARK_CLASSPATH:/root/spark/lib/*:/root/tanjiong/libs/*#该参数决定了yarn集群中,最多能够同时启动的EXECUTOR的实例个数。
SPARK_EXECUTOR_INSTANCES=3 #设置每个EXECUTOR能够使用的CPU core的数量。 SPARK_EXECUTOR_CORES=7 #该参数设置的是每个EXECUTOR分配的内存的数量 SPARK_EXECUTOR_MEMORY=8G #该参数设置的是DRIVER分配的内存的大小 SPARK_DRIVER_MEMORY=8G #Spark Application在Yarn中的名字 SPARK_YARN_APP_NAME=”beige.Spark-1.6.0″ #指定在yarn中执行,提交方式为client MASTER=yarn-cluster #Standalone模式HA export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hmaster:2181,slave2:2181,slave4:2181 -Dspark.deploy.zookeeper.dir=/spark" vim spark-default.conf#如果没有适合当前本地性要求的任务可供运行,将跑得慢的任务在空闲计算资源上再度调度的行为,这个参数会引发一些tmp文件被删除的问题,一般设置为false
spark.speculation false #如果设置为true,用jdbc方式连接,显示的会是乱码 spark.sql.hive.convertMetastoreParquet false #应用程序上载到HDFS的复制份数 spark.yarn.submit.file.replication 2 #Spark application master给YARN ResourceManager 发送心跳的时间间隔(ms) spark.yarn.scheduler.heartbeat.interal-ms 5000 #仅适用于HashShuffleMananger的实现,同样是为了解决生成过多文件的问题,采用的方式是在不同批次运行的Map任务之间重用Shuffle输出文件,也就是说合并的是不同批次的Map任务的输出数据,但是每个Map任务所需要的文件还是取决于Reduce分区的数量,因此,它并不减少同时打开的输出文件的数量,因此对内存使用量的减少并没有帮助。只是HashShuffleManager里的一个折中的解决方案。 spark.shuffle.consolidateFiles true #用来调整cache所占用的内存大小。默认为0.6。如果频繁发生Full GC,可以考虑降低这个比值,这样RDD Cache可用的内存空间减少(剩下的部分Cache数据就需要通过Disk Store写到磁盘上了),会带来一定的性能损失,但是腾出更多的内存空间用于执行任务,减少Full GC发生的次数,反而可能改善程序运行的整体性能。这要看你的具体业务逻辑,是cache的多还是计算的多。 spark.storage.memoryFraction 0.3 #一个partition对应着一个task,如果数据量过大,可以调整次参数来减少每个task所需消耗的内存. spark.sql.shuffle.partitions 800 #Spark SQL在每次执行次,先把SQL查询编译JAVA字节码。针对执行时间长的SQL查询或频繁执行的SQL查询,此配置能加快查询速度,因为它产生特殊的字节码去执行。但是针对很短的查询,可能会增加开销,因为它必须先编译每一个查询 spark.sql.codegen true #我们都知道shuffle默认情况下的文件数据为map tasks * reduce tasks,通过设置其为true,可以使spark合并shuffle的中间文件为reduce的tasks数目。 spark.shuffle.consolidateFiles true cp slaves.template slavesvim slaves
hmaster slave1 slave2 slave3 slave4环境变量配置
#spark-1.6.0-bin-hadoop2.6 export SPARK_HOME=/root/spark export SPARK_SBIN=/root/spark/sbin export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$SCALA_HOME/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH