Hadoop学习笔记01_Hadoop搭建
想往大数据方向转, 难度肯定是有的。
基础知识肯定是要有的,如果是熟悉JAVA开发的人,转向应该优势大。
像我这样的,只有Linux基础以及简单的PHP基础的人,转向难度很大。但是事在人为,努力学习多加练习,寻找机会应该可以的。
以下是学习笔记,自己的笔记自己看懂,所以尽量简短 :
T440P上装了Vm12, 添加三台Centos6.5 各1G内存,按照下方的笔记内容设置网络和环境。
前面部分的都是centos的基本操作。涉及vim, 以及一些Linux命令。
设置时间、主机名、IP、关闭防火墙,开启互信,安装JDK,添加环境变量等。
三台机器:master, slave1, slave2
############# vim ########################################### 命令模式下: 1)把光标移动到要复制的行上,按yy (复制当前行) 2)把光标移动到要复制的位置 ,按p (粘贴到指定行) 3)把光标移动到要复制的位置 ,按dd(删除当前行) 移动光标: hjkl 左下上右 ctrl+u:到文件头 ctrl+d:到文件尾 shift+h:到屏幕第一行,shift+m:到屏幕中间,shift+l:到最后一行, shift+zz 保存退出 :n 到第n 行 ^ 到行首,$ 到行尾 (这两个与正则一样) 查找: /xx 查找xx n下一个,N上一个 撤销更改:u:取消更改 插入:a从光标后,i从光标前,o从光标下一行 ##配置文件 vim /etc/vimrc set nu # 行号 set ts=4 # tab距离4空格 set et # tab转换为真正的空格 # modeline 相当于文件格式配置 # vim:et:ts=4:sw=4: ############# vim end ######################################### pwd ls -al cat 1.txt | sort -k1 -nr #显示文件,k1第一列,n转换成数字 r降序 > 1.txt # 清空文件内容 tail -F 1.txt #追踪某文件的内容. kill -s 9 1827 #强杀进程 date -s "2018-01-01 14:22:33" # 修改时间 参数后面加字符串
clock -w # 写入硬件时钟 date -R #显示时区 tzselect #时区向导 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #修改时区
yum install ntp # 安装ntp服务
ntpdate pool.ntp.org # ntp对时
chkconfig ntpd on
/etc/init.d/ntpd start
clock -w # 写入硬件时钟
vim /etc/rc.local #可设置开机启动项目 #例如,在最后加上 /etc/init.d/mysqld start则可以启动mysqld # mongodb的启动命令 /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/dblogs --fork ############################### user ############################### useradd test passwd test vim /etc/sudoers # 为新用户添加sudo权限. 这样test用户才可以使用sudo test ALL=(ALL) ALL userdel -r test vim /etc/passwd #可以查看系统中的所有用户 root:x:0:0:root:/root:/bin/bash # 用户名:密码x:用户id0:组id0:描述信息root:用户根目录/root/:用户登录后的shell # x 是表示此处为空;采用shadow passwd,影子密码在 /etc/shadow 文件 ############################ network ############################### vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" BOOTPROTO="static" HWADDR="00:0C:29:F5:05:8E" NM_CONTROLLED="yes" ONBOOT="yes" TYPE="Ethernet" IPADDR=192.168.112.10 NETMASK=255.255.255.0 GATEWAY=192.168.112.2 DNS1=192.168.112.2 ##可删除HWADDR,UUID service network restart ##网卡更换后,可编辑 vim /etc/udev/rules.d/70-persistent-net.rules reboot ifconfig curl www.baidu.com netstat #网络端口监听 -a显示所有选项, -t仅显示TCP, -u仅显示UDP, -l仅列出有监听的. netstat -nltp #修改hosts和主机名 # 修改/etc/hosts 以及/etc/sysconfig/network 文件, 分别设置不同的HOSTNAME vim /etc/hosts 192.168.112.10 master 192.168.112.11 slave1 192.168.112.12 slave2 hostname master vim /etc/sysconfig/network HOSTNAME=master ### 每台都要 关闭下列防火墙 service iptables stop setenforce 0 chkconfig iptables off ################################# crontab ################################# # crontab: crontab -l #查看当前用户的crontab内容. crontab -r #删除定时任务配置,如果不指定用户,则删除当前用户的. crontab -e #编辑某个用户的crontab内容. #crontab格式 #分 时 日 月 周 命令 0 0 * * * /shell/upFile2HDFS.sh #每天0点执行一次 */1 * * * * date >> /test/date.txt #每分钟将时间写入文件 30 21 * * * /usr/local/etc/rc.d/httpd restart #每天21:30执行一次命令 0,30 18-23 * * 6,0 /usr/local/etc/rc.d/httpd restart #每个周六,周日的18点到23点,每隔30分钟 ################################# 建立每台电脑的互信关系 ################################# ssh-keygen #创建.ssh目录 ssh-copy-id slave1 #复制公钥到每台目标主机 ssh root@slave1 ##或者 ssh root@slave2 都能成功,不用密码,则互信成功. ################################# JDK ################################# rpm -qa | grep java #先查看自带java 如果有就卸载 rpm -e --nodeps java-1.4.2-gcj-compat-1.4.2.0-40jpp.115 #卸载 rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5 #卸载 #或者yum -y remove 卸载 yum -y remove java-1.4.2-gcj-compat # # 使用挂载方式或sftp上传java到主机 # secureCRT中alt+p可开启sftp. 或者安装lrzsz yum -y install lrzsz #安装后,rz上传,sz下载 cd /mnt/hgfs cp -R share_folder /usr/local/src cd /usr/local/src ./jdk-6u45-linux-x64.bin # 如果是tar包, 就tar -zxvf jdk-8u161-linux-x64.tar.gz
# 推荐使用此种方式 cd /usr/local/src/jdk1.8.0_161 # 修改用户下面的 .bash_profile文件,也可以用root用户修改/etc/profile文件 vim /etc/profile ... export JAVA_HOME=/usr/local/src/jdk1.8.0_161 export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar source /etc/profile #重新加载这个配置文件 which java
java -version
# 如果要使用 sudo java -version 则需要 sudo visudo ,然后在 secure_path 后面添加 :/opt/jdk1.8.0_161/bin scp -rp /etc/profile slave1:/usr/local/src scp -rp /etc/profile slave2:/usr/local/src
######################## hadoop ################################# #前提:主机名/hosts/时间同步/JDK/关闭防火墙/互信 cd /usr/local/src tar -zxvf hadoop-2.7.5.tar.gz cd hadoop-2.7.5 mkdir tmp #创建hadoop运行时所需的临时目录 /usr/local/src/hadoop-2.7.5/tmp cd etc/hadoop vim hadoop-env.sh export JAVA_HOME=/usr/local/src/jdk1.8.0_161 vim core-site.xml <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/src/hadoop-2.7.5/tmp</value> </property> <!-- property> <name>io.file.buffer.size</name> (用作序列化文件处理时读写buffer的大小) <value>131702</value> </property --> vim hdfs-site.xml <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>slave1:50090</value> </property> vim mapred-site.xml <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!--历史服务器,查看Mapreduce作业记录--> <!-- <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property> --> <!-- 连接jobtrack服务器的配置项,默认不写是local --> <!-- <property> <name>mapred.job.tracker</name> <value>http://cy-hmaster-01:9001</value> </property> --> vim yarn-site.xml <!-- 指定YARN的老大 --> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property> <!-- NodeManager上运行的附属服务.需配置成mapreduce_shuffle 才可运行MapReduce程序默认值 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> vim slaves master slave1 slave2 #写上各个主机名 ## 再次编辑profile vim /etc/profile #增加如下两行 export HADOOP_HOME=/usr/local/src/hadoop-2.7.5 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin :wq ls -rlt #修改了6个配置文件
#### 注意: 配置文件如果写了中文,一定要注意编码问题。最好不出现中文。 # -site.xml文件优先于default.xml生效 # 全部复制到其它机器 scp -r hadoop-2.7.5/ root@slave1:/usr/local/src scp -r hadoop-2.7.5/ root@slave2:/usr/local/src scp -r /etc/profile root@slave1:/etc/ scp -r /etc/profile root@slave2:/etc/ source /etc/profile ###################### hadoop 启动 ########################### hdfs namenode -format # HDFS 初始格式化, 只能进行一次. start-dfs.sh # 启动HDFS start-yarn.sh # 启动YARN sbin/start-all.sh #启动所有 旧版本使用 jps #查看NameNode 和 DataNode 如果有则正常. ###################### hadoop 操作 ########################### http://master:50070 # Web界面 在NameNode上 http://master:8088 # 在ResourceManager上 hdfs dfs -ls -h / #查看文件列表 -h表示使用人性化方式显示文件大小 hdfs dfs -mkdir /hello #创建目录 -p表示如果没有父目录,就一起创建。 hdfs dfs -put -f /etc/passwd / #上传文件 -f 覆盖已存在的. hdfs dfs -appendToFile 2.txt /1.txt #把2的文件内容附加到1里 . hdfs dfs -get /hello ./ #下载文件到本地系统当前目录 -crc 加上校验。 hdfs dfs -getmerge /hello/log.* ./ #合并下载多个文件到本地系统当前目录。 hdfs dfs -cat /passwd #显示文件 hdfs dfs -tail /passwd #显示文件最后1千字符 hdfs dfs -rm -r /aaa/bbb/ #只删除空目录和文件, -r则递归删除. hdfs dfs -df -h / #统计文件系统的可用空间. hdfs dfs -du /hello #显示目录中所有文件大小. hdfs dfs -setrep -w 3 -R /user # 改变一个文件的副本系数. -R用于递归改变目录下的所有文件副本系数. hdfs dfsadmin -report #查看报告 cd /usr/local/src/hadoop-2.7.5/share/hadoop/mapreduce hadoop jar hadoop-mapreduce-examples-2.7.5.jar pi 20 50 #运行一个示例mapreduce # hadoop程序建议使用hadoop开头的命令, hdfs操作建议使用hdfs开头. 两种命令要有所区分 hadoop fs -ls hdfs://master:9000/ hadoop fs -ls / hadoop fs -ls file:///root # yarn yarn rmadmin –getServiceState rm1 #查看状态的命令 yarn rmadmin –transitionToStandby rm1 #状态切换的命令 ####################### HDFS 原理 ############################################# NameNode是HDFS的核心,称为Master, NameNode仅存储HDFS的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件. NameNode不存储实际数据或数据集,数据本身存储在DataNode中, NameNode知道HDFS中任何给定文件的块列表及其位置,使用此信息NN知道如何从块中构建文件. NN并不持久化存储每个文件中各个块所在DN的位置信息,这些信息会在系统启动时从数据节点重建 NN对于HDFS至关重要,当NN关闭时,hadoop集群无法访问. NN是Hadoop集群中的单点故障. NN所在机器通常会配置大量内存RAM. DN启动时,将自己发布到NN并汇报自己负责持有的块列表. 当某个DN关闭时,它不会影响数据或集群的可用性,NN将安排其它DN管理的块进行副本复制. DN所在机器通常配置大量硬盘空间.因为实际数据存储在DN中, DN会定期(dfs.heartbeat.interval配置项,默认3秒)向NN发送心跳,如果NN长时间没有收到DN发送的心跳,NN就会认为该DN失效. block汇报时间间隔取参数dfs.blockreport.intervalMsec 参数未配置的话默认为6小时. ##################################### HDFS工作机制 ############################# Secondary NameNode 协助NN进行元数据的备份. 可以理解为NN的秘书 客户端请求访问HDFS都是通过向NN申请来进行.
补充: 单机伪分布式
########################### 以下是补充的单机和伪分布的知识########################### # hostname 不能使用带下划线的 # 第二节:Hadoop的本地模式 1、特点:不具备HDFS,只能测试MapReduce程序 2、修改hadoop-env.sh 修改大约第25行:export JAVA_HOME=/usr/local/src/jdk1.8.0_161 3、演示Demo: $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar 命令:hadoop jar hadoop-mapreduce-examples-2.4.1.jar wordcount /root/data/input/data.txt /root/data/output/wc 日志:17/08/04 23:28:38 INFO mapreduce.Job: map 100% reduce 100% 注意:MR有一个默认的排序规则 第三节:Hadoop的伪分布模式 1、特点:具备Hadoop的所有功能,在单机上模拟一个分布式的环境 (1)HDFS:主:NameNode,数据节点:DataNode (2)Yarn:容器,运行MapReduce程序 主节点:ResourceManager 从节点:NodeManager 2、步骤: # 注意:hostname 不能使用带下划线的,修改以下5个文件的配置即可 (1)hdfs-site.xml <!--配置HDFS的冗余度--> <property> <name>dfs.replication</name> <value>1</value> </property> <!--配置是否检查权限--> <property> <name>dfs.permissions</name> <value>false</value> </property> <!-- 也可以指定HDFS块大小 --> <property> <name>dfs.blocksize</name> <value>32m</value> </property> (2)core-site.xml <!--配置HDFS的NameNode--> <property> <name>fs.defaultFS</name> <value>hdfs://192.168.88.11:9000</value> </property> <!--配置DataNode保存数据的位置--> <property> <name>hadoop.tmp.dir</name> <value>/root/training/hadoop-2.4.1/tmp</value> </property> (3) mapred-site.xml <!--配置MR运行的框架--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> (4) yarn-site.xml <!--配置ResourceManager的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>192.168.88.11</value> </property> <!--配置NodeManager执行任务的方式--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> (5) slaves # 只放一个本机hostname 即可,或者 localhost (6) 格式化NameNode hdfs namenode -format 日志:Storage directory /root/training/hadoop-2.4.1/tmp/dfs/name has been successfully formatted. (7) 启动:start-all.sh (*) HDFS: 存储数据 (*) Yarn:执行计算 检查以下进程是否启动: SecondaryNameNode ResourceManager NodeManager DataNode NameNode (8) 访问:(*)命令行 (*)Java API (*)Web Console: HDFS:http://192.168.88.11:50070 Yarn:http://192.168.88.11:8088 ###########################################################################################