데이터 베이스 MySQL 튜토리얼 HBase数据迁移(3)-自己编写MapReduce Job导入数据

HBase数据迁移(3)-自己编写MapReduce Job导入数据

Jun 07, 2016 pm 04:30 PM
hbase mapreduce 데이터 쓰다 소유하다 이주하다

英文原文摘自:《HBase Administration Cookbook》??编译:ImportNew?-?陈晨 本篇文章是对数据合并的系列文章之三(共三篇),针对的情景模式就是将现有的各种类型的数据库或数据文件中的数据转入至 HBase 中。 系列之一 ???《HBase数据迁移(1)- 通过单个

英文原文摘自:《HBase Administration Cookbook》??编译:ImportNew?-?陈晨

本篇文章是对数据合并的系列文章之三(共三篇),针对的情景模式就是将现有的各种类型的数据库或数据文件中的数据转入至HBase中。

系列之一 ???《HBase数据迁移(1)- 通过单个客户端导入MySQL数据》
系列之二 ???《HBase数据迁移(1)- 使用bulk load 工具从TSV文件中导入数据》

尽管在将文本文件加载入HBaseimporttsv工具十分高效,但在许多情况下为了完全控制整个加载过程,你可能更想自己编写MapReduce?JobHBase导入数据。例如在你希望加载其他格式文件时不能使用importtsv工具。

HBase提供TableOutputFormat?用于在MapReduce?Job中向HBase的表中写入数据。你也可以使用HFileOutputFormat?类在MapReduce?Job中直接生成HBase自有格式文件HFile,之后使用上一篇(迁移2)中提到的completebulkload?工具加载至运行的HBase集群中。在本文中,我们将详细解释如何编写自己的MapReduce?Job来加载数据。我们会先介绍如何使用TableOutputFormat,在更多章节中介绍在MapReduce?Job中直接生成HBase自有格式文件HFile

准备

我们本文中使用?“美国国家海洋和大气管理局?1981-2010气候平均值”的公共数据集合。访问http://www1.ncdc.noaa.gov/pub/data/normals/1981-2010/。?在目录?products?|?hourly?下的小时温度数据(可以在上述链接页面中找到)。下载hly-temp-normal.txt文件。对于下载的数据文件无需进行格式处理,我们将使用MapReduce直接读取原始数据。

我们假设您的环境已经可以在HBase上运行MapReduce。若还不行,你可以参考一下之前的文章(迁移1、迁移2)。

如何实施

1.将原始数据从本地文件系统拷贝进HDFS

hac@client1$ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hac/input/2-3
hac@client1$ $HADOOP_HOME/bin/hadoop fs -copyFromLocal hly-temp-normal.tsv /user/hac/input/2-3
로그인 후 복사

2.编辑客户端服务器上的hadoop-env.sh文件,将HBaseJAR文件加入Hadoop的环境变量中:

hadoop@client1$ vi $HADOOP_HOME/conf/hadoop-env.sh
export HADOOP_CLASSPATH=/usr/local/hbase/current/hbase-0.92.1.jar
로그인 후 복사

3.编写MapReduceJava代码并且打包为JAR文件。Java源码如下:

$ vi Recipe3.java
로그인 후 복사
로그인 후 복사
public class Recipe3 {
public static Job createSubmittableJob
(Configuration conf, String[] args)
throws IOException {
String tableName = args[0];
Path inputDir = new Path(args[1]);
Job job = new Job (conf, "hac_chapter2_recipe3");
job.setJarByClass(HourlyImporter.class);
FileInputFormat.setInputPaths(job, inputDir);
job.setInputFormatClass(TextInputFormat.class);
job.setMapperClass(HourlyImporter.class);
// ++++ insert into table directly using TableOutputFormat ++++
// ++++ 使用TableOutputFormat 直接插入表中++++
TableMapReduceUtil.initTableReducerJob(tableName, null, job);
job.setNumReduceTasks(0);
TableMapReduceUtil.addDependencyJars(job);
return job;
}
public static void main(String[] args)
throws Exception {
Configuration conf =
HBaseConfiguration.create();
Job job = createSubmittableJob(conf, args);
System.exit (job.waitForCompletion(true) ? 0 : 1);
}
}
로그인 후 복사

4.Recipe3.java中添加一个内部类。作为MapReduce?Jobmapper类:

$ vi Recipe3.java
로그인 후 복사
로그인 후 복사
static class HourlyImporter extends
Mapper<longwritable text immutablebyteswritable put> {
private long ts;
static byte[] family = Bytes.toBytes("n");
@Override
protected void setup(Context context) {
ts = System.currentTimeMillis();
}
@Override
public void map(LongWritable offset, Text value, Context
context)throws IOException {
try {
String line = value.toString();
String stationID = line.substring(0, 11);
String month = line.substring(12, 14);
String day = line.substring(15, 17);
String rowkey = stationID + month + day;
byte[] bRowKey = Bytes.toBytes(rowkey);
ImmutableBytesWritable rowKey =  new ImmutableBytesWritable(bRowKey);
Put p = new Put(bRowKey);
for (int i = 1; i 
<p>5.<span style="font-family: 宋体;">为了能够运行</span><span style="font-family: 'Times New Roman';">MapReduce?Job</span><span style="font-family: 宋体;">需要将源码打包为</span><span style="font-family: 'Times New Roman';">JAR</span><span style="font-family: 宋体;">文件,并且从客户端使用</span><span style="font-family: 'Times New Roman';">hadoop?jar</span><span style="font-family: 宋体;">命令:</span></p>
<pre class="brush:php;toolbar:false">hac@client1$ $HADOOP_HOME/bin/hadoop jar hac-chapter2.jar hac.
chapter2.Recipe3 \
hly_temp \
/user/hac/input/2-3
로그인 후 복사

检查结果。MapReduce?job的运行结果应当显示下内容:

13/03/27 17:42:40 INFO mapred.JobClient:   Map-Reduce Framework
13/03/27 17:42:40 INFO mapred.JobClient:     Map input records=95630
13/03/27 17:42:40 INFO mapred.JobClient:     Physical memory (bytes) snapshot=239820800
13/03/27 17:42:40 INFO mapred.JobClient:     Spilled Records=0
13/03/27 17:42:40 INFO mapred.JobClient:     CPU time spent (ms)=124530
13/03/27 17:42:40 INFO mapred.JobClient:     Total committed heap usage (bytes)=130220032
13/03/27 17:42:40 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=1132621824
13/03/27 17:42:40 INFO mapred.JobClient:     Map input bytes=69176670
13/03/27 17:42:40 INFO mapred.JobClient:     Map output records=95630
13/03/27 17:42:40 INFO mapred.JobClient:     SPLIT_RAW_BYTES=118
로그인 후 복사

Map的输入记录数应当与输入路径下的文件内容总行数相同。Map输出记录数应当与输入记录数相同(本文中)。你能够在HBase中使用?count/scan命令来验证上述结果

运行原理

为了运行MapReduce?Job,我们首先在createSubmittableJob()方法中构建一个Job实例。实例建立后,我们对其设置了输入路径,输入格式以及mapper类。之后,我们调用了TableMapReduceUtil.initTableReducerJob()?job进行适当配置。包括,加入HBase配置,设置TableOutputFormat,以及job运行需要的一些依赖的添加。在HBase上编写MapReduce程序时,TableMapReduceUtil?是一个很有用的工具类。

主函数中调用?job.waitForCompletion()?能够将Job提交到MapReduce框架中,直到运行完成才退出。运行的Job将会读取输入路径下的所有文件,并且将每行都传入到mapper(HourlyImporter)

map方法中,转换行数据并生成row?key,建立Put对象,通过Put.add()方法将转换后的数据添加到对应的列中。最终调用context.write()方法将数据写入HBase表中。本例中无需reduce阶段。

如你所见,编写自定义的MapReduce?Job来向HBase插入数据是很简单的。程序与直接在单台客户端使用HBase?API类似。当面对海量数据时,我们建议使用MapReduce来向HBase中导入数据。

其他

使用自定义的MapReduce?Job来向HBase加载数据在大部分情况下都是合理的。但是,如果你的数据是极大量级的,上述方案不能很好处理时。还有其他方式能够更好的处理数据合并问题。

MapReduce中生成HFile

除了直接将数据写入HBase表,我们还可以在MapReduce?Job中直接生成HBase自有格式HFile,然后使用completebulkload?工具将文件加载进集群中。这个方案将比使用TableOutputFormat?API更加节省CPU与网络资源:

1.修改Job配置。要生成HFile文件,找到createSubmittableJob()的下面两行:

TableMapReduceUtil.initTableReducerJob(tableName, null, job);
job.setNumReduceTasks(0);
로그인 후 복사

2.替换代码

HTable table = new HTable(conf, tableName);
job.setReducerClass(PutSortReducer.class);
Path outputDir = new Path(args[2]);
FileOutputFormat.setOutputPath(job, outputDir);
job.setMapOutputKeyClass(ImmutableBytesWritable.class);
job.setMapOutputValueClass(Put.class);
HFileOutputFormat.configureIncrementalLoad (job, table);
로그인 후 복사

3.在命令行添加输出地址参数。编译并打包源码,然后在运行任务的命令行添加输出地址参数:

hac@client1$ $HADOOP_HOME/bin/hadoop jar hac-chapter2.jar hac.
chapter2.Recipe3 \
hly_temp \
/user/hac/input/2-3 \
/user/hac/output/2-3
로그인 후 복사

4.完成bulk?load

hac@client1$ $HADOOP_HOME/bin/hadoop jar $HBASE_HOME/hbase-
0.92.1.jar completebulkload \
/user/hac/output/2-3 \
hly_temp
로그인 후 복사

步骤1中,我们修改了源码中的job配置。我们设置job使用由HBase提供的PutSortReducer??reduce类。这个类会在数据行写入之前对列进行整理。HFileOutputFormat.configureIncrementalLoad()?方法能够为生成HFile文件设置适当的参数。

在步骤2中的job运行完成之后,自有HFile格式文件会生成在我们指定的输出路径。文件在列族目录2-3/n之下,将会使用completebulkload?加载到HBase集群中。

MapReduce?Job执行过程中,如果你在浏览器中打开HBase的管理界面,会发现HBase没有发出任何请求。这表明这些数据不是直接写入HBase的表中。

影响数据合并的重要配置

如果你在MapReduce?Job使用TableOutputFormat?类将数据直接写入HBase表中,是一个十分繁重的写操作。尽管HBase是设计用于快速处理写操作,但下面的这些还是你可能需要调整的重要的配置:

  • JVM的堆栈和GC设置
  • 域服务器处理数量
  • ?最大的域文件数量
  • ?内存大小
  • ?更新块设置

你需要了解HBase架构的基本知识来理解这些配置如何影响HBase的写性能。以后我们会进行详细的描述。

HadoopHBase会生成若干日志。当集群中的MapReduce?Job加载数据时存在某些瓶颈或障碍时,检查日志可以给你一些提示。下面是一些比较重要的日志:

  • ?Hadoop/HBase/ZooKeeper的守护进程的GC日志
  • ?HMaster守护进程的日志

在将数据转移至HBase之前预先搭建域

HBase的每行数据都归属一个特定的域中。一个域中包含了一定范围内的排序号的HBase的数据行。域是由域服务器发布和管理的。

当我们在HBase中建立一个表后,该表会在一个单独的域启动。所有插入该表的数据都会首先进入这个域中。数据持续插入,当到达一个极限之后,域会被分为两份。称之为域的分离。分离的域会分布到其他域服务器上,以达到集群中的负载能够均衡。

如你所想,若我们能够将表初始化在预先建好的域上,使用合适的算法,数据加载的负载会在整个集群中平衡,并且加快了数据加载的速度。

我们将描述如何用预先建好的域来建立一个表。

准备

登入HBase的客户端节点

如何实施

在客户端节点上执行如下命令:

$ $HBASE_HOME/bin/hbase org.apache.hadoop.hbase.util.RegionSplitter -c 10 -f n hly_temp2
12/04/06 23:16:32 DEBUG util.RegionSplitter: Creating table hly_temp2 with 1 column families.  Presplitting to 10 regions
…
12/04/06 23:16:44 DEBUG util.RegionSplitter: Table created!  Waiting for regions to show online in META...
12/04/06 23:16:44 DEBUG util.RegionSplitter: Finished creating table with 10 regions
로그인 후 복사

运行原理

命令行调用了RegionSplitter?类,并且附带如下参数:

  • ?-c?10—用预先分割的10个域来建立这个表
  • ?-f?n—建立一个名叫n的列族
  • ?hly_temp2—?表名

在浏览器中打开HBase管理界面,在用户表中点击hly_temp2,你可以看到预先建立的10个域。

RegionSplitter?HBase提供的一个工具类。使用RegionSplitter?你可以做下面这些事情:

  • ?使用具体数量的预建域来建立一个表。
  • ?能够将一个已存在的表进行分离域。
  • ?使用自定义算法来分离域。

在上文中使用自定义MapReduce导入数据时,也许你原本认为数据写入应该是分布在集群中所有的域中,但实际不是。在管理页上可以看到,在MapReduce?Job的执行期间所有的请求都发送至相同的服务器。

这是因为默认的分离算法(MD5StringSplit)不是很适合我们的情况。我们所有的数据都发送至相同集群,因此所有的API请求都发送至域所在的域服务器中。我们需要提供自定义的算法来适当的分离域。

预分离的域也能够对生成自有格式HFile文件的的MapReduce?Job产生影响。运行上文中的MapReduce?Job,对hly_temp2表使用生成HFile文件的选项。如下图所示,你可以发现MapReduce?Jobreduce数量从原本的110了,这就是预搭建域的数量:

这是因为Jobreduce的数量是基于目标表的域数量。

reduce数量增加,通常意味加载动作分布到多个服务器上面,所以job的运行速度会更快。

英文原文摘自:《HBase Administration Cookbook》??编译:ImportNew?-?陈晨

译文链接:http://www.importnew.com/3645.html

【如需转载,请在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

ddrescue를 사용하여 Linux에서 데이터 복구 ddrescue를 사용하여 Linux에서 데이터 복구 Mar 20, 2024 pm 01:37 PM

DDREASE는 하드 드라이브, SSD, RAM 디스크, CD, DVD 및 USB 저장 장치와 같은 파일 또는 블록 장치에서 데이터를 복구하기 위한 도구입니다. 한 블록 장치에서 다른 블록 장치로 데이터를 복사하여 손상된 데이터 블록은 남겨두고 양호한 데이터 블록만 이동합니다. ddreasue는 복구 작업 중에 간섭이 필요하지 않으므로 완전히 자동화된 강력한 복구 도구입니다. 게다가 ddasue 맵 파일 덕분에 언제든지 중지하고 다시 시작할 수 있습니다. DDREASE의 다른 주요 기능은 다음과 같습니다. 복구된 데이터를 덮어쓰지 않지만 반복 복구 시 공백을 채웁니다. 그러나 도구에 명시적으로 지시된 경우에는 잘릴 수 있습니다. 여러 파일이나 블록의 데이터를 단일 파일로 복구

오픈 소스! ZoeDepth를 넘어! DepthFM: 빠르고 정확한 단안 깊이 추정! 오픈 소스! ZoeDepth를 넘어! DepthFM: 빠르고 정확한 단안 깊이 추정! Apr 03, 2024 pm 12:04 PM

0. 이 글은 어떤 내용을 담고 있나요? 우리는 다재다능하고 빠른 최첨단 생성 단안 깊이 추정 모델인 DepthFM을 제안합니다. DepthFM은 전통적인 깊이 추정 작업 외에도 깊이 인페인팅과 같은 다운스트림 작업에서 최첨단 기능을 보여줍니다. DepthFM은 효율적이며 몇 가지 추론 단계 내에서 깊이 맵을 합성할 수 있습니다. 이 작품을 함께 읽어보아요~ 1. 논문 정보 제목: DepthFM: FastMoncularDepthEstimationwithFlowMatching 저자: MingGui, JohannesS.Fischer, UlrichPrestel, PingchuanMa, Dmytr

여러 조건으로 Excel 필터 기능을 사용하는 방법 여러 조건으로 Excel 필터 기능을 사용하는 방법 Feb 26, 2024 am 10:19 AM

Excel에서 여러 기준으로 필터링을 사용하는 방법을 알아야 하는 경우 다음 자습서에서는 데이터를 효과적으로 필터링하고 정렬할 수 있는 단계를 안내합니다. Excel의 필터링 기능은 매우 강력하며 많은 양의 데이터에서 필요한 정보를 추출하는 데 도움이 될 수 있습니다. 이 기능을 사용하면 설정한 조건에 따라 데이터를 필터링하고 조건에 맞는 부분만 표시하여 데이터 관리를 더욱 효율적으로 할 수 있습니다. 필터 기능을 사용하면 대상 데이터를 빠르게 찾을 수 있어 데이터 검색 및 정리에 드는 시간을 절약할 수 있습니다. 이 기능은 단순한 데이터 목록에만 적용할 수 있는 것이 아니라, 여러 조건에 따라 필터링하여 필요한 정보를 보다 정확하게 찾을 수 있도록 도와줍니다. 전반적으로 Excel의 필터링 기능은 매우 실용적입니다.

WeChat 채팅 기록을 새 휴대폰으로 마이그레이션하는 방법 WeChat 채팅 기록을 새 휴대폰으로 마이그레이션하는 방법 Mar 26, 2024 pm 04:48 PM

1. 기존 기기에서 WeChat 앱을 열고 오른쪽 하단의 [나]를 클릭한 후 [설정] 기능을 선택한 후 [채팅]을 클릭하세요. 2. [채팅기록 이동 및 백업]을 선택하고, [이전]을 클릭한 후 장치를 이동하려는 플랫폼을 선택하세요. 3. [이전할 채팅 선택]을 클릭하거나, 좌측 하단의 [모두 선택]을 클릭하거나, 채팅 기록을 직접 선택하세요. 4. 선택한 후 오른쪽 하단의 [시작]을 클릭하여 새 기기를 사용하여 이 WeChat 계정에 로그인합니다. 5. 그런 다음 QR 코드를 스캔하여 채팅 기록 마이그레이션을 시작하세요. 사용자는 마이그레이션이 완료될 때까지 기다리면 됩니다.

Google은 열광하고 있습니다. JAX 성능이 Pytorch와 TensorFlow를 능가합니다! GPU 추론 훈련을 위한 가장 빠른 선택이 될 수 있습니다. Google은 열광하고 있습니다. JAX 성능이 Pytorch와 TensorFlow를 능가합니다! GPU 추론 훈련을 위한 가장 빠른 선택이 될 수 있습니다. Apr 01, 2024 pm 07:46 PM

Google이 추진하는 JAX의 성능은 최근 벤치마크 테스트에서 Pytorch와 TensorFlow를 능가하여 7개 지표에서 1위를 차지했습니다. 그리고 JAX 성능이 가장 좋은 TPU에서는 테스트가 이루어지지 않았습니다. 개발자들 사이에서는 여전히 Tensorflow보다 Pytorch가 더 인기가 있습니다. 그러나 앞으로는 더 큰 모델이 JAX 플랫폼을 기반으로 훈련되고 실행될 것입니다. 모델 최근 Keras 팀은 기본 PyTorch 구현을 사용하여 세 가지 백엔드(TensorFlow, JAX, PyTorch)와 TensorFlow를 사용하는 Keras2를 벤치마킹했습니다. 첫째, 그들은 주류 세트를 선택합니다.

iPhone의 느린 셀룰러 데이터 인터넷 속도: 수정 사항 iPhone의 느린 셀룰러 데이터 인터넷 속도: 수정 사항 May 03, 2024 pm 09:01 PM

지연이 발생하고 iPhone의 모바일 데이터 연결 속도가 느립니까? 일반적으로 휴대폰의 셀룰러 인터넷 강도는 지역, 셀룰러 네트워크 유형, 로밍 유형 등과 같은 여러 요소에 따라 달라집니다. 더 빠르고 안정적인 셀룰러 인터넷 연결을 얻기 위해 할 수 있는 일이 몇 가지 있습니다. 수정 1 – iPhone 강제 다시 시작 때로는 장치를 강제로 다시 시작하면 셀룰러 연결을 포함한 많은 항목이 재설정됩니다. 1단계 – 볼륨 높이기 키를 한 번 눌렀다가 놓습니다. 그런 다음 볼륨 작게 키를 눌렀다가 다시 놓습니다. 2단계 - 프로세스의 다음 부분은 오른쪽에 있는 버튼을 누르는 것입니다. iPhone이 다시 시작되도록 하세요. 셀룰러 데이터를 활성화하고 네트워크 속도를 확인하세요. 다시 확인하세요 수정 2 – 데이터 모드 변경 5G는 더 나은 네트워크 속도를 제공하지만 신호가 약할 때 더 잘 작동합니다

초지능의 생명력이 깨어난다! 하지만 자동 업데이트 AI가 등장하면서 엄마들은 더 이상 데이터 병목 현상을 걱정할 필요가 없습니다. 초지능의 생명력이 깨어난다! 하지만 자동 업데이트 AI가 등장하면서 엄마들은 더 이상 데이터 병목 현상을 걱정할 필요가 없습니다. Apr 29, 2024 pm 06:55 PM

세상은 미친 듯이 큰 모델을 만들고 있습니다. 인터넷의 데이터만으로는 충분하지 않습니다. 훈련 모델은 '헝거게임'처럼 생겼고, 전 세계 AI 연구자들은 이러한 데이터를 탐식하는 사람들에게 어떻게 먹이를 줄지 고민하고 있습니다. 이 문제는 다중 모드 작업에서 특히 두드러집니다. 아무것도 할 수 없던 시기에, 중국 인민대학교 학과의 스타트업 팀은 자체 새로운 모델을 사용하여 중국 최초로 '모델 생성 데이터 피드 자체'를 현실화했습니다. 또한 이해 측면과 생성 측면의 두 가지 접근 방식으로 양측 모두 고품질의 다중 모드 새로운 데이터를 생성하고 모델 자체에 데이터 피드백을 제공할 수 있습니다. 모델이란 무엇입니까? Awaker 1.0은 중관촌 포럼에 최근 등장한 대형 멀티모달 모델입니다. 팀은 누구입니까? 소폰 엔진. 런민대학교 힐하우스 인공지능대학원 박사과정 학생인 Gao Yizhao가 설립했습니다.

공장에서 일하는 테슬라 로봇, 머스크 : 올해 손의 자유도가 22도에 달할 것! 공장에서 일하는 테슬라 로봇, 머스크 : 올해 손의 자유도가 22도에 달할 것! May 06, 2024 pm 04:13 PM

테슬라의 로봇 옵티머스(Optimus)의 최신 영상이 공개됐는데, 이미 공장에서 작동이 가능한 상태다. 정상 속도에서는 배터리(테슬라의 4680 배터리)를 다음과 같이 분류합니다. 공식은 또한 20배 속도로 보이는 모습을 공개했습니다. 작은 "워크스테이션"에서 따고 따고 따고 : 이번에 출시됩니다. 영상에는 옵티머스가 공장에서 이 작업을 전 과정에 걸쳐 사람의 개입 없이 완전히 자율적으로 완료하는 모습이 담겨 있습니다. 그리고 Optimus의 관점에서 보면 자동 오류 수정에 중점을 두고 구부러진 배터리를 집어 넣을 수도 있습니다. NVIDIA 과학자 Jim Fan은 Optimus의 손에 대해 높은 평가를 했습니다. Optimus의 손은 세계의 다섯 손가락 로봇 중 하나입니다. 가장 능숙합니다. 손은 촉각적일 뿐만 아니라

See all articles