Hadoop技术栈(一)hadoop搭建与HDFS常用命令

Java技术栈 —— Hadoop入门(一)介绍 Java技术栈 —— Hadoop入门(一) 阅读详情

概念

hadoop是一个大数据的分布式存储,调度,计算框架。也可以说是一个生态圈,包含很多技术:Hive、Hbase、Flume、Kafka...

Hadoop的优点

  • Hadoop具有存储和处理数据能力的高可靠性。
  • Hadoop通过可用的计算机集群分配数据,完成存储和计算任务,这些集群可以方便地扩展到数以
  • 千计的节点中,具有高扩展性。
  • Hadoop能够在节点之间进行动态地移动数据,并保证各个节点的动态平衡,处理速度非常快,具
  • 有高效性。
  • Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配,具有高容错性。

Hadoop的缺点

  • Hadoop不适用于低延迟数据访问。
  • Hadoop不能高效存储大量小文件。
  • Hadoop不支持多用户写入并任意修改文件。

集群搭建

下载:https://archive.apache.org/dist/hadoop/common/hadoop-2.9.2/

集群规划

框架linux121linux122linux123
HDFSNameNode,DataNodeDataNodeSecondaryNameNode,DataNode
YARNNodeManagerNodeManagerNodeManager,ResourceManager

解压到安装目录:tar -zxvf hadoop-2.9.2.tar.gz -C /opt/lxq/servers

编辑环境变量:vim /etc/profile

# HADOOP_HOME
export HADOOP_HOME = /opt/lxq/servers/hadoop-2.9.2
export PATH = $PATH : $HADOOP_HOME /bin
export PATH = $PATH : $HADOOP_HOME /sbin

使环境变量生效:source /etc/profile

验证hadoop:hadoop version

集群配置

vim hadoop-env.sh
export JAVA_HOME = /opt/lxq/servers/jdk1.8.0_231
vim core-site.xml
<!-- 指定 HDFS 中 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs : //linux121 : 9000</value>
</property>
<!-- 指定 Hadoop 运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/lxq/servers/hadoop-2.9.2/data/tmp</value>
</property>
vim hdfs-site.xml
<!-- 指定 Hadoop 辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>linux123 : 50090</value>
</property>
<!-- 副本数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
vim slaves 这里要注意不能有空格,不能有空行
linux121
linux122
linux123
vim mapred-env.sh
export JAVA_HOME = /opt/lxq/servers/jdk1.8.0_231
mv mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
<!-- 指定 MR 运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>linux121 : 10020</value>
</property>
<!-- 历史服务器 web 端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>linux121 : 19888</value>
</property>
<!-- 文件压缩 -->
<property>
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress.type</name>
<value>RECORD</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
vim yarn-site.xml
<!-- 指定 YARN 的 ResourceManager 的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>linux123</value>
</property>
<!-- Reducer 获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 日志聚集功能  -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://linux121:19888/jobhistory/logs</value>
</property>
<!-- 指定我们的任务调度使用 fairScheduler 的调度方式 -->
<property>
<name> yarn.resourcemanager.scheduler.class </name>
<value> org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler </value>
<description> In case you do not want to use the default scheduler </description>
</property>
在 Hadoop 安装目录 /etc/hadoop创建fair-scheduler.xm文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<allocations>
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<queue name="root" >
<queue name="default">
<aclAdministerApps>*</aclAdministerApps>
<aclSubmitApps>*</aclSubmitApps>
<maxResources>9216 mb,4 vcores</maxResources>
<maxRunningApps>100</maxRunningApps>
<minResources>1024 mb,1vcores</minResources>
<minSharePreemptionTimeout>1000</minSharePreemptionTimeout>
<schedulingPolicy>fair</schedulingPolicy>
<weight>7</weight>
</queue>
<queue name="queue1">
<aclAdministerApps>*</aclAdministerApps>
<aclSubmitApps>*</aclSubmitApps>
<maxResources>4096 mb,4vcores</maxResources>
<maxRunningApps>5</maxRunningApps>
<minResources>1024 mb, 1vcores</minResources>
<minSharePreemptionTimeout>1000</minSharePreemptionTimeout>
<schedulingPolicy>fair</schedulingPolicy>
<weight>3</weight>
</queue>
</queue>
<queuePlacementPolicy>
<rule create="false" name="specified"/>
<rule create="true" name="default"/>
</queuePlacementPolicy>
</allocations>

赋予权限:chown -R root:root /opt/lxq/servers/hadoop-2.9.2

安装分发工具:yum install -y rsync

用法:rsync -rvl /opt/lxq/software/ root@linux122:/opt/lxq/software

编写分发脚本 vim /usr/local/bin/rsync-script

#!/bin/bash
#1 获取命令输入参数的个数,如果个数为0,直接退出命令
paramnum=$#
if((paramnum==0)); then
echo no params;
exit;
fi
#2 根据传入参数获取文件名称
p1=$1
file_name=`basename $p1`
echo fname=$file_name
#3 获取输入参数的绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取用户名称
user=`whoami`
#5 循环执行rsync
for((host=121; host<124; host++)); do
echo ------------------- linux$host --------------
rsync -rvl $pdir/$file_name $user@linux$host:$pdir
done

赋予脚本权限:chmod 777 /usr/local/bin/rsync-script

拓展一些

chmod命令

用来变更文件或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。

权限范围的表示法如下:

u User,即文件或目录的拥有者;

g Group,即文件或目录的所属群组;

o Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围;

a All,即全部的用户,包含拥有者,所属群组以及其他用户;

r 读取权限,数字代号为“4”; w 写入权限,数字代号为“2”;

x 执行或切换权限,数字代号为“1”;

- 不具任何权限,数字代号为“0”;

s 特殊功能说明:变更文件或目录的权限。

语法 chmod(选项)(参数)

选项

-c或——changes:效果类似“-v”参数,但仅回报更改的部分;

-f或--quiet或——silent:不显示错误信息;

-R或——recursive:递归处理,将指令目录下的所有文件及子目录一并处理;

-v或——verbose:显示指令执行过程;

--reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;

<权限范围>+<权限设置>:开启权限范围的文件或目录的该选项权限设置;

<权限范围>-<权限设置>:关闭权限范围的文件或目录的该选项权限设置;

<权限范围>=<权限设置>:指定权限范围的文件或目录的该选项权限设置;

参数

权限模式:指定文件的权限模式;

文件:要改变权限的文件。

例:

rwx rw- r-- r=读取属性  //值=4

w=写入属性  //值=2

x=执行属性  //值=1

chmod u+x,g+w f01  //为文件f01设置自己可以执行,组员可以写入的权限

chmod u=rwx,g=rw,o=r f01

chmod 764 f01

chmod a+x f01  //对文件f01的u,g,o都设置可执行属性 文件的属主和属组属性设置

chown user:market f01  //把文件f01给uesr,添加到market组

ll -d f1 查看目录f1的属性

chown命令

改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D,用户组可以是组名或组id。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。 只有文件主和超级用户才可以便用该命令。

语法 chown(选项)(参数)

选项

-c或——changes:效果类似“-v”参数,但仅回报更改的部分;

-f或--quite或——silent:不显示错误信息;

-h或--no-dereference:只对符号连接的文件作修改,而不更改其他任何相关文件;

-R或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理;

-v或——version:显示指令执行过程;

--dereference:效果和“-h”参数相同;

--help:在线帮助;

--reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;

--version:显示版本信息。

参数

用户:组:指定所有者和所属工作组。当省略“:组”,仅改变文件所有者;

文件:指定要改变所有者和工作组的文件列表。支持多个文件和目标,支持shell通配符。

实例 将目录/usr/meng及其下面的所有文件、子目录的文件主改成 liu:

chown -R liu /usr/meng

分发hadoop到集群其它节点:rsync-script /opt/lxq/servers/hadoop-2.9.2

第一次启动格式化(不是第一次不用这句命令):hadoop namenode -format

群起yarn:start-yarn.sh [stop-yarn.sh]

群起hdfs:start-dfs.sh [stop-dfs.sh]

历史服务器起关命令

$HODOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver 

$HODOOP_HOME/sbin/mr-jobhistory-daemon.sh stop historyserver 

HDFS WEB界面:http://linux121:50070/dfshealth.html#tab-overview

历史服务器web页面:http://linux121:19888/jobhistory

查看启动的服务命令:jps

HDFS命令

hdfs dfs -help rm
hdfs dfs -ls /
hdfs dfs -mkdir -p /a/b/c
hdfs dfs -removeFromLocal /opt/lxq/a.txt /a/b/c/
hdfs dfs -appendToFile /xx /xx/xx.csv
hdfs dfs -cat /a/b/c/a.txt
hdfs dfs -chmod 666 /a/b/c/a.txt
hdfs dfs -chown root:root /a/b/c/a.txt
hdfs dfs -copyFromLocal /opt/lxq/b.txt /a/b/c/
hdfs dfs -cp /a/b/c/a.txt /a/b/a.txt
hdfs dfs -mv  /a/b/a.txt /a/b/c/d/
hdfs dfs -get /a/b/c/a.txt
hdfs dfs -copyToLocal /a/b/c/a.txt /opt/lxq/data/
hdfs dfs -put xxx xxx
hdfs dfs -tail /xx/xx/xx.log
hdfs dfs -rm -r /a/b/c/d
hdfs dfs -du -s -h /a
hdfs dfs -du -h /a
hdfs dfs -setrep 10 /a/b/c/a.txt

Java整合Hadoop的依赖

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.9.2</version>
 </dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.9.2</version>
</dependency>

Java HDFSUtils类

package ;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.io.IOUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
public class HDFSUtil {

    private static final Configuration configuration = new Configuration();

    private static volatile FileSystem fileSystem = null;

    private HDFSUtil() {
    }

    private static FileSystem getFS() {
        if (null == fileSystem) {
            synchronized (HDFSUtil.class) {
                if (null == fileSystem) {
                    try {
                        fileSystem = FileSystem.get(new URI("hdfs://linux121:9000"), configuration, "root");
                    } catch (IOException | InterruptedException | URISyntaxException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }
        return fileSystem;
    }

    /**
     * 获取 HDFS 集群节点信息
     *
     * @param hdfsUri 集群路径
     * @return List<String>
     * @author lxq
     * @since 2025-07-31
     */
    public static DatanodeInfo[] getHDFSNodes(String hdfsUri) {
        if (StringUtils.isBlank(hdfsUri)) {
            return null;
        }
        DatanodeInfo[] dataNodeStats = new DatanodeInfo[0];
        try (FileSystem fs = getFS()) {
            // 获取分布式文件系统
            DistributedFileSystem hdfs = (DistributedFileSystem) fs;
            dataNodeStats = hdfs.getDataNodeStats();
        } catch (IOException e) {
            log.error("Get DataNode Info exception:", e);
        }
        return dataNodeStats;
    }

    /**
     * 获取目标路径下的所有文件或者文件夹的全路径列表
     *
     * @param target 目标路径
     * @return List<String>
     * @author lxq
     * @since 2025-07-31
     */
    public static List<String> listFile(String target) {
        if (StringUtils.isBlank(target)) {
            return null;
        }
        try (FileSystem fs = getFS()) {
            FileStatus[] status = fs.listStatus(new Path(target));
            /*for (FileStatus s : status) {
                s.isFile();
                s.isDirectory();
            }*/
            // 获取目录下的所有文件路径
            return Arrays.stream(FileUtil.stat2Paths(status))
                    .map(Path::toString)
                    .collect(Collectors.toList());
        } catch (IllegalArgumentException | IOException e) {
            log.error("list file exception:", e);
        }
        return null;
    }

    /**
     * @param target
     * @return
     */
    public static List<LocatedFileStatus> getFileLocatedStatus(String target) {
        List<LocatedFileStatus> locatedFileStatusList = new ArrayList<>();
        if (StringUtils.isNotBlank(target)) {
            try (FileSystem fs = getFS()) {
                RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path(target), true);
                while (listFiles.hasNext()) {
                    LocatedFileStatus status = listFiles.next();
                    // 输出详情
                    // 文件名称
                    System.out.println(status.getPath().getName());
                    // 长度
                    System.out.println(status.getLen());
                    // 权限
                    System.out.println(status.getPermission());
                    // 分组
                    System.out.println(status.getGroup());
                    // 获取存储的块信息
                    BlockLocation[] blockLocations = status.getBlockLocations();
                    for (BlockLocation blockLocation : blockLocations) {
                        // 获取块存储的主机节点
                        String[] hosts = blockLocation.getHosts();
                        for (String host : hosts) {
                            System.out.println(host);
                        }
                    }
                }
            } catch (Exception e) {
                log.error("list file located status exception:", e);
            }
        }
        return locatedFileStatusList;
    }

    /**
     * 查找某个文件在 HDFS集群的位置
     */
    public static BlockLocation[] getFileBlockLocations(String target) {
        if (StringUtils.isBlank(target)) {
            return null;
        }

        // 文件块位置列表
        BlockLocation[] blkLocations = new BlockLocation[0];
        try (FileSystem fs = getFS()) {
            // 获取文件目录
            FileStatus filestatus = fs.getFileStatus(new Path(target));
            // 获取文件块位置列表
            blkLocations = fs.getFileBlockLocations(filestatus, 0, filestatus.getLen());
        } catch (IOException e) {
            log.error("Block Location exception:", e);
        }
        return blkLocations;
    }

    /**
     * 创建文件夹 是不能创建文件的
     */
    public static void mkdir(String target) {
        if (StringUtils.isBlank(target)) {
            return;
        }
        try (FileSystem fs = getFS()) {
            fs.mkdirs(new Path(target));
            log.info("Dir:{} Create Success.", target);
        } catch (Exception e) {
            log.error("make dir exception!", e);
        }
    }

    /**
     * 上传文件
     *
     * @param sourcePath 源路径
     * @param targetPath 目标路径
     * @author lxq
     * @since 2025-07-31
     */
    public static void uploadFile(String sourcePath, String targetPath) {
        if (StringUtils.isBlank(sourcePath) || StringUtils.isBlank(targetPath)) {
            return;
        }
        try (FileSystem fs = getFS()) {

            File file = new File(sourcePath);
            if (!file.exists()) {
                return;
            }
            if (file.isDirectory()) {
                // ... 需要完善文件夹的处理
                return;
            }
            String filename = file.getName();
            fs.copyFromLocalFile(new Path(sourcePath), new Path(targetPath + "/" + filename));
            log.info("Had Upload File:{} To Hdfs:{}", sourcePath, targetPath);
        } catch (Exception e) {
            log.error("upload file exception!", e);
        }
    }

    /**
     * 上传文件
     *
     * @param sourcePath 源路径
     * @param targetPath 目标路径
     * @author lxq
     * @since 2025-07-31
     */
    public static void downFile(String sourcePath, String targetPath) {
        if (StringUtils.isBlank(sourcePath) || StringUtils.isBlank(targetPath)) {
            return;
        }
        try (FileSystem fs = getFS()) {
            // boolean delSrc 指是否将原文件删除
            // Path src 指要下载的文件路径
            // Path dst 指将文件下载到的路径
            // boolean useRawLocalFileSystem 是否开启文件校验
            fs.copyToLocalFile(false, new Path(sourcePath), new Path(targetPath), true);
            log.info("Had Download File:{} To {}", sourcePath, targetPath);
        } catch (Exception e) {
            log.error("download file exception!", e);
        }
    }

    /**
     * 删除文件 / 文件夹
     *
     * @param target 目标文件或者文件夹
     * @author lxq
     * @since 2025-07-31
     */
    public static void delFileOrDir(String target) {
        try (FileSystem fs = getFS()) {
            if (StringUtils.isNotBlank(target)) {
                // 删除文件或者文件目录  delete(Path f) 此方法已经弃用
                fs.delete(new Path(target), true);
                log.info("Had Deleted File Or Dir Under the {} From Hdfs", target);
            }
        } catch (Exception e) {
            log.error("delete file or dir exception!", e);
        }
    }

    /**
     * 判断目录是否存在
     *
     * @param target 目标路径
     * @param create 不存在是否创建
     * @return 是否存在路径
     */
    public static boolean existDir(String target, boolean create) {
        if (StringUtils.isBlank(target)) {
            return false;
        }
        try (FileSystem fs = getFS()) {
            Path path = new Path(target);
            if (create) {
                if (!fs.exists(path)) {
                    fs.mkdirs(path);
                }
            }
            if (fs.isDirectory(path)) {
                return true;
            }
        } catch (Exception e) {
            log.error("exist Dir exception:", e);
        }
        return false;
    }


    /************************** 流相关API *****************************/
    /**
     * 流方式 文件上传
     */
    public static void uploadWithStream(String sourcePath, File file, String targetPath) {
        if ((StringUtils.isNotBlank(sourcePath) || null != file) && StringUtils.isNotBlank(targetPath)) {
            try (FileSystem fs = getFS()) {
                if (null == file) {
                    file = new File(sourcePath);
                }
                if (!file.exists()) {
                    return;
                }
                if (file.isDirectory()) {
                    return;
                }
                String filename = file.getName();
                FileInputStream fis = new FileInputStream(file);
                FSDataOutputStream fos = fs.create(new Path(targetPath + "/" + filename));
                IOUtils.copyBytes(fis, fos, configuration);
                IOUtils.closeStream(fos);
                IOUtils.closeStream(fis);
                log.info("Had Upload File:{} To Hdfs:{} With Stream.", sourcePath, targetPath);
            } catch (Exception e) {
                log.error("upload file with stream exception!", e);
            }
        }
    }

    /**
     * 流方式 文件下载
     */
    public static void downloadWithStream(String sourcePath, String targetPath) {
        if (StringUtils.isNotBlank(sourcePath) && StringUtils.isNotBlank(targetPath)) {
            try (FileSystem fs = getFS()) {
                Path path = new Path(sourcePath);
                /*if (!fs.exists(path)) {

                }
                if (fs.isDirectory(path)) {

                }*/
                FSDataInputStream fis = fs.open(path);
                FileOutputStream fos = new FileOutputStream(new File(targetPath));
                IOUtils.copyBytes(fis, fos, configuration);
                IOUtils.closeStream(fos);
                IOUtils.closeStream(fis);
                log.info("Had Download File:{} From Hdfs:{} With Stream.", sourcePath, targetPath);
            } catch (Exception e) {
                log.error("download file with stream exception!", e);
            }
        }
    }
}

感谢阅读!!!

Hadoop之HDFS的原理和常用命令及API(java) 阅读详情

相关推荐

Hadoop大数据技术栈详解

大数据(Big Data)∶指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。主要解决:海量数据的存储和海量数据的分析计算问题。按顺序给出数据存储单位∶bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB。1Byte=8bit、1K=1024Byte、1MB=1024K、1G=1024M、1T=1024G、1P=1024T1. Volume(大量)截至目前,人类生

悦分享 2746

hadoop技术栈

在整个过程中,HDFS扮演着数据的存储和管理者的角色,MapReduce利用HDFS的分布式特性,实现对海量数据的高效处理和分析。Hive和Hadoop生态系统中的其他组件有很强的关联。总之,Hadoop Common是Hadoop生态系统中的一个核心组件,为Hadoop框架中的其他组件提供了基础设施和公共库,使它们能够在分布式环境中高效地运行。它将计算资源从底层节点上解耦出来,形成一个独立的资源管理器,并提供了一个灵活的、可扩展的资源分配和作业调度机制,使得多个计算框架可以在同一个集群上共享资源。

weixin_42456166的博客 791

大数据之hadoop,spart全套全技术栈视频课程

大数据之hadoop,spart全套全技术栈视频课程,包含spark,hadoop,storm,kafka,mllib等组件的安装,编程等,依次从基础,进阶直到实际实践。

Hadoop技术栈

HDFS是Hadoop三大组件(HDFSMapReduceYARN)之一全称是:Hadoop分布式文件系统)是Hadoop技术栈内提供的分布式数据存储解决方案可以在多台服务器上构建存储集群,存储海量的数据。

weixin_64086089的博客 1590

Android12 车载开发TaskView实现分屏

这里只给出TaskView的代码,相关联的源码,请看源码,如果想要使用TaskView需要自己去编译frameWork的源码,打包一个aar,或者jar出来使用,否则无法直接使用。1.如果分屏的应用如启动两个应用按照权重占比,互相不叠加在一起,点触摸击事件都可响应,例如左边启动QQ了,右边启动的是微信,二者窗口都可操作。TaskView是谷歌整合安卓多任务多窗口下交互重新重构的独立出来的module,本身继承自ServiceView,TaskView的相关概念性的东西参考。//创建的taskview。

android_bird_bird的博客 9548

用树莓派Pico低成本更新USB-C PD控制器固件实战指南

固件更新是嵌入式系统开发与维护中的核心环节,它直接决定了硬件设备的功能、性能与兼容性。其原理通常是通过特定的通信接口(如SWD、JTAG、UART或USB)与设备内部的Bootloader建立连接,将新的程序代码安全写入非易失性存储器。在USB Power Delivery(PD)和Type-C生态中,固件更新技术尤为重要,它能修复协议握手Bug、适配新设备并提升供电策略的灵活性。本文聚焦于一个典型的工程实践场景:如何利用广泛普及且成本极低的树莓派Pico开发板,作为USB-C协议到I²C协议的转换桥,实现

weixin_27869497的博客 456

【大数据概述】Hadoop技术栈

目录 1. Presto 1.1. 概述 1.2. Presto Hive对比 2. Hive 2.1. Hive概述 2.2. Hive与关系型数据库 关系 2.3. Hadoop 1. Presto 参考: 深入理解Presto 美团: Presto实现实时查询的原理进行分析和总结 1.1. 概述 Presto是Facebook开源的MPP(Massive Parallel Processing)SQL引擎,本身并不存储数据,但是可以接入多种数据源,并且支持跨数据源的级联查询。

baidu_34170531的博客 1321

【保姆级教程】不到一元32位芯片 DIY迷你时钟

基于不到一元的CH32V003F4P9芯片制作的迷你多功能时钟。

twen51的博客 1813

Hadoop 之 HDFS命令

HDFS(Hadoop Distributed File System)是Hadoop生态系统中的一个核心组件,它是一个高度容错性的分布式文件系统,设计用于在廉价硬件上存储大规模数据集。HDFS的架构采用主从(Master/Slave)结构模型,包含一个。

2201_75364488的博客 2871

微信聊天记录解密,必须是root的手机

手机上安装x-plore软件,将/data/data目录的相关EnMicroMsg.db auth_info_key_prefs.xml拷贝到/storge/emulated/0目录后才可以拷贝到电脑。路径:/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml。但是是加密过的 需要解密 解密密码生成规则是手机IMEI+微信UIN md5(32位小写)后的前7位。安卓手机要root测试版本微信要7或者8版本都可以。选择message表。

venus60的专栏 1004

OTA 升级失败/回滚策略设计:打造安全可靠的双分区/断点续传/签名校验方案

双分区机制(A/B Partitioning)是OTA升级的“保险箱”。简单来说,设备存储分为两个分区:A分区(当前运行)和B分区(备用)。升级时,新固件写入B分区,A分区保持不变。如果升级成功,系统切换到B分区运行;如果失败,设备直接回滚到A分区,完全不受影响。这就像玩游戏存档:你打Boss前存了个档,万一挂了还能读档重来。双分区就是设备的“读档”机制,避免了变砖的尴尬。以Android设备为例,Google从Android 7.0开始强制引入A/B分区机制(Seamless Updates)。

大模型大数据攻城狮的专栏 1235

Hadoop的集群搭建及HDFS命令

内存ddr34G及以上的x86架构主机一部系统环境windows。

学习日常分享 2781

如何通过 Python 爬虫抓取并分析政府开放数据

通过本文的介绍,我们展示了如何使用Python 爬虫抓取并分析政府开放数据。通过requests获取政府开放数据的 API 接口数据。使用和pandas进行数据清洗与存储。使用matplotlib对数据进行可视化。你可以根据不同的政府开放平台和数据集进行调整,应用于不同领域的数据分析,如公共健康、交通、环保等。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1077

理解Hadoop与HDFS

引入 小明接到一个任务:计算一个100M的文本文件中的单词的个数,这个文本文件有若干行,每行有若干个单词,每行的单词与单词之间都是以空格键分开的。对于处理这种100M量级数据的计算任务,小明感觉很轻松。他首先把这个100M的文件拷贝到自己的电脑上,然后写了个计算程序在他的计算机上执行后顺利输出了结果。 后来,小明接到了另外一个任务,计算一个1T(1024G)的文本文件中的单词的个数。再后来,小明又接到一个任务,计算一个1P(1024T)的文本文件中的单词的个数…… 面对这样大规模的数据,小明的那一台.

hxxjxw的博客 8143

STM32F4 Flash数据的保存和读取。

STM32F4 Flash数据的保存和读取。

张一西的博客 9216

22、用户界面流程(UI Flow)全解析

本文全面解析了用户界面流程(UI Flow)的概念、创建步骤及其在系统设计中的应用。通过示例和操作步骤,详细介绍了如何确定屏幕范围、识别屏幕、创建过渡和标记触发器,并阐述了UI Flow在导航识别、验证、可用性优化、测试用例开发和需求推导中的重要作用。文章还结合问答系统案例,展示了UI Flow的实际应用价值,帮助读者深入理解并有效运用这一工具提升系统用户体验。

rice5的博客 153

Hadoop(HDFS)

Hadoop是一个开源的分布式系统架构,旨在解决海量数据的存储和计算问题,Hadoop的核心组件包括Hadoop分布式文件系统(HDFS)、MapReduce编程模型和YARN资源管理器,最近需求需要用到HDFS和YARN。

weixin_42828342的博客 1738

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Hadoop】一、Apache Hadoop、 HDFS

HadoopHDFS(分布式文件存储系统):解决海量数据存储HadoopYARN(集群资源管理和任务调度框架):解决资源任务调度HadoopMapReduce(分布式计算框架):解决海量数据计算Hadoop发展简史NutchNutch的设计目标是构建一个大型的全网搜索引擎。遇到瓶颈:如何解决数十亿网页的存储和索引问题《TheGooglefilesystem》:谷歌分布式文件系统GFS。

2501_90250923的博客 1026

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Hadoop简述及HDFS集群搭建详解

目录 什么是Hadoop? Hadoop中有3个核心组件 HDFS的整体的运行机制 hdfs集群组成结构 hdfs有着文件系统共同的特征: hdfs跟普通单机文件系统的区别: hdfs的工作机制: 搭建hdfs分布式集群 安装hdfs集群的具体步骤 设置linux服务器的基础软件环境 安装hdfs集群 什么是Hadoop? 海量数据处理的一个技术(软件工具) Hadoop中有3个核心组件 1.分布式文件系统(HDFS)——实现将文件分布式存储在很多服务器上,功能是管理文件,实际

laozaoxiaowanzi的博客 2836

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Hadoop集群搭建(hdfs、yarn)

Hadoop 是 Apache 软件基金会旗下的一个开源项目,是用于处理大数据的分布式系统基础架构,被广泛应用于大数据存储、处理和分析等场景。

majunssz的博客 1570

Hadoop Hdfs常用命令

Hadoop Hdfs常用命令 概述 本文档介绍Hadoop hdfs系统的一些常用命令。 操作hdfs系统可以使用hadoop fs 也可以使用 hdfs dfs ,两者效果一样。(hadoop dfs命令已不再建议使用) 参考: http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html 常用命令 一、 hadoop fs (hdfs dfs) 文件操作 1) ls 显示目录下的所有文件或者文件夹 使用方法: hadoop fs -ls

学习 记录 总结 分享 1350

深入剖析Hadoop之HDFS的安装,HDFS中的Shell命令与分布式的搭建

HDFS 的使命就是解决海量数据存储难题,它能让存储平台的服务器无限扩展 。与之协同工作的,Yarn 是计算的资源基础,MapReduce 则用于解决计算问题,是个需要写代码的计算框架。HDFS 有本地模式、伪分布模式和全分布模式这三种运行模式。

HENANwuyanzu66的博客 1008

2、hadoop之HDFS的常用命令操作

1、基本语法 bin/hadoop fs 具体命令 或 bin/hdfs dfs 具体命令 (dfs是fs的实现类) 二者区别 hadoop fs:可以作用于除hdfs外的其他文件系统,作用范围更广。通用的文件系统命令,针对任何系统,比如本地文件、HDFS文件、HFTP文件、S3文件系统等。 (曾经还有hadoop dfs:专门针对hdfs分布式文件系统,已经不推荐使用) hdfs dfs:...

STAR GAME 1615

hadoop集群搭建HDFS、HA、 YARN

hadoop2.0已经发布了很多稳定版本,增加了很多特性,比如HDFS HA、YARN等。最新的hadoop-2.7.2又增加了YARN HA1、环境准备修改主机名、IP地址。这些在之前博客有提过就不再写了。 配置IP地址和主机名映射关系。 sudo vi /etc/hosts集群规划: 主机名 IP 安装的软件 运行的进程 spark01 1

IT小生 1万+
上一篇: Java——Pair与Tuple
下一篇: Hadoop技术栈(二)深入HDFS/YARN
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值