Linux常用操作
cd 目录路径 进入目录
cp 文件路径/文件名 目的路径/新文件名 复制
mv 文件路径/文件名 目的路径/新文件名 剪切
ls 显示当前文件/文件夹列表
history 显示历史输入命令
上下 重新输入历史命令
pwd 显示当前文件位置
echo 打印输出
vi/vim 文本编辑器
mkdir 创建目录
find 搜索目录
tar 解压
whereis 查找文件
grep 文本搜索
vi/vim常用命令
esc 退出编辑模式,进入命令模式
hjkl 方向键h左j下k上l右
i 进入编辑模式
a 下一个字符输入
A 本行末输入
G 移动到文本末
gg 移动到文本头
nG 移动到第n行
x del
dd 剪切一行,前面可以加数字,向下数
yy 复制一行,前面可加数字,向下数
p 粘贴
/ 搜索,n下一个N上一个
: 命令模式,可输入shell命令
o 下一行插入
O 上一行插入
ZZ 保存退出
ZQ 不保存退出
基础环境配置
虚拟机安装
新建虚拟机
自定义
稍后安装操作系统
Linux,centos7 64位
名称,位置,名称可设为master,slave1,slave2
不要太高,相乘不要高于2,觉得电脑配置高的随意
不要太高,同上,推荐即可
暂时使用net模式
前面没写的按推荐来,此处选择创建新虚拟磁盘
将虚拟磁盘拆分成多个文件,以减小空间占用
后续默认完成即可
、
选择CD/DVD
使用ISO镜像,选浏览,找到镜像文件保存,开启虚拟机
上下加回车选择第一个或第二个,区别在于第二个会检查一下,我的镜像没问题可以直接选择第一个
按回车或等
选择中文,简体中文,继续
软件选择最小安装,安装位置点一下然后进去完成开始安装
设置root密码
尽量简单,别忘,我选择设置123123完成
等待配置完成
重启
进入系统
用户名填写root
密码填写自己设置的
网络配置
网卡配置
检查是否开启网卡:ip addr或ifconfig
说明:若ifconfig无法使用,则使用yum命令安装net-tools网络工具包,
yum install -y net-tools
开启网卡:进入目录/etc/sysconfig/network-scripts
编辑ifcfg-ens33网卡配置
设置成为开机自启动ONBOOT=yes
改为静态IP(可选):
BOOTPROTO="static" # 使用静态IP地址,默认为dhcp 动态IP地址
IPADDR= # 设置的静态IP地址
NETMASK= # 子网掩码
GATEWAY= # 网关地址
VMware查看网关地址
service network restart重启网卡
查看网卡状态
说明:centos7安装完成后 网卡默认为关闭状态,需手动开启,并设置为开机自启动模式,为防止使用DHCP自动获取IP地址功能改变已定IP,造成未来不必要的更改hosts或连接器,将其修改为静态IP,IP设置规则,网关也就是暂且认为是前三个数需要一样,最后一个数尽量使用4-253,防止IP冲突,误用了网关IP或广播地址
修改主机名:
hostnamectl set-hostname master(在master中执行)
bash(暂且当作是立即执行)
hostnamectl set-hostname slave1(在slave1中执行)
.。。。。。。。
说明:修改主机名目的是让自己能够更方便的看出此时的bash为哪个主机,将来ssh免密设置完成后可以使用免密登录用一台机子控制三台机子
配置hosts文件
将三台虚拟机的IP地址记录
vi /etc/hosts(三台都要修改这个文件)
在文本末尾输入各节点相应IP
例: master
slave1
slave2
三个节点中的hosts文件为
尝试是否能够相互ping通
说明:将hosts配置好之后,未来输入三台机器的host的时候不需要填写IP地址,仅需要填写master,slave1,slave2之类
配置yum源
检测yum源是否可用:yum install -y wget
检测是否安装wget:wget
进入yum源配置文件:cd /etc/yum.repos.d
将原镜像备份:mv CentOS-Base.rpeo CentOS-Base.repo.bak
下载yum源:wget yum源地址
清除yum缓存:yum clean all
生成缓存:yum makecache
说明:若是可以使用本地已配置和的yum源,则无需修改,若是无网络状态,可以配置本地yum源,方法在网上也可以搜到
使用连接工具连接虚拟机
工具:xshell或MX等
关闭防火墙
关闭防火墙命令 systemctl stop firewalld
检查防火墙状态 systemctl status firewalld
防火墙开启状态
防火墙关闭状态
时间同步
使用date命令查看时间是否一致
不一致,需要使用ntp时间同步
选择时区
tzselect
2.配置ntp服务器
使用yum下载ntp服务
yum install -y ntp
以master作为ntp服务器,修改配置文件(只在master中执行)
在末尾添加
server 127.127.1.0
fudge 127.127.1.0 stratum
重启ntp服务:systemctl restart ntpd.service
其他机器进行同步
ntpdate master
说明:zookeeper是使用时间作为标准的心跳机制,若是不同步,有可能zookeeper会认为此计算机已宕机
配置ssh免密
在master上生成公私密钥
ssh-keygen 生成密钥工具 -t dsa生成指定密钥类型为dsa,默认为rsa -f存放位置 -P指定私钥密码‘’中为密码,默认为空,写的也是空
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa注意不要输错注意是dsa P是大写 后面空格加两个单引号
将公钥追写入authorized_keys文件中,使用公钥
cat id_dsa.pub >> authorized_keys
ssh master(内回环)
将公钥分发到slave1和slave2
slave1和slave2进入.ssh目录,将master的公钥拷贝过来,追写入authorized_keys
(slave1,slave2)cd .ssh/
scp master:~/.ssh/id_dsa.pub ./master_dsa.pub
cat master_dsa.pub >> authorized_keys
在master中测试ssh免密登录
ssh slave1
输入yes(仅第一次)
退出slave1 :exit
说明:zookeeper,Hadoop,hbase等都需要同时访问和修改不同节点数据,所以免密和防火墙是必要的,ssh免密登录是一种非对称性加密技术,需要公钥和私钥,将公钥分发给需要访问的节点,他们就有钥匙可以进入
安装jdk
使用xftp将文件拷贝到master中
将软件安装在/usr/目录下
cd /usr
新建文件夹命名为java:
mkdir java
进入java文件夹
cd java
tar -zxvf java压缩包文件路径
修改环境变量
vim /etc/profile
export JAVA_HOME=java文件夹位置
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib/
将环境变量生效:
source /etc/profile
检查java是否配置成功:java -version
将java和profile文件发送到slave1和slave2中
scp -r /usr/java root@slave1:/usr/
-r可以理解为复制文件夹
将profile复制过去之后都需要source一下才可以生效
说明:Hadoop是基于Java写的,所以他需要jdk的环境来运行
zookeeper安装与配置
在/usr目录下创建zookeeper文件夹
cd /usr
mkdir zookeeper
解压zookeeper压缩文件
tar -zxvf /……/zookeeper…….gz
在zookeeper的文件夹中船舰zkdata文件夹和zkdatalog文件夹
cd zookp……
mkdir zkdata
mkdir zkdatalog
进入conf文件夹中修改配置文件
cd conf/
将示例配置文件复制并重命名为要使用配置文件,zookeeper在启动时会找到这个文件作为默认配置文件
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改dataDir
添加dataLogDir
添加server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
(这里可以使用yy p复制粘贴)
在zkdata中创建myid文件,内容为本机id表示自己是几号服务器
例:master内容为1,slave1内容为2
vi ../zkdata/myid
1
修改环境变量
vim /etc/profile
export ZOOKEEPER_HOME=地址
export PATH=$PATH:ZOOKEEPER_HOME/bin
source /etc/profile
拷贝到另外两台虚拟机
cd /usr/
scp ./java slave1:/usr/
scp ./java slave2:/usr/
scp ./zookeeper slave1:/usr/
scp ./zookeeper slave2:/usr/
scp /etc/profile slave1:/etc/
scp /etc/profile slave2:/etc/
进入slave1slave2 source一下profile
开启zookeeper
zkServer.sh start
zkServer.sh status(三台机器)
检查:一台leader,其余为flower
错误可能:
1:防火墙,
2,zoo.cfg配置出错
3,myid未配置成功
安装配置Hadoop
检查hosts文件
检查三台虚拟机hosts文件是否已经配置正确
安装Hadoop
在/usr目录下创建hadoop文件夹
cd /usr
mkdir hadoop
配置Hadoop文件
hadoop-env.sh common组件
core-site.xml hdfs组件
mapred-site.xml mapreduce组件
yarn-site.xml yarn组件
cd /usr/hadoop/hadoop-2.7.3/etc/hadoop
在hadoop-env.sh 文件中配置javahome
hadoop-env.sh
配置JAVA_HOME
说明:Hadoop是使用Java编写的软件,需要将Java的环境告诉Hadoop
编写core-site.xml配置文件
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop/hadoop-2.7.3/hdfs/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>fs.checkpoint.period</name>
<value>60</value>
</property>
<property>
<name>fs.checkpoint.size</name>
<value>67108864</value>
</property>
</configuration>
(标签成对出现 4yy p命令)
yarn-site.xml
<property>
<name>yarn.resourcemanager.address</name>
<value>master:18040</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:18030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:18088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:18025</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:18141</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
使用vim命令编写slaves文件
slave1
slave2
使用vim命令编写master文件
master
hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/hadoop/hadoop-2.7.3/hdfs/name</value>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/hadoop/hadoop-2.7.3/hdfs/data</value>
<final>true</final>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
cp mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
4.配置环境变量
HOME
CLASSPATH
PATH
source
4.分发Hadoop profile
scp -r /usr/hadoop root@slave1:/usr/
scp -r /usr/hadoop root@slave2:/usr/
scp -r /etc/prefile root@slave1:/etc/
scp -r /etc/prefile root@slave2:/etc/
5.source /etc/prefile(三台)
6.格式化Hadoop
hadoop namenode -format仅在master中执行
出现status 0 则为成功
7. /usr/hadoop/hadoop-2.7.3/sbin/start-all.sh
8.jps
安装hbase
同样进行目录的创建,压缩包的解压
mkdir -p /usr/hbase
cd /usr/hbase
tar -zxvf
进入conf目录
修改hbase-evn.sh
第二十七行修改javahome,并将注释取消
第三十行修改hbase_classpath,将Hadoop中etc/hadoop目录写进去
128行将注释取消,true改为false
注解:这里将true改为false是因为一个hbase需要一个zookeeper集群,默认情况下hbase会使用自带的zookeeper集群,而我们需要让他使用我们给的zookeeper集群优化配置提高效率,这里默认的true的作用是让hbase启动同时也启动zookeeper,而我们采用独立运行zookeeper的方式所以将其改为false。
编写hbase-site.xml
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>hdfs://master:6000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/zookeeper/zookeeper-3.4.10/</value>
</property>
编写regionservers
将localhost修改为slave1和slave2
修改环境变量
分发到slave1slave2
start-hbase.sh在master中执行
安装hive
slave2上安装MySQL作为数据端
slave1作为服务器端
master作为客户端
- 安装mysql
wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
yum localinstall -y mysql57-community-release-el7-7.noarch.rpm
yum install -y mysql-community-server
重载所有修改过的配置文件:systemctl daemon-reload
开启服务systemctl start mysqld
设置开机自启systemctl enable mysqld
安装完成后MySQL会在/var/log/mysqld.log中自动生成一个随机密码
记住这个密码用来登录MySQL数据库
grep “temporary password” /var/log/mysqld.log查看带有密码的一行
使用mysql -uroot -p 登录MySQL
设置密码安全策略
设置密码强度为低级set global validate_password_policy=0;
设置密码最低长度:set global validate_password_length=4;
修改本地密码alter user 'root'@'localhost' identified by '123123'
退出 \q
密码强度分级 0为low,只限制长度,最低为4,设置123则变为4
1为默认,长度为8,且必须含有数字大小写,特殊字符
2为strong,需包括字典文件
远程登录设置
创建用户create user 'root'@'%' identified by '123123';
允许远程连接grant all privileges on *.* to 'root'@'%' with grant option;
刷新权限flush privileges;
slave1作为服务器端,安装hive
master中解压hive并传输给slave1
更改环境变量(master和slave1都执行)
解决版本冲突和jar包依赖问题
复制hive中的jline.jar包到Hadoop中lib位置(master中执行)cp /usr/hive/apache-hive-2.1.1-bin/lib/jline-2.12.jar /usr/hadoop/hadoop-2.7.3/share/hadoop/yarn/lib/
将MySQL的依赖包放在slave1中hive的lib目录下
scp /tools/mysql-connector-java-5.1.47-bin.jar root@slave1:/usr/hive/apache-hive-2.1.1-bin/lib/
回到slave1中,进入hive的conf目录
cd $HIVE_HOME/conf
修改并重命名hive-env.sh
更改Hadoophome
创建并修改hive-site.xml可以从hive-default.xml中找
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://slave2:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123123</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
</configuration>
将master作为客户机
修改并重命名hive-env.sh
更改48行Hadoophome
创建并修改hive-site.xml
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/usr/hive_remote/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://slave1:9083</value>
</property>
</configuration>
启动hiveserver服务(slave1)
hive --service metastore
hive
此时master的进程如下
scala
在usr下创建scala目录
进入scala目录
将Scala解压到scala目录
配置环境变量
分发scala
spark
在usr下创建spark目录
进入spark目录
将spark解压到spark目录
配置环境变量
进入spark的conf目录
将spark-env.sh.template改名或拷贝一份将.template后缀删除
编辑spark-env.sh并在末尾添加
export JAVA_HOME= #Java环境变量
export SCALA_HOME= #SCALA环境变量
export SPARK_WORKING_MEMORY=1g #每一个worker节点上可用的最大内存
export SPARK_MASTER_IP=master #驱动器节点IP
export HADOOP_HOME= #Hadoop路径
export HADOOP_CONF_DIR= #Hadoop配置也就是hadoop中的/etc/hadoop目录
export SPARK_CLASSPATH= #配置mysql驱动目录,也就是软件包中jar包的位置
将slaves改名或拷贝一份将.template后缀删除
编辑并在最后一行删除localhost,添加slave1和slave2
连接hive
将hive的conf目录下的hive-site.xml复制到spark的conf目录下
分发spark
进入spark的sbin目录
./start-all.sh启动spark
spark-shell进入scala命令模式
爬虫
使用requests,BeautifulSoup等库
requests.get(url)返回值为requests对象,tostring方法为状态码
requests.get(url).text为网页源代码
使用bs4将网页源代码做成一锅美味汤,也就是bs对象
bs = BeautifulSoup(html,”html.parser”) #此处的html.parser是解析方式,执行速度适中,文档容错能力强,lxml速度块,文档容错能力强但需安装c语言库,xml唯一支持xml的解析器,需安装c语言库,html5lib生成h5格式文档,容错性最好,速度慢
#基本用法
from bs4 import BeautifulSoup
bs = BeautifulSoup(html,"html.parser") # 缩进格式
print(bs.prettify())
print(bs.prettify()) # 格式化html结构
print(bs.title) # 获取title标签的名称
print(bs.title.name) # 获取title的name
print(bs.title.string) # 获取head标签的所有内容
print(bs.head)
print(bs.div) # 获取第一个div标签中的所有内容
print(bs.div["id"]) # 获取第一个div标签的id的值
print(bs.a)
print(bs.find_all("a")) # 获取所有的a标签
print(bs.find(id="u1")) # 获取id="u1"
for item in bs.find_all("a"):
print(item.get("href")) # 获取所有的a标签,并遍历打印a标签中的href的值
for item in bs.find_all("a"):
print(item.get_text())
#选择元素
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.title)
print(type(soup.title))
print(soup.head)
print(soup.p)
#获取名称
print(soup.title.name)
print(soup.p.attrs['name'])
print(soup.p['name'])
#获取内容
print(soup.p.string)
#获取子孙节点
print(soup.p.children)
for i, child in enumerate(soup.p.children):
print(i, child)
#通过标签
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all('ul'))
print(type(soup.find_all('ul')[0]))
#通过属性
print(soup.find_all(attrs={'id': 'list-1'}))
print(soup.find_all(attrs={'name': 'elements'}))
print(soup.find_all(id='list-1'))
print(soup.find_all(class_='element'))
#通过text
print(soup.find_all(text='Foo'))
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.select('.panel .panel-heading'))
print(soup.select('ul li'))
print(soup.select('#list-2 .element'))
print(type(soup.select('ul')[0]))
for ul in soup.select('ul'):
print(ul.select('li'))
#获得属性
for ul in soup.select('ul'):
print(ul['id'])
print(ul.attrs['id'])
#获取内容
for li in soup.select('li'):
print(li.get_text())
爬虫我这里用的beautifulsoup和requests库
爬取的是一个静态小说网页作为例子
原网页网址为http://book.zongheng.com/store.html
观察点击下一页时网址变为
http://book.zongheng.com/store/c0/c0/b0/u0/p2/v9/s9/t0/u0/i1/ALL.html
点击回第一页时网址变为
http://book.zongheng.com/store/c0/c0/b0/u0/p1/v9/s9/t0/u0/i1/ALL.html
改变的数只有p1目录的目录名
所以,定义url
#我这里只爬十五页内容
page=range(1,16)
url=’http://book.zongheng.com/store/c0/c0/b0/u0/’+str(list(page))’/v9/s9/t0/u0/i1/ALL.html’
·检查网页源码:
先思考用什么存数据
可以使用多维数组,也可以使用数组加字典,也可以使用字典加数组
例:
多维数组:
[[id,name,img,author,cla,sta,date,exp,new],[ id,name,img,author,cla,sta,date,exp,new],[ id,name,img,author,cla,sta,date,exp,new],[ id,name,img,author,cla,sta,date,exp,new]]
数组加字典:
[{‘id’=id,’name’=name,’img’=img,’author’=author,’cla’=cla,’sta’=sta,’date’=date,’exp’=exp,’new’=new },{‘id’=id,’name’=name,’img’=img,’author’=author,’cla’=cla,’sta’=sta,’date’=date,’exp’=exp,’new’=new },{‘id’=id,’name’=name,’img’=img,’author’=author,’cla’=cla,’sta’=sta,’date’=date,’exp’=exp,’new’=new }]
字典加数组
{‘id’=[id1,id2,id3],’name’=[name1,name2,name3],……}
我这里使用二维数组的方式
分析:
所有小说列表都在bookbox fl中
小说封面为class为bookimg下
所以我们就查看soup.find_all('div',class_='bookimg'),此时返回的是div=bookimg的一个数组,我们要找到里边的img标签,里面的src
创建数组
novel=[]
tag = soup.find_all('div',class_=’bookbox fl’)
for i in range(len(tag)):
data = []
#加入id
data.append(i)
#加入name,小说名,strip()函数为删除空格和\r,\n等
data.append(i.find(‘div’,class_=‘bookname’).text.sprip())
#加入img,小说封面
data.append(i.find(‘img’).get(‘src’))
#加入author,小说作者
data.append(i.find('div',class_='bookilnk').find_all('a')[0].text)
#加入cla,小说类型
data.append(i.find('div',class_='bookilnk').find_all('a')[1].text)
#加入sta,小说状态
data.append(i.find('div',class_='bookilnk').find_all('span')[0].text.strip())
#加入date,小说更新时间,replace为替换,这里将不需要的信息替换为空
data.append(i.find('div',class_='bookilnk').find_all('span')[0].text.strip().replace('更新时间\xa0\xa0',''))
#加入exp,小说简介
#加入new,最新章节
同理
添加完成的一本书到小说数组中
novel.append(data)
将数据写入csv文件中
我这里使用csv库,可以使用pandas或其他,方法类似
import csv
此处我图方便使用with open as方法,用写方法打开test
with open(‘test.csv’,’w’) as f:
writer = csv.writer(f)
#先写表头
writer.writerow([‘id’,’name’,’img’,’author’,’cla’,’sta’,’date’,’exp’,’new’])
#写入多行
writer.writerows(novel)

1515

被折叠的 条评论
为什么被折叠?



