大数据学习笔记1

1....hadoop安装
下载VirtualBox http://download.virtualbox.org/virtualbox/5.1.18/VirtualBox-5.1.18-114002-Win.exe
下载CentOS http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso
下载XShell与XFtp 请在百度自己搜索与安装
下载jdk http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.rpm
下载hadoop2.7.3 -> http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz
安装VirtualBox
设定VirtualBox虚拟网卡的IP地址
设置虚拟机中的网络设置
在虚拟机中选用host-only网络
vi /etc/sysconfig/network 
NETWORKING=yes
GATEWAY=192.168.56.1
vi /etc/sysconfig/network-sripts/ifcfg-enp0s3 TYPE=Ethernet IPADDR=192.168.56.100 NETMASK=255.255.255.0
修改主机名hostnamectl set-hostname master (主机名千万不能有下划线!)
重启网络service network restart
互相ping,看是否测试成功,若不成功,注意防火墙的影响。关闭windows或虚拟机的防火墙。systemctl stop firewalld system disable firewalld
下载软件
下载VirtualBox http://download.virtualbox.org/virtualbox/5.1.18/VirtualBox-5.1.18-114002-Win.exe
下载CentOS http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso
下载XShell与XFtp 请在百度自己搜索与安装
下载jdk http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.rpm
下载hadoop2.7.3 -> http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz
安装VirtualBox
设定VirtualBox虚拟网卡的IP地址
设置虚拟机中的网络设置
在虚拟机中选用host-only网络
vi /etc/sysconfig/network 
NETWORKING=yes
GATEWAY=192.168.56.1
vi /etc/sysconfig/network-sripts/ifcfg-enp0s3 TYPE=Ethernet IPADDR=192.168.56.100 NETMASK=255.255.255.0
修改主机名hostnamectl set-hostname master (主机名千万不能有下划线!)
重启网络service network restart
互相ping,看是否测试成功,若不成功,注意防火墙的影响。关闭windows或虚拟机的防火墙。systemctl stop firewalld systemctl disable firewalld
使用XShell登陆
检查ssh服务状态systemctl status sshd (service sshd status),验证使用XShell是否能登陆成功。
将hadoop和jdk上传到虚拟机
安装JDK rpm -ivh xxxxx.jdk,验证rpm -qa | grep jdk,在命令行中敲java命令,确认jdk已经安装完成
jdk默认安装在/usr/java目录下
安装hadoop
cd /usr/local
tar –xvf hadoop-2.7.2.tar.gz
把目录修改为hadoop mv hadoop-2... hadoop
修改hadoop-env.shhadoo
vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh
修改export JAVA_HOME 语句为 export JAVA_HOME=/usr/java/default
把/usr/hadoop/bin和/usr/hadoop/sbin设到PATH中
vi /etc/profile
追加 export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
source /etc/profile
测试hadoop命令是否可以直接执行,任意目录下敲hadoop
关闭虚拟机,复制3份
分别修改虚拟机的ip和hostname,确认互相能够ping通,用ssh登陆,同时修改所有虚拟机的/etc/hosts,确认使用名字可以ping通

core-site.xml  指明namenode信息
   <property>
   
          <name>fs.defaultFS</name>
       
         <value>hdfs://master:9000</value>
   

    </property>

cd /usr/local/hadoop/etc/hadoop
/usr/local/hadoop/sbin/hadoop-daemon.sh


2....hadoop测试

修改 vim /etc/hosts
192.168.56.100 master
192.168.56.101 slave1
192.168.56.102 slave2
192.168.56.103 slave3

vi /usr/local/hadoop/etc/hadoop/slaves

启动集群
在master上启动
在slave上启动hadoop-daemon.sh start datanode
用jps指令观察执行结果
用hdfs dfsadmin -report观察集群配置情况

hadoop fs -rm /filename
通过http://192.168.56.100:50070/web界面观察集群运行情况
用hadoop-daemon.sh stop ...手工关闭集群
对集群进行集中管理
修改master上/etc/hadoop/slaves文件,每一个slave占一行
                            slave1
                            slave2
                            slave3
                        
使用start-dfs.sh启动集群,并观察结果  /usr/local/hadoop/sbin/start-dfs.sh
使用stop-dfs.sh停止集群
配置免密SSH远程登陆
                            ssh slave1
                            输入密码
                            exit
                            #此时需要密码才能登陆
                            
                            cd
                            ls -la
                            cd .ssh
                            ssh-keygen -t rsa (四个回车)
                            #会用rsa算法生成私钥id_rsa和公钥id_rsa.pub
                            ssh-copy-id slaveX
                            ssh-copy-id master
                            再次ssh slave1
                            此时应该不再需要密码
                        
重新使用start-dfs.sh启动集群
修改windows机上C:\Windows\System32\drivers\etc\hosts文件,可以通过名字访问集群web界面
使用hdfs dfs 或者hadoop fs命令对文件进行增删改查的操作
hadoop fs -ls /
hadoop fs -put file /
hadoop fs -mkdir /dirname
hadoop fs -text /filename
hadoop fs -rm /filename
通过网页观察文件情况
将hdfs-site.xml的replication值设为2,通过网页观察分块情况
设定dfs.namenode.heartbeat.recheck-interval为10000,然后停掉其中一台slave,观察自动复制情况
启动停掉的slave节点,通过网页观察datanode的动态添加
添加新的节点,体会hadoop的横向扩展
启动slave4,关闭防火墙,修改hostname
修改etc/hosts,加入对自己以及其他机器的解析,重启网络
在master中设定对于slave4的解析
启动slave4的datanode,通过网页进行观察
hdfs dfsadmin –shutdownDatanode slave4:50020
通过java程序访问hdfs,就把HDFS集群当成一个大的系统磁盘就行了!
从HDFS中读取文件
                URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
                InputStream in = new URL("hdfs://192.168.56.100:9000/test.data").openStream();
                IOUtils.copyBytes(in, System.out, 4096, true);
            
学习使用FileSystem类
                Configuration conf = new Configuration();
                conf.set("fs.defaultFS", "hdfs://192.168.56.100:9000");
                FileSystem fileSystem = FileSystem.get(conf);
                
                boolean b = fileSystem.exists(new Path("/hello"));
                System.out.println(b);
                
                boolean success = fileSystem.mkdirs(new Path("/mashibing"));
                System.out.println(success);
                
                success = fileSystem.delete(new Path("/mashibing"), true);
                System.out.println(success);
                
                FSDataOutputStream out = fileSystem.create(new Path("/test.data"), true);
                FileInputStream fis = new FileInputStream("c:/test/core-site.xml");
                IOUtils.copyBytes(fis, out, 4096, true);
                
                FileStatus[] statuses = fileSystem.listStatus(new Path("/"));
                //System.out.println(statuses.length);
                for(FileStatus status : statuses) {
                    System.out.println(status.getPath());
                    System.out.println(status.getPermission());
                    System.out.println(status.getReplication());
                }
            
/////////
///usr/local/hadoop/etc/hadoop/hdfs-site.xml

<property>
    <name>dfs.replication</name>
    <value>2</value>
</property>

<property>
    <name>dfs.namenode.heartbeat.recheck-interval</name>
    <value>10000</value>
</property>
<property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
</property>

////////

3....java编写hdfs程序

dfs系统会把用到的数据存储在core-site.xml中由hadoop.tmp.dir指定,而这个值默认位于/tmp/hadoop-${user.name}下面, 由于/tmp目录在系统重启时候会被删除,所以应该修改目录位置。 修改core-site.xml(在所有站点上都修改)
<property>
    <name>hadoop.tmp.dir</name>
    <value>/var/hadoop</value>
</property>
hdfs namenode -format
通过java程序访问hdfs,就把HDFS集群当成一个大的系统磁盘就行了!
windows上的权限系统和linux上的权限系统,测试期间为了简单起见可以关闭权限检查 在namenode的hdfs-site.xml上,添加配置:
<property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
</property>
重新启动namenode: hadoop-daemon.sh stop namenode, hadoop-daemon.sh start namenode
从HDFS中读取文件
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
InputStream in = new URL("hdfs://192.168.56.100:9000/test.data").openStream();
IOUtils.copyBytes(in, System.out, 4096, true);
学习使用FileSystem类

Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.56.100:9000");
FileSystem fileSystem = FileSystem.get(conf);
 
boolean b = fileSystem.exists(new Path("/hello"));
System.out.println(b);
 
boolean success = fileSystem.mkdirs(new Path("/mashibing"));
System.out.println(success);
 
success = fileSystem.delete(new Path("/mashibing"), true);
System.out.println(success);
 
FSDataOutputStream out = fileSystem.create(new Path("/test.data"), true);
FileInputStream fis = new FileInputStream("c:/test/core-site.xml");
IOUtils.copyBytes(fis, out, 4096, true);
 
FileStatus[] statuses = fileSystem.listStatus(new Path("/"));
//System.out.println(statuses.length);
for(FileStatus status : statuses) {
    System.out.println(status.getPath());
    System.out.println(status.getPermission());
    System.out.println(status.getReplication());
}

4....yarn安装与测试
配置计算调度系统Yarn和计算引擎Map/Reduce
namenode上配置mapred-site.xml
<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>
yarn-site.xml的配置
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>master</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>
启动yarn集群start-yarn.sh
jps观察启动结果
可以使用yarn-daemon.sh单独启动resourcemanager和nodemanager
通过网页http://master:8088/观察yarn集群
find /usr/local/hadoop -name *example*.jar 查找示例文件
通过hadoop jar xxx.jar wordcount /input /output来运行示例程序
通过网页来观察该job的运行情况
hadoop job -kill job_id --> mapred job -kill job_id mapred job -list
经验:yarn-site如果是集中启动,其实只需要在管理机上配置一份即可,但是如果单独启动,需要每台机器一份,在网页上可以看到当前机器的配置,以及这个配置的来源


5.....java编写mapreduce程序
java开发map_reduce程序
配置系统环境变量HADOOP_HOME,指向hadoop安装目录(如果你不想招惹不必要的麻烦,不要在目录中包含空格或者中文字符)
把HADOOP_HOME/bin加到PATH环境变量(非必要,只是为了方便)
如果是在windows下开发,需要添加windows的库文件
把盘中共享的bin目录覆盖HADOOP_HOME/bin
如果还是不行,把其中的hadoop.dll复制到c:\windows\system32目录下,可能需要重启机器
建立新项目,引入hadoop需要的jar文件
代码WordMapper:
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
 
 
public class WordMapper extends Mapper<LongWritable,Text, Text, IntWritable> {
 
    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
            throws IOException, InterruptedException {
        String line = value.toString();
        String[] words = line.split(" ");
        for(String word : words) {
            context.write(new Text(word), new IntWritable(1));
        }
    }
     
}
代码WordReducer:
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
 
public class WordReducer extends Reducer<Text, IntWritable, Text, LongWritable> {
 
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values,
            Reducer<Text, IntWritable, Text, LongWritable>.Context context) throws IOException, InterruptedException {
        long count = 0;
        for(IntWritable v : values) {
            count += v.get();
        }
        context.write(key, new LongWritable(count));
    }
     
}
代码Test:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
 
 
public class Test {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
                         
        Job job = Job.getInstance(conf);
         
        job.setMapperClass(WordMapper.class);
        job.setReducerClass(WordReducer.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
         
        FileInputFormat.setInputPaths(job, "c:/bigdata/hadoop/test/test.txt");
        FileOutputFormat.setOutputPath(job, new Path("c:/bigdata/hadoop/test/out/"));
         
        job.waitForCompletion(true);
    }
}
把hdfs中的文件拉到本地来运行
FileInputFormat.setInputPaths(job, "hdfs://master:9000/wcinput/");
FileOutputFormat.setOutputPath(job, new Path("hdfs://master:9000/wcoutput2/"));
注意这里是把hdfs文件拉到本地来运行,如果观察输出的话会观察到jobID带有local字样
同时这样的运行方式是不需要yarn的(自己停掉yarn服务做实验)
在远程服务器执行
conf.set("fs.defaultFS", "hdfs://master:9000/");
 
conf.set("mapreduce.job.jar", "target/wc.jar");
conf.set("mapreduce.framework.name", "yarn");
conf.set("yarn.resourcemanager.hostname", "master");
conf.set("mapreduce.app-submission.cross-platform", "true");

FileInputFormat.setInputPaths(job, "/wcinput/");
FileOutputFormat.setOutputPath(job, new Path("/wcoutput3/"));
如果遇到权限问题,配置执行时的虚拟机参数-DHADOOP_USER_NAME=root
也可以将hadoop的四个配置文件拿下来放到src根目录下,就不需要进行手工配置了,默认到classpath目录寻找
或者将配置文件放到别的地方,使用conf.addResource(.class.getClassLoader.getResourceAsStream)方式添加,不推荐使用绝对路径的方式
建立maven-hadoop项目:

<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>mashibing.com</groupid>
  <artifactid>maven</artifactid>
  <version>0.0.1-SNAPSHOT</version>
  <name>wc</name>
  <description>hello mp</description>
   
   
  <properties>
        <project.build.sourceencoding>UTF-8</project.build.sourceencoding>
        <hadoop.version>2.7.3</hadoop.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
    </dependencies>
   
   
</project>
配置log4j.properties,放到src/main/resources目录下
log4j.rootCategory=INFO, stdout
 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender   
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout   
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

6.....hive与数据挖掘
Hive入门
解压Hive,到/usr/local目录,将解压后的目录名mv为hive 
设定环境变量HADOOP_HOME,HIVE_HOME,将bin目录加入到PATH中
cd /usr/local/hive/conf
cp hive-default.xml.template hive-site.xml
修改hive.metastore.schema.verification,设定为false
创建/usr/local/hive/tmp目录,替换${system:java.io.tmpdir}为该目录
替换${system:user.name}为root
schematool -initSchema -dbType derby 
会在当前目录下简历metastore_db的数据库。
注意!!!下次执行hive时应该还在同一目录,默认到当前目录下寻找metastore。
遇到问题,把metastore_db删掉,重新执行命令
实际工作环境中,经常使用mysql作为metastore的数据
启动hive
观察hadoop fs -ls /tmp/hive中目录的创建
show databases;
use default;
create table doc(line string);
show tables;
desc doc;
select * from doc;
drop table doc;
观察hadoop fs -ls /user
启动yarn
load data inpath '/wcinput' overwrite into table doc;
select * from doc;
select split(line, ' ') from doc;
select explode(split(line, ' ')) from doc;
select word, count(1) as count from (select explode(split(line, ' ')) as word from doc) w group by word;
select word, count(1) as count from (select explode(split(line, ' ')) as word from doc) w group by word order by word;
create table word_counts as select word, count(1) as count from (select explode(split(line, ' ')) as word from doc) w group by word order by word;
select * from word_counts;
dfs -ls /user/hive/...
使用sougou搜索日志做实验
将日志文件上传的hdfs系统,启动hive
create table sougou (qtime string, qid string, qword string, url string) row format delimited fields terminated by ',';
load data inpath '/sougou.dic' into table sougou;
select count(*) from sougou;
create table sougou_results as select keyword, count(1) as count from (select qword as keyword from sougou) t group by keyword order by count desc;
select * from sougou_results limit 10;

7.....Spark

下载
地址spark.apache.org
安装
复制一台单独的虚拟机,名c
修改其ip,192.168.56.200
修改其hostname为c,hostnamectl set-hostname c
修改/etc/hosts加入对本机的解析
重启网络服务 systemctl restart network
上传spark安装文件到root目录
解压spark到/usr/local下,将其名字修改为spark
本地运行模式
使用spark-submit提交job
cd /usr/local/spark
./bin/spark-submit --class org.apache.spark.examples.SparkPi ./examples/jars/spark-examples_2.11-2.1.0.jar 10000
使用spark-shell进行交互式提交
创建root下的文本文件hello.txt
./bin/spark-shell
再次连接一个terminal,用jps观察进程,会看到spark-submit进程
sc
sc.textFile("/root/hello.txt")
val lineRDD = sc.textFile("/root/hello.txt")
lineRDD.foreach(println)
观察网页端情况
val wordRDD = lineRDD.flatMap(line => line.split(" "))
wordRDD.collect
val wordCountRDD = wordRDD.map(word => (word,1))
wordCountRDD.collect
val resultRDD = wordCountRDD.reduceByKey((x,y)=>x+y)
resultRDD.collect
val orderedRDD = resultRDD.sortByKey(false)
orderedRDD.collect
orderedRDD.saveAsTextFile("/root/result")
观察结果
简便写法:sc.textFile("/root/hello.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).sortByKey().collect
使用local模式访问hdfs数据
start-dfs.sh
spark-shell执行:sc.textFile("hdfs://192.168.56.100:9000/hello.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).sortByKey().collect (可以把ip换成master,修改/etc/hosts)
sc.textFile("hdfs://192.168.56.100:9000/hello.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).sortByKey().saveAsTextFile("hdfs://192.168.56.100:9000/output1")
spark standalone模式
在master和所有slave上解压spark
修改master上conf/slaves文件,加入slave
修改conf/spark-env.sh,export SPARK_MASTER_HOST=master
复制spark-env.sh到每一台slave
cd /usr/local/spark
./sbin/start-all.sh
在c上执行:./bin/spark-shell --master spark://192.168.56.100:7077 (也可以使用配置文件)
观察http://master:8080
spark on yarn模式
====================================================
坑1:datanode 启动不了  则  删除/var/hadoop/dfs 下的data文件夹

 

猜你喜欢

转载自blog.csdn.net/nihao_pcm/article/details/80449414